1

我知道有人问过类似的问题,但我无法解决其中任何一个问题。

我有一个使用以下 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,但它并没有改变任何事情。

我也尝试过PKCS7PaddingNoPadding但没有运气。

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

由于我没有完全按照示例中的操作,我猜答案是第二种解决方案:我尝试像示例中那样加载文件,但我有这个异常java.nio.charset.MalformedInputException: Input length = 1,无论如何,我无法使用 JDK 1.7 中的功能。

我究竟做错了什么?

4

1 回答 1

0

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

对于填充,OpenSSLenc命令使用 PKCS5PADDING 作为分组密码。

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

最后(尽管您似乎还没有遇到这种情况)如果您使用的是 Oracle Java 运行时环境或 JDK,则必须为您的 JRE 安装 JCE Unlimited Strength 策略文件才能使用 AES256。

于 2013-10-10T14:31:05.920 回答