如何在Ruby中以十六进制执行三重DES计算?

如何在Ruby中以十六进制执行三重DES计算?,ruby,encryption,openssl,3des,Ruby,Encryption,Openssl,3des,我想用Ruby做一些三重DES加密。我正在尝试复制此页面的结果: 我试图在Ruby中复制这些结果。我怀疑问题在于密钥应该是字符串,但我需要传入一个十六进制密钥。该字符串或正在加密的字符串的格式错误。或者两者兼而有之。:-) 但它应该是: => ["3a42d7a1d1c60c40"] 我哪里出了问题,有什么指点吗 此处记录了不同的3DES算法: 为清晰起见进行了编辑 密钥是十六进制的-如果查看粘贴的Java页面,您可以通过解码详细输出中密钥的二进制值轻松看到这一点 >> d

我想用Ruby做一些三重DES加密。我正在尝试复制此页面的结果:

我试图在Ruby中复制这些结果。我怀疑问题在于密钥应该是字符串,但我需要传入一个十六进制密钥。该字符串或正在加密的字符串的格式错误。或者两者兼而有之。:-)

但它应该是:

=> ["3a42d7a1d1c60c40"]
我哪里出了问题,有什么指点吗

  • 此处记录了不同的3DES算法:
  • 为清晰起见进行了编辑

密钥是十六进制的-如果查看粘贴的Java页面,您可以通过解码详细输出中密钥的二进制值轻松看到这一点

>> des_cbc=OpenSSL::Cipher::Cipher.new("des-ede-cbc")
=> #<OpenSSL::Cipher::Cipher:0x10116ce28>
>> des_cbc.encrypt
=> #<OpenSSL::Cipher::Cipher:0x10116ce28>
>> des_cbc.key="\x23"*8 << "\x45"*8
=> "########EEEEEEEE"
>> des_cbc.update("\x00"*8).unpack('H*')
=> ["3a42d7a1d1c60c40"]
des_cbc=OpenSSL::Cipher::Cipher.new(“des ede cbc”) => # >>des_cbc.encrypt => # >>des#u cbc.key=“\x23”*8”eeeeee” >>des_cbc.update(“\x00”*8).解包('H*) =>[“3a42d7a1d1c60c40”]
键是十六进制的-如果您查看粘贴的Java页面,您可以通过解码详细输出中键的二进制值轻松看到这一点

>> des_cbc=OpenSSL::Cipher::Cipher.new("des-ede-cbc")
=> #<OpenSSL::Cipher::Cipher:0x10116ce28>
>> des_cbc.encrypt
=> #<OpenSSL::Cipher::Cipher:0x10116ce28>
>> des_cbc.key="\x23"*8 << "\x45"*8
=> "########EEEEEEEE"
>> des_cbc.update("\x00"*8).unpack('H*')
=> ["3a42d7a1d1c60c40"]
des_cbc=OpenSSL::Cipher::Cipher.new(“des ede cbc”) => # >>des_cbc.encrypt => # >>des#u cbc.key=“\x23”*8”eeeeee” >>des_cbc.update(“\x00”*8).解包('H*) =>[“3a42d7a1d1c60c40”]
此页面还有一些其他有用的信息:您是否希望“2323…”实际为0x2323。。i、 一个十六进制数,或者类似的数字?是的,但是key=需要一个字符串,而不是一个数字。我也尝试过:des.key=“23232323235454545.unpack('a2'*32.map{x | x.hex}.pack('c'*32)(来自第一条评论中的链接),但也不起作用。这个页面还有一些其他有用的信息:您是否希望“2323…”实际上是0x2323。。i、 一个十六进制数,或者类似的数字?是的,但是key=需要一个字符串,而不是一个数字。我也尝试过:des.key=“23232323235454545.unpack('a2'*32.map{x | x.hex}.pack('c'*32)(来自第一条评论中的链接),但也不起作用。谢谢!我不明白为什么键是“\x23”*8而不是“\x2\x3”*8?是因为\x对字节进行操作吗?还有-为什么是\x而不是0x?和-为什么需要使用“(“\x00”8).unpack('H')?是否要获取二进制0,而不是字符串/ascii值“0”?老兄,我对二进制/十六进制/十进位的东西很在行。“\x00”是十六进制空值。每个字节两个半字节,这也是为什么它是“\x23”而不是\x2\x3(以10为底35)\x、 。。是0x.的字符串版本。。这将是一个fixnum。在irb中尝试这一切。:)非常感谢。我不明白为什么键是“\x23”*8而不是“\x2\x3”*8?是因为\x对字节进行操作吗?还有-为什么是\x而不是0x?和-为什么需要使用“(“\x00”8).unpack('H')?是否要获取二进制0,而不是字符串/ascii值“0”?老兄,我对二进制/十六进制/十进位的东西很在行。“\x00”是十六进制空值。每个字节两个半字节,这也是为什么它是“\x23”而不是\x2\x3(以10为底35)\x、 。。是0x.的字符串版本。。这将是一个fixnum。在irb中尝试这一切。:)