0

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 を使用するとわずかに異なる結果が得られる理由を誰か説明できますか?

4

1 に答える 1

2

最後に、それは機能します!そして答えは実は簡単です。キーを変換したのと同様に、Ruby コードで IV をバイナリに変換する必要があります。このページのコメントに変換コードと説明がありました。

このコードを試してください:

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
于 2013-05-24T02:34:44.417 に答える