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_BytesToKey
和 openssl 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”编码的加密字节字符串