在ruby中,如何使用PKCS5填充进行DES加密

时间:2017-08-22 10:26:37

标签: python ruby openssl 3des

我正在尝试将一些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的。我应该选择哪种算法?

1 个答案:

答案 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')