AES ブロック サイズは 128 ビット = 16 バイト、つまり 16 文字です。これは、16 バイトが入り、16 バイトが出て行くことを意味します。
を呼び出してストリーミング モードを使用していますOpenSSL::Cipher#update
。これはupdate
、最小 16 バイトに達するまで、メソッドへの入力が暗号の入力に追加されることを意味します。そうして初めて暗号化が実行され、メソッドは実際の値を返します。
これは、 への呼び出しはupdate
、8 バイトの値を与えた場合にのみ毎秒出力を生成することを意味します。
cipherer = OpenSSL::Cipher::Cipher.new("aes-256-cbc").encrypt
#=> #<OpenSSL::Cipher::Cipher:0x007fb67426e558>
cipherer.update('X'*8)
#=> ""
cipherer.update('X'*8)
#=> "\xA0+\xD8Y\xA5\xBC68\x972\x86!\xC7\xE5\xA2\xDE"
cipherer.update('X'*8)
#=> ""
cipherer.update('X'*8)
#=> "\xFB\xB1I\xE2\x01\xB8Z\x10\xDC\x96m?\xC3\x00\x19+"
一方、32 バイトの値を指定すると、2 つのブロックが一度に暗号化されます。
cipherer = OpenSSL::Cipher::Cipher.new("aes-256-cbc").encrypt
=> #<OpenSSL::Cipher::Cipher:0x007fb6741579f8>
cipherer.update('X'*32)
#=> "\xA0+\xD8Y\xA5\xBC68\x972\x86!\xC7\xE5\xA2\xDE\xFB\xB1I\xE2\x01\xB8Z\x10\xDC\x96m?\xC3\x00\x19+"
cipherer.update('X'*32)
#=> "\xB2!\xBA>M\x13t\xEBv^\xCE\xAE\x18\x9A\xE3S\xD96\x95\x89\xC1\xB4\xAA\xDD\xD3\xDCp\e<\x90\xA79"
cipherer.update('X'*32)
#=> "\x95\xA3-\xB9\x93D\x1D\xC0\xB3mh\xE3\xB5N\x9C\x8C\xEA\xF3\x80\xD3\xBDU\xCB'\xC0E\xDA\x02\xA8L\a\xB3"
問題の直接的な解決策は、16 バイトの長さが保証されている文字列を入力として使用することです。
ただし、Ruby に付属の UUID 実装を使用することを強くお勧めします。暗号化を実装する際には、考慮すべきことがたくさんあります。標準に固執し、よく知られ、広く使用され、実戦でテストされた実装を使用する方が常に良いでしょう. つまり、UUID を取得する方法は次のとおりです。
require 'securerandom'
SecureRandom.uuid
#=> "c5059a24-25fc-4617-aaf7-280df52cd8d3"
そのような単純な。