2017-03-21 10 views
0

파이썬에서 루비로 변환하는 과정에서 기존 파이썬 코드를 다시 루비에 작성해야합니다. 파이썬의 암호화 코드는 다음과 같습니다.기존 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 

그러나이 루비 구현은 파이썬과 동일한 결과를 제공하지 않습니다.

곧 해결할 수있는 도움이 될 수 있습니까?

+2

내가 실수하지 않았다면 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

+0

우리가 소금을 PKCS5을 변경,하지만 여전히 ** 데프 get_key (통과) 한 =에는 OpenSSL :: Random.random_bytes (32) ITER = 20000 있는 key_len = 32 키 = OpenSSL을 :: PKCS5.pbkdf2_hmac_sha1이 (통과, 소금, iter, key_len) 끝 **하지만 여전히 행운은 없습니다. – Feroz

답변

3

파이썬 코드는 MD5 해시의 128 비트 결과를 키로 사용하므로 2 키 (또는 "키잉 옵션 2") 트리플 DES를 사용합니다. Ruby에서 같은 것을 얻으려면 암호를 des-ede-ecb으로 지정해야합니다.

파이썬 코드에서 암호의 MD5 해시를 키로 사용합니다. 따라서 Ruby에서는 pkcs5_keyivgen이 필요하지 않습니다.이 해시 결과를 직접 키로 사용하십시오. 또한 실제 해시 다이제스트 인 이 아니며이 아닌 16 진수 표현을 사용해야합니다.

이 두 가지 문제를 결합 : 현실에서 당신은 아마 PBKDF2 같은 것을 사용한다고

def triple_des_xml_payload(data) 
    # Note: digest not hexdigest 
    key = Digest::MD5.digest(@private_key) # Create a md5 Hash 
    # Just use OpenSSL::Cipher, not OpenSSL::Cipher::Cipher 
    cipher = OpenSSL::Cipher.new('des-ede-ecb') 
    cipher.encrypt 
    # Specify the key (no need for pkcs5_keyivgen) 
    cipher.key = key 

    output = cipher.update(data) 
    output << cipher.final 

    encrypted_xml = Base64.encode64(output) 

    return encrypted_xml 
end 

참고, 이것은 당신이 이미 파이썬에서 무엇을 복제하는 것입니다. (이상적으로는 트리플 DES에서 AES와 같은 것으로 전환해야하며 ECB와는 다른 모드를 사용해야합니다.)