有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,因为我被卡住了,但它没有改变任何事情

我也试过PKCS7PaddingNoPadding但没有运气

我发现的常见问题是使用了错误的填充或未正确编码/加载加密数据

由于我没有像示例中那样做,我想答案是第二种解决方案:我尝试像示例中那样加载文件,但我有一个例外java.nio.charset.MalformedInputException: Input length = 1,而且无论如何,我不能使用JDK 1.7中的功能

我做错了什么


共 (1) 个答案

  1. # 1 楼答案

    如果输入文件不是字符数据(即Base64编码),则不应使用InputStreamReader,只需直接从FileInputStream读取字节即可。如果输入是Base64编码的,则需要将其作为字符数据读入,并使用Base64解码器将其转换为字节[]

    对于填充,OpenSSL enc命令使用pkcs5p添加块密码

    另一个问题可能是如何生成关键材料和初始化向量。你必须像OpenSSL一样,输入密码

    最后(尽管您似乎还没有接触到这一点),如果您使用的是Oracle Java运行时环境或JDK,那么为了使用AES256,您必须为JRE安装JCE Unlimited Strength策略文件