2

注意:使用 OpenSSL 对文本进行对称加密。

我制作了一个 Ruby 脚本来测试 OpenSSL,但我发现我得到了不同的结果。密钥、iv 和密码是相同的,所以我希望结果是相同的。但他们不是。这是我的脚本:

require 'openssl'
require 'base64'

key = "00000000000000000000000000000000"
iv = "00000000000000000000000000000000"

### OPENSSL Command Line ###
puts "*** OpenSSL Command Line ***"
print "Encrypted via Command Line:  "
string = `printf %s \"Hello\" | openssl enc -aes-128-cbc -K #{key} -iv #{iv} -base64`

puts string
puts string.inspect

print "Decrypted Data is:  "
puts `printf %s \"BC2+AQJ6ZQx0al3GXba+EQ==\n\" | openssl enc -d -aes-128-cbc -K #{key} -  iv #{iv} -base64`
puts "\n"

### Ruby OpenSSL Library ###
puts "*** OpenSSL Ruby Library ***"

cipher = OpenSSL::Cipher.new('aes-128-cbc').encrypt
cipher.padding = 1
cipher.key = key
cipher.iv = iv

encrypted_data = cipher.update("Hello")
encrypted_data << cipher.final
encrypted_data = Base64.encode64(encrypted_data)
puts "Encrypted via Ruby is: #{encrypted_data}"
puts encrypted_data.inspect

decipher = OpenSSL::Cipher.new('aes-128-cbc').decrypt
decipher.key = key
decipher.iv = iv

data = decipher.update(Base64.decode64(encrypted_data))
data << decipher.final
puts "Decrypted Data:  #{data}"

结果是:

*** OpenSSL Command Line ***
Encrypted via Command Line:  BC2+AQJ6ZQx0al3GXba+EQ==
"BC2+AQJ6ZQx0al3GXba+EQ==\n"
Decrypted Data is:  Hello

*** OpenSSL Ruby Library ***
Encrypted via Ruby is: ZkeNEgsUXi1J7ps6kCQxdQ==
"ZkeNEgsUXi1J7ps6kCQxdQ==\n"
Decrypted Data:  Hello

只是一个奇怪的结果。知道是什么导致数据不同吗?

4

2 回答 2

0

只是猜测,不知道 Ruby 的 OpenSSL 接口:

您以十六进制编码将密钥和初始化向量提供给命令行 OpenSSL。例如,您的密钥和初始化向量是0x000....

我想您的 Ruby 库将密钥和初始化向量作为二进制数据,例如,您实际上传递的密钥和初始化向量由0x30303030...(假设 ASCII 或与其兼容的任何内容)组成,而不是0x00000....

于 2011-09-19T15:56:01.890 回答
0

将它们打包成二进制(十六进制)序列将修复它。在我的机器上测试(Mac ox 10.11.1 ruby​​-2.2.3)。

cipher.key = ["#{key}"].pack('H*')
cipher.iv = ["#{iv}"].pack('H*')

红宝石包

decipher.key = ["#{key}"].pack('H*')
decipher.iv = ["#{iv}"].pack('H*')
于 2015-11-16T04:10:15.460 回答