2

次のスクリプトが与えられた場合

require "openssl"
require "securerandom"

key = SecureRandom.random_bytes(32)
iv = SecureRandom.random_bytes(16)

aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.encrypt
aes.key = key
aes.iv = iv

crypted = aes.update("a"*50)+aes.final

aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
aes.iv = iv

puts aes.update(crypted)+aes.final

aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key

puts aes.update(crypted)+aes.final

次の出力が得られます(例):

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
���y��f{�K~:y��aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

これらの CBC スタイルの XOR 操作、ブロック サイズのケアなどを自分で実行する必要がありますか? 復号化する必要がある文字列を渡して更新関数を呼び出すだけではない例は見つかりません。インプレース編集の問題を防ぐために、すべての文字列割り当てに .dup を追加しようとしました。ここで何が起こっているのですか?

環境: ruby​​ 1.9.3p194 (2012-04-20 リビジョン 35410) [x86_64-linux]

4

1 に答える 1

4

IV の目的は、同じデータを含む複数のメッセージを分析して、キーの発見を防ぐことです。キーを持っている場合、情報を不明瞭にすることは意図されていません。適切な IV がなければ、暗号文の最初のブロックは正しくありませんが、それ以降のブロックは適切に復号化されます。IV は、データではなく鍵を保護します。

openssl コマンド ライン ツールを使用して同様の暗号化を実行すると、同じことが得られます (ここでは、暗号化された暗号文に埋め込まれた 8 バイトの IV を 8 つのスペース文字に置き換えます)。

echo "Ruby openssl lib - Why does AES-256-CBC decrypting gives readable data without the correct IV?" | \
openssl enc -aes-256-cbc -salt -pass pass:password | \
perl -pi -e "s/^(.{8})(.{8})/\1        /" | \
openssl enc -d -aes-256-cbc -salt -pass pass:password

▒▒▒▒▒▒t▒8q▒g] -▒▒▒▒▒▒7<s AES-256-CBC decrypting gives readable data without the correct IV?
于 2012-12-14T00:29:04.757 に答える