OpenSSLaes-128-cfbが期待されるサイズを生成しない

Aug 17 2020

私は学習のために自分でaes-128-cfbを実装しようとしています。私の実装が正しいかどうかを確認するために、OpenSSLなどのよく知られたライブラリでそれを確認したいと思います。しかし、OpenSSLを使用して暗号化しようとすると、何か奇妙なことに気づきました。

cleartext.txt次の内容のファイルがあります。

This is cleartext that will be used to encrypt with OpenSSL.

次に、このコマンドを実行します

openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt

奇妙なことに、出力ファイルには60バイトしか含まれていません。AESブロックは16バイトです。バイト単位の予想出力サイズは16の倍数である必要があります。60は16の倍数ではありません。

ここで重要な何かを見逃しましたか?

回答

2 kelalaka Aug 17 2020 at 22:02

CFBは、CTRおよびOFBモードの動作と同様にパディングを必要としないためです。これらのモードは暗号ブロックを作成し、それらから必要な量を使用します。

  • openssl enc -K -ivIVの場合は出力ファイルに書き込まれませんoutput.txt。したがって、バイト単位の平文と同じサイズになります。61私のファイルのそれぞれのバイト。この場合、IVを処理する必要があります。IVも提供しているので、二度と使用しないように注意してください。そうしないと、CTRモードまたはOTPのキーの再利用でベビーベッドのドラッグが発生する可能性があります。

  • の場合-k/-kfile/-pass、IVとキーは、ユーザーのパスワードと8バイトのランダムソルトを使用してキー導出方法から導出されます。

    OpenSSLは、最初に8バイトのソルトのファイルマジックを書き込み、Salted__次に暗号文をファイルに書き込みます。これで、出力サイズはあなたのになりますmagic size + salt size + data-size。私のシステムでは、8+8+61 = 77バイト。

    • ECBモードを使用する場合

      openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
      

    その場合、サイズは80パディングのためにバイトになります。もちろん、ECBはIVを使用しないため、このモードを忘れる必要があります。

    • CBCモードはECBと同様の結果をもたらします。

    • 派生IVサイズは、8バイトブロック暗号TDESなどの使用される暗号化アルゴリズムに応じて変化する可能性があります。Blowfishには8バイトIVが必要で、AESやTwofishな​​どの16バイトブロック暗号には16バイトIVが必要です。

パスワードを使用するときは、パスワードのエントロピーと使用される鍵の導出方法に注意する必要があります。Dicewareパスワードを使用することをお勧めします。キーの導出には、少なくともPBKDF2を使用してください。OpenSSLは、鍵導出のためのさまざまな方法を提供します