파이썬에서 루비로 변환하는 과정에서 기존 파이썬 코드를 다시 루비에 작성해야합니다. 파이썬의 암호화 코드는 다음과 같습니다.기존 Python 코드를 사용하여 Ruby에서 트리플 DES
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 OpenSSL wrapper는 3DES를 사용하여 트리플 DES로 이름을 지정합니다. 작동 모드는 동일하지만 동일한 키 크기를 사용하고 있는지 확인하십시오. 암호의 이름으로 지정할 수 있습니다. 또한 [cipher] 대신 ['OpenSSL :: PKCS5'] (https://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/PKCS5.html)을 사용하는 것이 좋습니다. pkcs5_keyivgen'] (https://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html#pkcs5_keyivgen-method). – Uzbekjon
우리가 소금을 PKCS5을 변경,하지만 여전히 ** 데프 get_key (통과) 한 =에는 OpenSSL :: Random.random_bytes (32) ITER = 20000 있는 key_len = 32 키 = OpenSSL을 :: PKCS5.pbkdf2_hmac_sha1이 (통과, 소금, iter, key_len) 끝 **하지만 여전히 행운은 없습니다. – Feroz