0

我有以下用于加密的 c++ 代码片段:

EVP_CIPHER_CTX ctx;
const EVP_CIPHER * cipher = EVP_des_ede3_cbc();
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char key[EVP_MAX_KEY_LENGTH];
String seed;

_config->get_value("crypto_seed", &seed); // uses the seed value from pimp config.

if (seed.is_empty())
{
    return false;
}

EVP_BytesToKey(cipher, EVP_sha1(),
        (unsigned char *) 0, // no salt
        reinterpret_cast<unsigned char *>(const_cast<char *>(seed.chars())), seed.length(),
        1, // hash passphrase just once.
        key, iv);

EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, cipher, (ENGINE *) 0, key,
        iv,
        1); // encrypt

java中c++加密的等价物是什么?

我看到有des算法,然后我看到了sha1

这与 openssl 加密有关。但不确定什么是等价的。本质上,我想要与 c++ 代码生成的输出相同。

我问EVP_CIPHER_CTX这里使用的加密的等价物或名称是什么,所以我可以从那里拿走它。

编辑:不要求任何人将代码转换为java,只要求相应的包或类会做同样的事情。

4

4 回答 4

2

其中最棘手的部分是之前重新创建的 EVP_BytesToKey 部分。

如何使用 AES 解密用 openssl 命令加密的 Java 文件?

如果你真的不习惯使用类似 C 的代码,我也有一个面向对象的版本。对于 SHA-1,使用 SHA-1 而不是 MD5...

至于加密,只需"DESede/CBC/PKCS5Padding"用作您的方法的算法名称,就Cipher.getInstance()可以了。

于 2012-10-16T21:38:34.077 回答
0

正在使用的加密是带有密码块链接的三重 DES

RSA 页面:来源

表示 3DES EDE CBC 对称密码的密码标识符。

于 2012-10-16T18:07:35.840 回答
0

看起来EVP_CIPHER_CTX是包含加密的“上下文”结构(类似于对象),但实际使用的密码是-与朋友一起EVP_des_ede3_cbc使用“des-ede3-cbc”OpenSSL.encrypt(…)

编辑:要回答这个问题(“相应的包”),通常你应该使用javax.crypto或(对于大多数目的可能是“更好”)bouncycastle(http://www.bouncycastle.org/)。但是 OpenSSL 绑定也确实存在——只是使用和部署很尴尬。

于 2012-10-16T18:08:28.310 回答
0

您要转换的代码使用 openssl 库。它使用初始向量执行三重 DES 加密。您需要了解的第一件事就是它在做什么(最好是为什么)。

不幸的是,openssl 文档并不是非常彻底(请参见此处)……尽管 O'Reilley 的书Network Security with OpenSSL要好得多(不过有点过时了)。

一旦您知道需要做什么,使用标准 javax.crypto 包在 Java 中对其进行编码应该不会有太大困难。

于 2012-10-16T18:22:25.103 回答