仅提供密钥的Java中的Openssl -aes-256-cbc

时间:2018-12-14 04:56:15

标签: java encryption openssl

当我使用命令行工具openssl解密文件时,以下命令可以。 我没有有关加密的任何信息,客户端仅提供以下命令和密钥。

openssl enc -d -aes-256-cbc -in 8MP_2018_12_12.gz.enc -out 8MP_2018_12_12.gz.enc.gz -pass file:pass.txt

我已经检查了stackoverflow中的很多问题,测试并运行了很多程序。因为我只提供了密钥,所以不能使用ivparameterspec

在pass.txt中,有一个提供的密钥

xxxxxxx12354125222sdsf <- example

我的程序

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.apache.commons.ssl.OpenSSL;

public class OpenSSLTest {
    public static void main(String[] args) throws Exception {
        File inputFile = new File("D:\\temp\\8MP_2018_12_12.gz.enc");
        File outputFile = new File("D:\\temp\\8MP_2018_12_12.gz");
        FileInputStream inputStream = new FileInputStream(inputFile);

        InputStream in = OpenSSL.decrypt("aes-256-cbc", "xxxxxxx12354125222sdsf".toCharArray(), inputStream);
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        IOUtils.copy(in, outputStream);
        outputStream.flush();
        outputStream.close();
        in.close();
    }
}

运行上述程序时,我收到以下消息

Exception in thread "main" java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
    at javax.crypto.Cipher.implInit(Cipher.java:805)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    at javax.crypto.Cipher.init(Cipher.java:1396)
    at javax.crypto.Cipher.init(Cipher.java:1327)
    at org.apache.commons.ssl.PKCS8Key.generateCipher(PKCS8Key.java:420)
    at org.apache.commons.ssl.OpenSSL.decrypt(OpenSSL.java:165)
    at OpenSSLTest.main(OpenSSLTest.java:15)

我已经尝试根据Java Security: Illegal key size or default parameters?

解决该问题

我已经下载了jce_policy-8.zip。我已经将local_policy.jarUS_export_policy.jar放入我的....\jre1.8.0_66\lib\security目录中。

我仍然收到上述错误消息。我的JDK版本是jdk1.8.0_66。

1 个答案:

答案 0 :(得分:1)

您从pass.txt获得的“键”字符串为22个字符。当OpenSSL使用“密码”派生密钥时,它将使用EVP_BytesToKey algorithm确定要使用的实际(在这种情况下为AES)密钥。该密钥必须为16、24或32个字节(分别为128、192或256位)。

我不知道您正在使用的库如何从提供的密码中派生密钥,但是它似乎无法正确执行此操作,或者如果是,则此JVM实例中未启用256位密钥。要检查的一件事是,除非您重命名了jre目录,否则目录路径实际上应该看起来像jdk_1.8.0_66\jre\lib\security。您可以使用以下代码段来测试可用的密钥长度:

if (Cipher.getMaxAllowedKeyLength("AES") > 128) {
    System.out.println("All key lengths supported");
} else {
    System.out.println("Only 128 bit keys supported");
}