我使用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?
謝謝gtrig看到我的編輯,請。 – user2401369
非常感謝gtrig。請看我的新編輯。 – user2401369
感謝gtrig我沒有這個MD5哈希請看我的新編輯。 – user2401369