我有一个 bash 脚本,它使用 openssl 加密数据,并使用 Java 代码解密结果。根据我之前的post https://stackoverflow.com/questions/8343894/aes-encrypt-with-openssl-command-line-tool-and-decrypt-in-java/8352010#8352010,我现在可以在 openssl 中输入密码,并将生成的 key/iv 复制到 Java 中。这依赖于在 openssl 中使用 -nosalt 选项。我想删除该选项,并从 openssl 获取密码/salt/iv 并将其传递给 JDK 密钥派生函数。
这是我正在使用的 openssl 脚本:
#!/bin/bash
openssl enc -aes-128-cbc -in test -out test.enc -p
当我运行它并输入密码时,它会打印出以下内容。
salt=820E005048F1DF74
key=16023FBEB58DF4EB36229286419F4589
iv=DE46F8904224A0E86E8F8F08F03BCC1A
当我在 Java 中尝试相同的密码/salt/iv 时,我无法解密 test.enc。我根据@erickson的答案尝试了Java代码post https://stackoverflow.com/questions/992019/java-256bit-aes-encryption。这是片段。
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 1024, 128);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
如果我打印生成的“秘密”,它与 openssl 打印的“密钥”不同。我是否需要更改 Java 参数之一以匹配 openssl 派生其密钥的方式?