1

一部のデータをAES暗号化しようとしていますが、これを使用random_ivして初期化ベクトルを生成しています。

def encrypt (data)
    cipher = OpenSSL::Cipher::AES.new(256, :CBC)
    cipher.encrypt
    cipher.key = @key
    iv = cipher.random_iv
    encrypted = cipher.update(data) + cipher.final
    encoded = Base64.encode64(encrypted+iv) 
    return encoded, self.sign(encoded)
end

ivが含まれている場合'、エンコードされた文字列はそこで終了し、それ以降'はすべて無視されます。私はそうだと思いますrandom_ivOpenSSL::Random.random_bytes(16)まだソースをチェックしていません。私がrandom_iv好きになったとき:

"0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"

エンコードされた文字列の最後の16文字は、そのようなものではありません(で終わるC8)。

Base64.decode64('1JCQvhD6mrDXkhW4Hn9HIIr32TmYlBmp803oxOtrZMg=\n')[-16,16]
# => "\x8A\xF7\xD99\x98\x94\x19\xA9\xF3M\xE8\xC4\xEBkd\xC8" 

がない場合は正常に'動作ivします。今、私はこの問題を次のように解決しています:

cipher.iv = Digest::MD5.new.digest(cipher.random_iv)

MD5もそうなので16byte、要件に適合しivます。

Digest::MD5.new.digest('test').bytesize
# => 16 

それを行うためのより良い方法があるかどうか疑問に思います。そして、そもそもなぜそこ'random_ivあるのでしょうか?渡されたデータをどのようにエスケープする必要がありencode64ますか?

data.bytesizeまた、で割り切れるまでデータにバイトを追加する必要があります16か?それともCipher::AES私のためにそれをしますか?

cipher.update(data)
4

1 に答える 1

3

'文字列の内容として特別なことは何もありません。これは ASCII 値 39 のバイトです。

ステートメントencoded = Base64.encode64(encrypted+iv)では、 は、 2 行前に設定ivした変数と同じではありません。cipher.ivという名前のスコープにメソッドまたはアクセサーがありますivか? あなたのbase64文字列'1JCQvhD6mrDXkhW4Hn9HIIr32TmYlBmp803oxOtrZMg=\n'(これはあなたの関数の結果だと思います)は、あなたの例ivのbase64エンコーディングで終わっていないので+iv、式の一部が見えていないと確信してい"0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"ます。

あなたの例ivのbase64エンコーディングは、私にとってはうまく往復します:

irb> iv = "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>".force_encoding('BINARY') 
=> "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
irb> e = Base64.encode64 iv
=> "MMh4JzaGBv5HW8719ctMPg==\n"
irb> d = Base64.decode64 e
=> "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
irb> d == iv
=> true
于 2013-02-11T07:57:26.067 に答える