-1

暗号のソース文字列の最小長はありますか? 一意のセッション ID を作成しようとしており、次のことを行っています。

cipherer = OpenSSL::Cipher::Cipher.new("aes-256-cbc").encrypt

cipherer.update(Time.now.to_f.*(1000).to_i.to_s(36))

しかし、空の文字列を返します。乗算係数1000を のような大きなものに変更する100000000000000と、空の文字列が返されることもあれば、長い文字列が返されることもあります。これは、ある長さよりも短い文字列が暗号によって空の文字列にマップされるためだと思います。この理解は正しいでしょうか?もしそうなら、最小の長さはどれくらいですか?空の文字列を返さないようにするにはどうすればよいですか? 解読する必要がないので、丸め誤差やハードウェアの依存関係で解読できなくなる心配はありません。

4

1 に答える 1

2

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"

そのような単純な。

于 2013-03-28T00:31:30.607 に答える