Java相当于C ++加密
我有以下用于加密的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(const_cast(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,只是要求相应的包或类将执行相同的操作。
您要转换的代码使用openssl库。 它使用初始向量执行三重DES加密。 你需要了解的第一件事就是它正在做什么(最好是为什么)。
不幸的是,openssl文档并不是非常彻底(见这里 )……虽然O’Reilley预订的网络安全与OpenSSL相比要好一些(但它有点过时了)。
一旦你知道需要做什么,你就不应该使用标准的javax.crypto包在Java中编码它。
最棘手的部分是EVP_BytesToKey部分,它之前已经重新创建过。
如何用使用AES的openssl命令加密的Java解密文件?
如果您真的不喜欢使用类似C的代码,那么我还有一个面向对象的版本。 对于SHA-1,使用SHA-1而不是MD5 …
至于加密,只需使用"DESede/CBC/PKCS5Padding"
作为Cipher.getInstance()
方法的算法名称,你应该没问题。
使用的加密是具有密码块链接的 Triple DES
RSA页面: 来源
加密标识符,表示3DES EDE CBC对称密码。
看起来EVP_CIPHER_CTX
是包含加密(类似于对象)的“上下文”结构,但实际使用的密码是EVP_des_ede3_cbc
– 与OpenSSL.encrypt(…)
和朋友一起使用“des-ede3-cbc”
编辑:要回答问题(“相应的包”),通常你应该使用javax.crypto
或(可能“更好”用于大多数目的) bouncycastle
(http://www.bouncycastle.org/)。 但OpenSSL绑定也存在 – 只是难以使用和部署。