我知道已经提出了类似的问题,但我无法解决他们中的任何问题。
我有一个加密文件,它是用以下Unix命令创建的:
tar cf FILES | gzip | openssl enc -k PASSWORD -aes-256-cbc -e > OUTPUT.tar.gz.enc
我可以使用相关命令成功解密文件。
我必须在Java进程中解密此文件。我使用了this SO answer中提供的代码。
我使用相同的EVP_BytesToKey
函数,但功能略有不同{。}}。
这是我加载加密文件的方式:
main
在示例代码中,似乎数据是在base64中编码的。但是,当我读取我的文件时,它不是(我可以清楚地看到" Salted __"标题)
我用这种方式创建了byte[] headerSaltAndCipherText = IOUtils.toByteArray(new
InputStreamReader(new FileInputStream(f)));
对象:
easCBC
我在Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
函数的顶部添加了Security.addProvider(new BouncyCastleProvider());
。我开始使用BouncyCastle,因为我被卡住但它并没有改变一件事。
我也试过main
和PKCS7Padding
,但没有运气。
我发现的常见问题是使用了错误的填充behing或加密数据未正确编码/加载。
由于我没有完全按照示例进行操作,我猜答案是第二个解决方案:我尝试加载文件,如示例中所示,但我有NoPadding
这个例外,无论如何,我可以&#39 ; t使用JDK 1.7中的功能。
我做错了什么?
答案 0 :(得分:0)
如果输入文件不是字符数据(即Base64编码),则不应使用InputStreamReader
,只需直接从FileInputStream
读取字节。如果输入是Base64编码,则需要将其作为字符数据读入,并使用Base64解码器将其转换为byte []。
对于填充,OpenSSL enc
命令将PKCS5PADDING用于分组密码。
另一个问题可能是您如何生成密钥材料和初始化向量。您必须以与OpenSSL给出输入密码相同的方式执行此操作。
最后(虽然看起来你还没有参与其中)如果你使用的是Oracle Java Runtime Environment或JDK,你必须为你的JRE安装JCE Unlimited Strength策略文件才能使用AES256