Java AES-CBC暗号化で文字列を暗号化するプログラムを書いています(最終的にはステガノグラフィ関数も追加します)。
ご存じのように、CBCは最初のブロックを暗号化するためにIVを必要とします。これは、継承元のブロックがないためです。
私はIVについていくつかの研究を行ってきました。
現在、テスト/デバッグの目的で、固定IVを使用しています。
ただし、プログラムでほとんどのバグが解決されたので、修正されたIVを削除してセキュリティを向上させたいと考えています。
私が知りたいのは: IVの2つ目のキーを使用しても安全ですか?
たとえば、私のプログラムは現在、暗号化プロセスに適した長さのキーをユーザーに要求します。
ユーザーに次のいずれかを要求した場合:
A) 2つのキー(同じ長さ、1つはIV用、もう1つは実際の暗号化用)
B) 1つのキーの2倍の長さ(2つの部分に分割、1つはIV、2つ目は実際のキー)
それは安全でしょうか?
IVはランダム非秘密値です。その唯一の目的は、プレーンテキストの構造に関する情報を提供する可能性があるため、2つの類似したブロックが同じ暗号文を生成しないようにすることです。
通常、IVをランダムに生成し、それを暗号文に連結します。 IVは、AES-CBCのブロックと同じ長さ(128ビット)である必要があります。あなたはそれを暗号文に連結することができます(例えば、IV +暗号文)。最初の16バイトはIVになります。
[〜#〜]編集[〜#〜]
IVを暗号文の直前に配置するのが一般的である場合、そのようにすることはセキュリティリスクではないですか?
IVの唯一の目的は、暗号文をランダム化して、2つの類似した平文ブロックが同じ暗号文を生成しないようにすることです。これは、構造が固定されているファイルでは特に重要です。 これがなぜ重要であるかについては、こちらをご覧ください。
CBCでは、XOR AESを適用する前の現在のブロックを含む前のブロックの暗号文バージョンです。IVがある理由は、最初のブロックにはブロック1がないためですXORされます。したがって、ランダムな16バイトを生成するだけです。これは、パスワードをソルトするのと似ています。
ランダムIVを暗号文の前に置くと、静的IVを選択するよりも安全になります。
静的IVは、同じ暗号文を生成するすべての類似した最初のブロックがまだあるため、目的を達成できません。
どちらの場合も、IVははっきりと見えます。 IVを使用しないと、最初のブロックをブルートフォースですばやくブロードフォースできますか?
IVはAESの一部ではなく、AESがサポートする操作モードの一部です。
これらの概念についてはかなり混乱しているようですね。よく読んで紹介したい場合は、キースマーティンの「日常の暗号化」をご覧ください。それはすべてを段階的に説明する良い本です。暗号化は複雑で困難であり、間違いは壊滅的な結果をもたらす可能性があります。既存の暗号を実装する場合は注意してください。アプリケーションで使用する場合は、確立された検証済みのライブラリを使用するほうがよいでしょう。