【发布时间】:2017-03-21 13:32:51
【问题描述】:
作为我们从 python 到 ruby 转换的一部分,我们需要将现有的 python 代码重新编写为 ruby。 python中的加密代码如下。
import md5;
from pyDes import *
PrivateKey = 'secret';
XmlToEncrypt = 'Hello';
#Generate an MD5Hash on the Private key
m = md5.new(PrivateKey);
#create a 16 byte string
key = m.digest();
#setup the Triple DES class from pyDes
payloadEncrypt = triple_des(key, ECB, '\0\0\0\0\0\0\0\0', pad=None, padmode=PAD_PKCS5);
#Encrypt the xml Payload
EncryptedXML = payloadEncrypt.encrypt(XmlToEncrypt).encode('base64');
#Finally convert to base64, this string will be used in creating the HMAC signature
EncryptedXMLString = EncryptedXML.encode('base64');
print "Encrypted: " + EncryptedXML;
我们尝试实现如下。
def triple_des_xml_payload(data)
# Get xml payload data and apply triple-des algorithm on it and convert it to base64
md5 = Digest::MD5.hexdigest(@private_key) # Create a md5 Hash
cipher = OpenSSL::Cipher::Cipher.new('DES-ECB')
cipher.encrypt
cipher.pkcs5_keyivgen(md5)
output = cipher.update(data)
output << cipher.final
encrypted_xml = Base64.encode64(output)
puts encrypted_xml
return encrypted_xml
end
但是这个 ruby 实现并没有给出与 python 相同的结果。
我们能否尽快得到一些帮助来解决这个问题。
【问题讨论】:
-
如果我没记错的话,Ruby OpenSSL 包装器使用
3DES来命名三重DES。操作模式似乎相同,但请确保您也使用相同的密钥大小。您可以在密码名称中指定它。另外,建议使用OpenSSL::PKCS5,而不是cipher.pkcs5_keyivgen。 -
我们更改了 PKCS5,但仍然 def get_key(pass) salt = OpenSSL::Random.random_bytes(32) iter = 20000 key_len = 32 key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass , salt, iter, key_len) end 但还是没有运气
标签: python ruby encryption cryptography tripledes