ECBモードの暗号化(認証モードGCMやEAXなどの優れたモードもありますが)よりも確かに優れているので、CBCを知っておきましょう。あなたが知っておくべきことがいくつかあると思いますので、ここで説明します。
キーとパスワードが同じではありません。通常、キー導出関数を使用して、パスワードから対称暗号化に使用される鍵を作成します。 PBKDF2(パスワードベースの鍵導出関数#2)は、PBE(パスワードベースの暗号化)に使用される最も一般的なものです。これは、RSAラボで公開されている最新のPKCS#5標準で定義されています。パスワードを入力する前に、パスワードがバイト(文字エンコーディング)に正しく変換されているかどうかを確認する必要があります。
この塩は、キー導出関数の別の入力として使用されます。特定のパスワードに対してキーが事前計算されている「虹のテーブル」を使用してブルートフォース攻撃を防止するために使用されます。塩のために、攻撃者は、塩ごとに1つを生成することができないので、事前に計算された値を使用することはできません。塩は、通常、16バイト(128ビット)以上でなければなりません。また、同一のパスワードが同じ派生結果を持たないようにします。
キー導出関数の出力は、dkLen
バイトのシークレットです。ここで、dkLen
は、生成するキーの長さ(バイト)です。 AESキーにはこれらのバイト以外は含まれていないため、AESキーは生成された秘密キーと同じになります。 dkLen
は、AESのキー長が128,192、または256ビットの場合は、16,24、または32バイトでなければなりません。
これで、最終的に使用するAESキーがあります。ただし、このキーで各プレーンテキストブロックを単純に暗号化すると、プレーンテキストブロックが同一であれば同じ結果が得られます。 CBCモードは、暗号化を行う前に、次のプレーンテキストブロックを最後の暗号化ブロックと排他的論理和(XOR)することによってこれを回避します。最後に暗号化されたブロックが「ベクトル」です。は最後に暗号化されたブロックがないため、これは最初のブロックでは機能しません。このため、最初のベクトル、「初期化ベクトル」またはIVを指定する必要があります。
AESのブロックサイズは、鍵サイズのからまでの16バイトです。したがって、初期化ベクトルを含むベクトルも16バイトである必要があります。たとえば、キーを使用して暗号化する場合にのみ、 1つのファイルであれば、IVは単に値00
hの16バイトを含むことができます。ファイルに同じテキストが含まれていると、暗号化されたファイルの最初の部分が同一であることを検出できるため、複数のファイルでは機能しません。このため、キーを使用して実行する暗号化ごとに異なるIVを指定する必要があります。固有で16バイトであり、解読を実行するアプリケーションに知られている限り、その内容には関係ありません。
ここでは、IVにすべてのゼロを常に使用できるトリックがあります.AES-CBCを使用して暗号化したプレーンテキストごとに、同じパスワードで異なる塩を使用してキーを計算できます。その場合、結果のキーは単一の情報にのみ使用されます。これは、パスワードベースの暗号化を実装するライブラリにIVを提供できない場合には、良い考えです。しかし、CPUは不公平です.PBKDF2の機能は意図的にCPUには不公平です。
IVと塩は、しばしば混乱しますが、完全に別個の用語です。あなたの質問では、ビットとバイト、鍵のサイズとブロックサイズ、そしてレインボーテーブルをMD5テーブルと混同します(暗号化は簡単だと誰も言わない)。 1つのことは確かです。暗号化では、できる限り安全であることが求められます。本当に(本当に)余分なリソースを買う余裕がない限り、冗長セキュリティは一般的に問題ではありません。
これがどのように機能するかを理解すると、真剣にPBE暗号化を実行するライブラリを見つけることができます。パスワード、塩分、平らなデータ、そして別に設定されている場合はIVを入力する必要があります。
私はこの時点でAES暗号化を理解するようになりましたので、あなたの答えは少し長いです。私が言葉を混乱させるならば、それは単に表現の怠け者/誇りからだけです。私は冗長なセキュリティについて同意するようになり、塩を使用します。 – user1122069
あなたの質問に対処するにはいくつかの問題があり、人々の心を見ることができないので、時間がかかりました。さらに、同様の質問をした人を助けるかもしれません。とにかく1分に300文字以上を入力してください(良い日に)。 –
@MaartenBodewesようやく私は何時間ものグーグルで塩とIVが何であるか理解しました。 IVのサイズは、CBC連鎖モードでは常に16バイトです。 –