我知道有人问过类似的问题,但我无法解决其中任何一个问题。
我有一个使用以下 Unix 命令创建的加密文件:
tar cf FILES | gzip | openssl enc -k PASSWORD -aes-256-cbc -e > OUTPUT.tar.gz.enc
我可以使用关联的命令成功解密文件。
我必须在 Java 进程中解密这个文件。我使用了这个 SO answer中提供的代码。
我正在使用相同的EVP_BytesToKey
功能,但功能略有不同main
。
这是我加载加密文件的方式:
byte[] headerSaltAndCipherText = IOUtils.toByteArray(new
InputStreamReader(new FileInputStream(f)));
在示例代码中,数据似乎是用 base64 编码的。但是,当我阅读我的文件时,它不是(我可以清楚地看到“Salted__”标题)
我以easCBC
这种方式创建了对象:
Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
我Security.addProvider(new BouncyCastleProvider());
在函数的顶部添加了main
。当我被卡住时,我开始使用 BouncyCastle,但它并没有改变任何事情。
我也尝试过PKCS7Padding
,NoPadding
但没有运气。
我发现的常见问题是使用了错误的填充或未正确编码/加载加密数据。
由于我没有完全按照示例中的操作,我猜答案是第二种解决方案:我尝试像示例中那样加载文件,但我有这个异常java.nio.charset.MalformedInputException: Input length = 1
,无论如何,我无法使用 JDK 1.7 中的功能。
我究竟做错了什么?