java中的openssl des3解密

java中的openssl des3解密,java,Java,有没有一种方法可以解密使用 openssl-des3enc命令。 openssl到底是如何使用密码和salt来生成密钥的 OpenSSL的enc实用程序对密码使用非标准(低质量)密钥派生算法。下面的代码显示了enc实用程序如何在给定salt和密码的情况下生成密钥和初始化向量。请注意,enc在指定了-salt选项(这对安全性至关重要)时,将“salt”值存储在加密文件中 公共InputStream解密(InputStream为,字节[]密码) 抛出GeneralSecurityException,

有没有一种方法可以解密使用 openssl-des3enc命令。
openssl到底是如何使用密码和salt来生成密钥的

OpenSSL的
enc
实用程序对密码使用非标准(低质量)密钥派生算法。下面的代码显示了
enc
实用程序如何在给定salt和密码的情况下生成密钥和初始化向量。请注意,
enc
在指定了
-salt
选项(这对安全性至关重要)时,将“salt”值存储在加密文件中

公共InputStream解密(InputStream为,字节[]密码)
抛出GeneralSecurityException,IOException
{
/*解析流中的“salt”值*/
字节[]头=新字节[16];
对于(int idx=0;idx
enc
命令使用
1
作为迭代
count
(这是一个坏主意,在我的
enc
版本的手册页中作为一个bug被指出),MD5作为摘要算法(一个“坏”的算法)

目前尚不清楚OpenSSL如何将文本密码转换为字节。我猜它使用默认的平台字符编码。因此,如果您一直使用
字符串
密码(不好,因为它不能“零化”),您可以调用将其转换为
字节[]


如果可以,可以使用Java6或Swing之类的工具获取密码。这些将返回一个数组,因此您可以在使用完密码后从内存中“删除”密码:

谢谢您,Erickson,谢谢您的帖子。它极大地帮助了我重新创建openssl的密钥密码和IV例程

我最终得到了一些稍微不同的东西,可能是因为我需要解密河豚加密的数据,而不是DES。见下文

我还发现openssl在遇到字节00、0a或0d时会停止读取密码。通常我认为openssl只读取字节11到127之间的密码字符。因此,对于下面的示例,我在前面有一段代码,如果密码包含00、0a或0d,它会截断密码

     /* Compute the key and IV with OpenSSL's non-standard method. */
     final byte[] digest = new byte[32];
     final MessageDigest md5 = MessageDigest.getInstance("MD5");
     md5.update(password, 0);
     // append the salt
     md5.update(salt);
     // run the digest and output 16 bytes to the first 16 bytes to the digest array. Digest is reset
     md5.digest(digest, 0, 16);
     // write the first 16 bytes from the digest array back to the buffer
     md5.update(digest, 0, 16);
     // append the password
     md5.update(password, 0);
     // append the salt
     md5.update(salt);
     // run the digest and output 16 bytes to the last 16 bytes of the digest array
     md5.digest(digest, 16, 16);
     key = Arrays.copyOfRange(digest, 0, 16);
     iv = Arrays.copyOfRange(digest, 16, 24);
使用org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator可以将上述代码替换为3行。它变成

final OpenSSLPBEParametersGenerator generator = new OpenSSLPBEParametersGenerator();
generator.init(password, salt);
final ParametersWithIV ivParam = (ParametersWithIV)generator.generateDerivedParameters(16, 8);
final KeyParameter keyParameter = (KeyParameter)ivParam.getParameters();
final OpenSSLPBEParametersGenerator generator = new OpenSSLPBEParametersGenerator();
generator.init(password, salt);
final ParametersWithIV ivParam = (ParametersWithIV)generator.generateDerivedParameters(16, 8);
final KeyParameter keyParameter = (KeyParameter)ivParam.getParameters();