Ruby 1.8.7 で OpenSSL を使用し、Bash で OpenSSL を使用してファイルをデコードしていますが、Ruby コードでは、復号化されたファイルの最初の 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 で OpenSSL を使用して取得した結果です
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
ルビーコード:
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
Bash 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 または上記のコマンドを使用してファイルを取得したら、最終的な base 64 デコードを行う必要があります。
base64 -d file_encode_base64 > encrypted_file
暗号化されたファイルが正しいことを確認するために、MD5 ハッシュは次のとおり30b8f5e7d700c108cd9815c00ca1de2d
です。
OpenSSL の Bash バージョンを使用してこのファイルをデコードすると、JPG 形式の画像が得られます。
しかし、Ruby 版を使用すると、picture.jpg とは最初の 16 バイトが異なるデータ ファイルが取得されます。
参考までに、これは最初にファイルを暗号化するために使用したコマンドです。
openssl aes-128-cbc -e -in picture.jpg -out enc_file -nosalt -iv 00000000000000000000000000000001 -K 7ffb8032dff33aef9aa92e9ac96239d3
Bash で OpenSSL を使用してデコードできるのに、Ruby を使用するとわずかに異なる結果が得られる理由を誰か説明できますか?