【问题标题】:Triple DES in Ruby by using existing Python code使用现有 Python 代码在 Ruby 中进行三重 DES
【发布时间】: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


【解决方案1】:

您的 Python 代码使用 2-key(或“Keying option 2”)三重 DES(因为您使用 MD5 哈希的 128 位结果作为密钥)。要在 Ruby 中获得相同的结果,您需要将密码指定为 des-ede-ecb

在 Python 代码中,您使用密钥的 MD5 哈希值作为密钥。所以在你的Ruby中你不需要pkcs5_keyivgen,直接使用这个哈希结果作为key。还要确保使用实际的哈希摘要,不是十六进制表示。

结合这两个问题:

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

请注意,实际上您可能应该使用 PBKDF2 之类的东西,这只是为了复制您在 Python 中已有的内容。 (理想情况下,您还应该从三重 DES 转移到 AES 之类的东西,当然应该使用与 ECB 不同的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多