2011-09-19 49 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*') 
相關問題