Java-BouncyCastle-文件的3DES加密和解密:往返后文件损坏

时间:2018-10-16 03:49:19

标签: java encryption bouncycastle 3des

我正在尝试使用BouncyCastle 3DES加密和解密文件。但是文件在加密和解密后已损坏。例如,简单的文本文件或jpg图像文件。这是我的代码:

ZipUnzipBouncyCastle()
{
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}


public void encrypt3DES(String password, String file)
        throws IOException, DataLengthException, IllegalStateException,
        InvalidCipherTextException, NoSuchAlgorithmException
{
    byte[] data = Files.readAllBytes(new File(file).toPath());

    SecureRandom random = new SecureRandom(data);
    KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
    keyGenerator.init(168, random);
    SecretKey secreteKey = keyGenerator.generateKey();

    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(
            new CBCBlockCipher(new DESedeEngine()));

    cipher.init(true, new KeyParameter(secreteKey.getEncoded()));

    byte[] result = new byte[cipher.getOutputSize(data.length)];
    int tam = cipher.processBytes(data, 0, data.length, result, 0);
    cipher.doFinal(result, tam);

    byte[] encodedData = Base64.getEncoder().encode(result);

    FileOutputStream fileOutputStream = new FileOutputStream(file);
    fileOutputStream.write(encodedData);
    fileOutputStream.flush();
    fileOutputStream.close();
}

public void decrypt3DES(String password, String file)
        throws NoSuchAlgorithmException, DataLengthException,
        IllegalStateException, InvalidCipherTextException, IOException
{
    byte[] data = Files.readAllBytes(new File(file).toPath());

    byte[] decodedData = Base64.getDecoder().decode(data);

    SecureRandom random = new SecureRandom(decodedData);
    KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
    keyGenerator.init(168, random);
    SecretKey secreteKey = keyGenerator.generateKey();

    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(
            new CBCBlockCipher(new DESedeEngine()));

    cipher.init(true, new KeyParameter(secreteKey.getEncoded()));
    byte[] result = new byte[cipher.getOutputSize(decodedData.length)];
    int tam = cipher.processBytes(decodedData, 0, decodedData.length, result, 0);
    cipher.doFinal(result, tam);

    FileOutputStream fileOutputStream = new FileOutputStream(file);
    fileOutputStream.write(result);
    fileOutputStream.flush();
    fileOutputStream.close();
}

我在Internet上四处张望,但找不到任何解释。我究竟做错了什么?

0 个答案:

没有答案