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

In ruby, how to do a DES encryption with PKCS5 padding

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

这里有两个问题。首先,不要使用 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')