Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在ruby中,如何使用PKCS5填充进行DES加密_Python_Ruby_Openssl_3des - Fatal编程技术网

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

Python 在ruby中,如何使用PKCS5填充进行DES加密,python,ruby,openssl,3des,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) pri

我正在尝试将一些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=
需要“摘要”
需要“openssl”
需要“base64”
数据='abc'
键='123456787654321'
iv=键[0..7]
#cipher=OpenSSL::cipher::cipher.new('DES-EDE3')
cipher=OpenSSL::cipher::cipher.new('DES-EDE3-CBC')#或任何其他算法?
加密
密码pkcs5_keyivgen(密钥,iv)
输出=cipher.update(数据)

输出这里有两个问题。首先,不要使用
pkcs5_keyivgen
,这是一个旧的、不推荐使用的从密码派生密钥和iv的函数。您需要直接在
密码
对象上设置这些:

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

这里有两个问题。首先,不要使用
pkcs5_keyivgen
,这是一个旧的、不推荐使用的从密码派生密钥和iv的函数。您需要直接在
密码
对象上设置这些:

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

三重DES的长度应为24字节,而不是16个字符。此外,加密密钥应该与随机噪声无法区分,这意味着它们不能仅由数字甚至字母数字组成。它们应该随机选择,可能包含任何可能的字节值。现在不要使用三重DES。它最多只能提供112位的安全性,即使您使用192位的最大密钥大小。如果使用较短的密钥大小,则仅提供56或57位的安全性。AES将更快(处理器有一个特殊的AES-NI指令集),并且使用128位的最小密钥大小将更加安全。3DES的最大密文大小也有实际限制。请参阅。IV必须是不可预测的(读为:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀,然后在解密之前切掉。@ArtjomB。ruby结果不等于python的s@ArtjomB. 我正在调用使用DES的第三方系统的api。三重DES应该是24字节长,而不是16个字符。此外,加密密钥应该与随机噪声无法区分,这意味着它们不能仅由数字甚至字母数字组成。它们应该随机选择,可能包含任何可能的字节值。现在不要使用三重DES。它最多只能提供112位的安全性,即使您使用192位的最大密钥大小。如果使用较短的密钥大小,则仅提供56或57位的安全性。AES将更快(处理器有一个特殊的AES-NI指令集),并且使用128位的最小密钥大小将更加安全。3DES的最大密文大小也有实际限制。请参阅。IV必须是不可预测的(读为:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀,然后在解密之前切掉。@ArtjomB。ruby结果不等于python的s@ArtjomB. 我正在调用使用DES的第三方系统的api。