无法使用对称密钥java

时间:2018-06-15 01:33:36

标签: java encryption

我提供了两个文件 encrypted_key.enc encrypted_data.csv.enc 。我需要使用我的私钥解密 encrypted_key.enc 以获取对称密钥,然后使用该对称密钥解密 encrypted_data.csv.enc 文件。

在终端上,以下命令完成工作:

openssl rsautl -decrypt -ssl -inkey my_private_key -in encrypted_key.enc -out key

openssl aes-256-cbc -d -in encrypted_data.csv.enc -out secret.txt -pass file:key

我的目标是执行两个命令的java等价物。我能够成功解密第一个文件并检索对称密钥。

现在我无法使用该对称密钥来解密csv文件。我的问题出现在decipher.init(Cipher.DECRYPT_MODE, keySpec);我收到以下stacktrace

线程中的异常" main" java.security.InvalidKeyException:非法密钥大小或默认参数

我不清楚我在解密过程中究竟缺少了什么。我尝试过更换密码提供商,但这并没有帮助。其他帖子使用IVParameterSpec发布了解决方案,但我的解密案例似乎不需要它,或者我对它放在哪里感到困惑。

    File file = new File("my_private_key");
    PrivateKey pk = getPrivateKey(file);

    // Decrypt secret key
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pk);
    File skFile = new File("encrypted_key.enc");
    FileInputStream fileInputStream = new FileInputStream(skFile);
    byte[] decodedBytes = IOUtils.toByteArray(fileInputStream);
    byte[] original = cipher.doFinal(decodedBytes);
    String decodedOriginal = new String(Base64.encodeBase64(original));
    System.out.println(decodedOriginal);

    // Use the secret key for decrypting file
    File csvFile =
            new File(
                    "encrypted_data.csv.enc");
    FileInputStream csvIS = new FileInputStream(csvFile);
    Cipher decipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKeySpec keySpec = new SecretKeySpec(original, "AES");

    decipher.init(Cipher.DECRYPT_MODE, keySpec);

    byte[] csvOriginal = decipher.doFinal(IOUtils.toByteArray(csvIS));
    String csvContents = new String(csvOriginal);
    System.out.println(csvContents);

1 个答案:

答案 0 :(得分:1)

在Java 1.8之前(我认为,在那里的某处),对于128位以上的密钥大小,您受限于Java Unlimited Strength Policy。这是异常的最可能原因。

不幸的是,这不会修复您的代码。带有openssl标志的pass使用名为EVP_BytesToKey()的不安全KDF。 Java本身不支持此KDF。你不想使用它,因为它是不安全的。更新上游代码以使用更好的KDF,如PBKDF2。 Java中有本机支持。

此外,您在Java中使用openssl和ECB模式的CBC模式。而且你没有在openssl中指定IV。我得到的印象是你自己没有编写Java代码。您可以从花时间学习和研究代码和正在执行的命令中实际发生的事情中获益,并且您可能更有能力解决问题。