ruby - OpenSSL 命令行和 Ruby OpenSSL 库在使用相同参数加密文本时有所不同

标签 ruby encryption cryptography openssl encryption-symmetric

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

我制作了一个 Ruby 脚本来测试 OpenSSL,我发现我得到了不同的结果。 key 、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

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

最佳答案

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

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

我想你的 Ruby 库将 key 和初始化向量作为二进制数据,例如你实际上传递了一个 key 和由 0x30303030... 组成的初始化向量(假设 ASCII 或任何与之兼容的东西)而不是 0x00000...

关于ruby - OpenSSL 命令行和 Ruby OpenSSL 库在使用相同参数加密文本时有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473269/

相关文章:

ruby-on-rails - 通过 http 而不是文件系统导入 SASS 部分

c++ - Ruby 中的多维数组类似于 C++

encryption - 强制光子服务器加密

sql-server - SQL Server 2005 数据加密和 LINQ TO SQL

ios - 将 PEM 编码的 X.509 证书导入 iOS KeyChain

python - 用于无视排序的项目集合的哈希函数

java - Java Card 中的 ALG_RSA_NOPAD

ruby - 如何使用 Sinatra 配置 RSpec 以在我的测试套件运行之前动态确定哪个 Sinatra 应用程序正在运行?

ruby-on-rails - Rails 应用程序显示 'index of/cms' 而不是 Rails

iphone - 保护 Coredata 对象的安全