初期化ベクトルを使用してデータを暗号化/復号化することは推奨されますか? それは物事をより安全にしますか?ケースバイケースで評価する必要があるものの1つですか?
これを実際の文脈に当てはめると、Win32 暗号化関数CryptSetKeyParamを使用すると、暗号化/復号化の前にキーに初期化ベクトルを設定できます。他の API でもこれが可能です。
一般的に推奨されるものとその理由は何ですか?
初期化ベクトルを使用してデータを暗号化/復号化することは推奨されますか? それは物事をより安全にしますか?ケースバイケースで評価する必要があるものの1つですか?
これを実際の文脈に当てはめると、Win32 暗号化関数CryptSetKeyParamを使用すると、暗号化/復号化の前にキーに初期化ベクトルを設定できます。他の API でもこれが可能です。
一般的に推奨されるものとその理由は何ですか?
複数のメッセージを暗号化するために同じキーが使用される可能性がある場合、IV は不可欠です。
その理由は、ほとんどの暗号化モードでは、同じキーで暗号化された 2 つのメッセージを一緒に分析できるためです。たとえば、単純なストリーム暗号では、同じキーで暗号化された 2 つの暗号文を XOR すると、2 つのメッセージの XOR が得られ、そこから従来の暗号解析技術を使用して平文を簡単に抽出できます。
弱い IV は、WEP が壊れやすくなった原因の一部です。
IV は基本的に、同じキーが 2 回使用されるのを防ぐために、いくつかの一意の非機密データをキーに混ぜます。
ほとんどの場合、IV を使用する必要があります。IV は毎回ランダムに生成されるため、同じデータを 2 回暗号化すると、暗号化されたメッセージが異なり、オブザーバーはこの 2 つのメッセージが同じかどうかを判断できなくなります。
CBC モードの写真 (下を参照) をよく見てください。IV を知っている攻撃者は、暗号文の前のブロックを知っている攻撃者のようなものであることがすぐにわかります (そして、彼らはすでにそれを十分に知っています)。
IV=0 の「問題」のほとんどは、データの整合性を保証しない場合のブロック暗号化モードの一般的な問題です。完全性を確保する必要があります。
強力なチェックサム (暗号化ハッシュまたは HMAC) を使用し、暗号化する前に平文に付加します。既知の暗号文の最初のブロックがあります。これは、チェックサムのない同じものの IV であり、他の何百万もの理由でチェックサムが必要です。
最後に、CBC とストリーム暗号の類推は、それほど洞察に満ちたものではありません。
CBC モードの写真を見るだけで、きっと驚くことでしょう。
ここに写真があります:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
複数の異なるシークレットに対して同じキーが複数回使用されると、暗号化された結果にパターンが現れる可能性があります。疑似ランダムで、各キーで 1 回だけ使用する必要がある IV は、結果を難読化するために存在します。同じ IV を同じキーで 2 回使用しないでください。その目的が無効になります。
IV を追跡する手間を省くための最も簡単な方法は、生成された暗号化されたシークレットの前に追加することです。そうすれば、あまり深く考える必要はありません。これにより、最初または最後の N ビットが IV であることが常にわかります。
シークレットを復号化するときは、IV を分割し、それをキーと一緒に使用してシークレットを復号化します。
HTTP Digest Auth ( RFC 2617 ) の記事は、IV/ノンスの使用と必要性を理解するのに非常に役立ちました。
IV では、平文を暗号化して、暗号化されたテキストを攻撃者が解読しにくくすることができます。使用する IV の各ビットは、特定のプレーン テキストから暗号化されたテキストの可能性を 2 倍にします。
たとえば、1 文字の長さの IV を使用して「hello world」を暗号化してみましょう。IV はランダムに選択されて「x」になります。次に暗号化されたテキストは「xhello world」であり、これは「asdfghjkl」などとなります。再度暗号化する場合は、最初に新しい IV を生成し (今回は「b」を取得するとします)、通常どおりに暗号化します (したがって、「bhello world」を暗号化します)。今度は「qwertyuio」を取得します。
ポイントは、攻撃者は IV が何であるかを知らないため、一致する暗号文を見つけるために、特定のプレーン テキストに対して考えられるすべての IV を計算する必要があるということです。このように、IV はパスワードの saltのように機能します。最も一般的には、IV は連鎖暗号 (ストリーム暗号またはブロック暗号) と共に使用されます。連鎖ブロック暗号では、平文の各ブロックの結果が暗号アルゴリズムに渡され、次のブロックの暗号文が検索されます。このように、各ブロックは連鎖します。
では、平文の暗号化にランダムな IV が使用されている場合、それをどのように復号化するのでしょうか? 単純。暗号化されたテキストとともに IV (プレーン テキスト) を渡します。上記の最初の例を使用すると、最終的な暗号文は「xasdfghjkl」(IV + 暗号文) になります。
はい、IV を使用する必要がありますが、必ず適切に選択してください。適切な乱数ソースを使用して作成してください。同じ IV を 2 回使用しないでください。また、一定の IV を使用しないでください。
初期化ベクトルに関するウィキペディアの記事では、一般的な概要が説明されています。