一部のデータを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_iv
、OpenSSL::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)