Java AES密钥派生函数

Java AES密钥派生函数,java,openssl,cryptography,aes,Java,Openssl,Cryptography,Aes,我有一个bash脚本,它使用openssl加密数据,还有一个Java代码对结果进行解密。基于前面的代码,我现在可以在openssl中输入密码,并将生成的key/iv复制到Java中。这依赖于在openssl中使用-nosalt选项。我想删除该选项,并从openssl获取password/salt/iv并将其传递到JDK密钥派生函数中 下面是我正在使用的openssl脚本: #!/bin/bash openssl enc -aes-128-cbc -in test -out test.enc -p

我有一个bash脚本,它使用openssl加密数据,还有一个Java代码对结果进行解密。基于前面的代码,我现在可以在openssl中输入密码,并将生成的key/iv复制到Java中。这依赖于在openssl中使用-nosalt选项。我想删除该选项,并从openssl获取password/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代码。这是片段

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派生其密钥的方式?

openssl enc使用PKCS#5 1.5或非标准密钥派生函数,具体取决于摘要(-md arg,默认情况下为MD5)。和1次迭代。KDF是EVP_BytesToKey:OpenSSL enc使用PKCS#5 1.5或非标准密钥派生函数,具体取决于摘要(-md arg,默认情况下为MD5)。和1次迭代。KDF是执行副总裁BytesToKey: