java文件解密:IllegalBlockSizeException:解密中的最后一个块未完成
我知道有人问过类似的问题,但我无法解决其中任何一个问题
我有一个加密文件,它是用以下Unix命令创建的:
tar cf FILES | gzip | openssl enc -k PASSWORD -aes-256-cbc -e > OUTPUT.tar.gz.enc
我可以用相关的命令成功地解密文件
我必须用Java程序解密这个文件。我使用了this SO answer中的代码
我使用的是相同的^{main
函数略有不同
这是我加载加密文件的方式:
byte[] headerSaltAndCipherText = IOUtils.toByteArray(new
InputStreamReader(new FileInputStream(f)));
在示例代码中,数据似乎是用base64编码的。然而,当我阅读我的文件时,它不是(我可以清楚地看到“Salted__;”标题)
我通过以下方式创建了easCBC
对象:
Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
我在main
函数的顶部添加了Security.addProvider(new BouncyCastleProvider());
。我开始使用BouncyCastle,因为我被卡住了,但它没有改变任何事情
我也试过PKCS7Padding
和NoPadding
但没有运气
我发现的常见问题是使用了错误的填充或未正确编码/加载加密数据
由于我没有像示例中那样做,我想答案是第二种解决方案:我尝试像示例中那样加载文件,但我有一个例外java.nio.charset.MalformedInputException: Input length = 1
,而且无论如何,我不能使用JDK 1.7中的功能
我做错了什么
# 1 楼答案
如果输入文件不是字符数据(即Base64编码),则不应使用
InputStreamReader
,只需直接从FileInputStream
读取字节即可。如果输入是Base64编码的,则需要将其作为字符数据读入,并使用Base64解码器将其转换为字节[]对于填充,OpenSSL
enc
命令使用pkcs5p添加块密码另一个问题可能是如何生成关键材料和初始化向量。你必须像OpenSSL一样,输入密码
最后(尽管您似乎还没有接触到这一点),如果您使用的是Oracle Java运行时环境或JDK,那么为了使用AES256,您必须为JRE安装JCE Unlimited Strength策略文件