我正在尝试将一些Python代码转换为Ruby。以下是Python代码的片段:
# -*- coding: UTF-8 -*-
import pyDes
import base64
des3Key = '1234567887654321'
iv = des3Key[0:8]
data = r'abc'
k = pyDes.triple_des(des3Key,pyDes.CBC,iv,pad=None,padmode=pyDes.PAD_PKCS5)
d = k.encrypt(data)
print base64.b64encode(d)
#q8qN6El3X8A=
我的Ruby代码:
require 'digest'
require 'openssl'
require 'base64'
data = 'abc'
key = '1234567887654321'
iv = key[0..7]
# cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3')
cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC') # or any other algorithm?
cipher.encrypt
cipher.pkcs5_keyivgen(key, iv)
output = cipher.update(data)
output << cipher.final
p Base64.encode64(output).gsub(/\n/, "")
# y7TPhjBQO78=
ruby结果不等于python的。我应该选择哪种算法?
答案 0 :(得分:2)
这里有两个问题。首先,不要使用pkcs5_keyivgen
,这是一个旧的,不推荐使用的函数,用于从密码中导出密钥和iv。您需要直接在Cipher
对象上设置这些:
cipher.key = key
cipher.iv = iv
其次,在您的Python代码中,密钥是16个字节,这意味着您正在使用两个密钥(或密钥选项2)三重DES。 Python代码根据所用密钥的长度自动确定使用哪个。在Ruby OpenSSL绑定中,您需要明确指定要使用的绑定。 des-ede3-cbc
是三个键(或键控选项1)。您需要使用des-ede-cbc
作为密码名称:
cipher = OpenSSL::Cipher.new('des-ede-cbc')