Java等效于C ++加密[重复]

Posted

技术标签:

【中文标题】Java等效于C ++加密[重复]【英文标题】:Java equivalent of C++ encryption [duplicate] 【发布时间】:2012-10-06 21:49:42 【问题描述】:

我有以下来自用于加密的 c++ 代码的 sn-p:

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,只要求相应的包或类执行相同的操作。

【问题讨论】:

你问的是如何将上面的c++转换成java?或者这是一个不同的问题? 我在问什么是 EVP_CIPHER_CTX 的等价物,或者这里使用的加密名称是什么,所以我可以从那里获取。 @DarthVader - 我有那个愚蠢的hammer badge and I can't opt-out of it。这意味着我不能在不结束问题的情况下引用潜在的重复项。如果您反对,请告诉我。 OpenSSL 1.1.0c changed the digest algorithm 用于一些内部组件。以前使用MD5,1.1.0改用SHA256。请注意,EVP_BytesToKeyopenssl enc 等命令中的更改不会影响您。 【参考方案1】:

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

How to decrypt file in Java encrypted with openssl command using AES?

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

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

【讨论】:

【参考方案2】:

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

不幸的是,openssl 文档不是很详尽(请参阅here)......虽然 O'Reilley 的书 OpenSSL 的网络安全 好一点(它有点过时了,不过)。

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

【讨论】:

【参考方案3】:

使用的加密是Triple DES 和cipher block chaining

RSA 页面:source

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

【讨论】:

【参考方案4】:

看起来EVP_CIPHER_CTX 是包含加密的“上下文”结构(类似于一个对象),但实际使用的密码是EVP_des_ede3_cbc — 这将是带有@987654323 的“des-ede3-cbc” @和朋友们

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

【讨论】:

谢谢。我也看到EVP_BytesToKey(cipher, EVP_sha1(),所以sha1也没有被使用? 看起来它正在使用它来进行密钥散列,是的。恐怕我不熟悉通过 C|C++ 解决它,但名称似乎很清楚 :-)

以上是关于Java等效于C ++加密[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中等效于在 c 编程中生成的要在 URL 查询字符串中发送的“Base64”编码的加密字节字符串

等效于 MySQL aes_encrypt() 函数的 AES 加密方法

适用于 iOS 的简化加密库

从Java调用C#代码?

DES加密解密问题 java与C 通讯

用JAVA实现了AES128加密,求用C语言解密的代码,谢谢各位大神了!