長さnビットのメッセージの理想的な暗号は、2 n ! そのような順列。「キー」は、選択された順列の説明です。
安全なブロック暗号は、理想的な暗号と見分けがつかないと想定されており、nはブロック サイズです。AES の場合、n=128 (つまり 16 バイト)。AES は安全なブロック暗号であると考えられています。
すべてのシークレットの長さが正確に 16 バイト (または 16 バイト未満で、明確に 16 バイトに拡張するためのパディング規則がある) の場合、理想的な暗号が必要であり、AES は「それ自体」で問題ありません。パディングを適用し、任意の長いストリームを処理する一般的な AES 実装では、ECB モードまたはすべてゼロの IV を使用する CBC モードを要求することで、単一ブロック暗号化を取得できます。
IV に関するすべての問題と、そもそも CBC などの連鎖モードが必要だった理由は、マルチブロック メッセージに由来します。AES は 16 バイトのメッセージを (それ以上でもそれ以下でもない) 暗号化します。連鎖モードは、より長いメッセージの理想的な暗号をエミュレートすることです。アプリケーションで、すべてのメッセージの長さが正確に 16 バイトの場合 (または、より短いが、パディングを追加する場合)、「生の」AES だけが必要です。固定 IV は生の AES に十分近いエミュレーションです。
ただし、次の点に注意してください。
暗号化された要素をデータベースに保存していて、アプリケーションの存続期間全体で一意性が必要な場合、秘密鍵は長期間有効です。秘密鍵を長期間秘密にしておくことは、難しい問題になる可能性があります。たとえば、長期間有効な秘密鍵には、何らかのストレージが必要です (これは再起動に耐えます)。故障したハードディスクをどのように管理していますか? 酸で満たされた大釜でそれらを破壊しますか?
暗号化は、完全性ではなく機密性を保証します。ほとんどのセキュリティ モデルでは、攻撃者がアクティブになる可能性があります (つまり、攻撃者がデータベースを読み取ることができれば、おそらくデータベースに書き込むこともできます)。アクティブな攻撃は、さまざまな問題を引き起こします。たとえば、攻撃者がデータベース内の秘密の一部を交換するとどうなるでしょうか? またはランダムにいくつかを変更しますか?いつものように、暗号化は簡単な部分です (本当に「簡単」というわけではありませんが、他の作業よりもはるかに簡単です)。