2013-05-20 79 views
0

我使用Ruby 1.8.7中的OpenSSL和Bash中的OpenSSL來解碼文件,但是對於Ruby代碼,解密文件中的前16個字節是錯誤的。爲什麼Ruby openssl aes 128 cbc的前16個字節錯誤?

這是結果我用Ruby

cf e8 cf d1 12 e2 75 48 59 56 30 30 7d 7d 30 1b | wrong bytes 
00 00 00 08 00 0c 01 1a 00 05 00 00 00 01 00 00 | good bytes 
01 46 01 1b 00 05 00 00 00 01 00 00 01 4e 01 28 | good bytes 
********************good bytes****************** | good bytes 

得到,這是導致我的Bash

ff d8 ff e1 22 d2 45 78 69 66 00 00 4d 4d 00 2a | correct bytes 
00 00 00 08 00 0c 01 1a 00 05 00 00 00 01 00 00 | same bytes as in Ruby 
01 46 01 1b 00 05 00 00 00 01 00 00 01 4e 01 28 | same bytes as in Ruby 
*******************a lot of bytes*************** | same bytes as in Ruby 

Ruby代碼使用OpenSSL得到:

require 'openssl' 

c = OpenSSL::Cipher::Cipher.new("aes-128-cbc") 
c.decrypt 
c.key = "\177\373\2002\337\363:\357\232\251.\232\311b9\323" 
c.iv = "00000000000000000000000000000001" 

data = File.read("/tmp/file_crypt") 
d = c.update(data) 
d << c.final 

file = File.open("/tmp/file_decrypt_ruby", "w") 
file.write(d) 
file.close 

猛砸OpenSSL的命令:

openssl aes-128-cbc -d -in /tmp/file_crypt -out /tmp/file_decrypt_bash -nosalt -iv 00000000000000000000000000000001 -K 7ffb8032dff33aef9aa92e9ac96239d3 

編碼的文件可以在這裏下載:http://pastebin.com/EqHfpxjZ。使用「pbget」(如果有的話)下載文件。否則,複製文本,base 64將其解碼,然後lzma對其進行解壓縮。 (例如wget -q -O-「$ url」| base64 -d | lzma -d>「$ TEMP」)。

一旦你通過pbget文件,或者上面的命令,你需要做的最後一個基地64解碼:

base64 -d file_encode_base64 > encrypted_file

要確保你有正確的加密文件,在MD5哈希是:30b8f5e7d700c108cd9815c00ca1de2d

如果您使用BSS版本的OpenSSL解碼此文件,您將獲得JPG格式的圖片。

但是,如果您使用Ruby版本,您將獲得一個與picture.jpg不同的前16個字節的數據文件。

供參考,這是我用來擺在首位加密該文件的命令:

openssl aes-128-cbc -e -in picture.jpg -out enc_file -nosalt -iv 00000000000000000000000000000001 -K 7ffb8032dff33aef9aa92e9ac96239d3 

任何人都可以解釋爲什麼我可以使用OpenSSL在猛砸解碼,卻得到了一個稍微不同的結果,當我使用Ruby?

+0

謝謝gtrig看到我的編輯,請。 – user2401369

+0

非常感謝gtrig。請看我的新編輯。 – user2401369

+0

感謝gtrig我沒有這個MD5哈希請看我的新編輯。 – user2401369

回答

2

最後,它的工作原理!答案其實很簡單。您的IV需要在Ruby代碼中轉換爲二進制,類似於您轉換密鑰的方式。我在page的評論中找到了轉換代碼和解釋。

試試這個代碼:

require 'openssl' 

cipher = OpenSSL::Cipher::Cipher.new("aes-128-cbc") 
cipher.decrypt 
cipher.key = "7ffb8032dff33aef9aa92e9ac96239d3".unpack('a2'*16).map{|x| x.hex}.pack('c'*16) 
cipher.iv = "00000000000000000000000000000001".unpack('a2'*16).map{|x| x.hex}.pack('c'*16) 
data = File.read("/tmp/file_crypt") 
decrypted = cipher.update(data) + cipher.final 
file = File.open("/tmp/file_decrypt_ruby", "w") 
file.write(decrypted) 
file.close