2011-09-19 38 views
2

注意:使用OpenSSL进行文本的对称加密。使用相同参数加密文本时,OpenSSL命令行和Ruby 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 

只是一个奇怪的结果。任何想法是什么导致数据有所不同?

回答

0

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

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

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

+1

你不指定SSL命令行填充。有可能默认填充不同,因此是不同的加密块。 – rossum

0

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

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

ruby Packs

decipher.key = ["#{key}"].pack('H*') 
decipher.iv = ["#{iv}"].pack('H*') 
相关问题