文件解密:IllegalBlockSizeException:解密时最后一个块不完整

时间:2013-10-10 13:49:34

标签: java encryption aes

我知道已经提出了类似的问题,但我无法解决他们中的任何问题。

我有一个加密文件,它是用以下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,因为我被卡住但它并没有改变一件事。

我也试过mainPKCS7Padding,但没有运气。

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

由于我没有完全按照示例进行操作,我猜答案是第二个解决方案:我尝试加载文件,如示例中所示,但我有NoPadding这个例外,无论如何,我可以&#39 ; t使用JDK 1.7中的功能。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

对于填充,OpenSSL enc命令将PKCS5PADDING用于分组密码。

另一个问题可能是您如何生成密钥材料和初始化向量。您必须以与OpenSSL给出输入密码相同的方式执行此操作。

最后(虽然看起来你还没有参与其中)如果你使用的是Oracle Java Runtime Environment或JDK,你必须为你的JRE安装JCE Unlimited Strength策略文件才能使用AES256