web-dev-qa-db-ja.com

暗号化と一緒に初期化ベクトル(IV)を使用する必要がありますか?

初期化ベクトル を使用してデータを暗号化/復号化することをお勧めしますか?それは物事をより安全にしますか?ケースバイケースで評価する必要があるものの1つですか?

これを実際のコンテキストに当てはめると、Win32暗号化関数 CryptSetKeyParam を使用すると、暗号化/復号化の前にキーに初期化ベクトルを設定できます。他のAPIでもこれが可能です。

一般的に推奨されるものとその理由は何ですか?

37
Scott Saad

同じキーを使用して複数のメッセージを暗号化する可能性がある場合は、IVが不可欠です。

その理由は、ほとんどの暗号化モードでは、同じキーで暗号化された2つのメッセージを一緒に分析できるためです。たとえば、単純なストリーム暗号では、同じキーで暗号化された2つの暗号文をXORすると、2つのメッセージのXORになり、従来の暗号解読技術を使用して平文を簡単に抽出できます。

弱いIVは、WEPを壊れやすくした理由の一部です。

IVは基本的に、いくつかの一意の非秘密データをキーに混合して、同じキーが2回使用されるのを防ぎます。

25
Andrew

ほとんどの場合、IVを使用する必要があります。 IVは毎回ランダムに生成されるため、同じデータを2回暗号化すると、暗号化されたメッセージが異なり、この2つのメッセージが同じであるかどうかをオブザーバーが判断することはできません。

9
Serge Khorun

CBCモードの写真(以下を参照)をよく見てください。 IVを知っている攻撃者は、暗号文の前のブロックを知っている攻撃者のようなものであることがすぐにわかります(もちろん、彼らはすでにそれを十分に知っています)。

私が言うことは次のとおりです。IV= 0の「問題」のほとんどは、データの整合性を保証しない場合のブロック暗号化モードの一般的な問題です。あなたは本当に完全性を確保しなければなりません。

私がしていることは次のとおりです。強力なチェックサム(暗号化ハッシュまたはHMAC)を使用し、暗号化する前にプレーンテキストの前に追加します。暗号文の既知の最初のブロックがあります。これは、チェックサムのない同じもののIVであり、他の100万の理由でチェックサムが必要です。

最後に、CBCとストリーム暗号の類似性は、ひどく洞察に満ちた私見ではありません。

CBCモードの写真を見るだけで、嬉しい驚きを感じると思います。

これが写真です:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

リンクテキスト

5
Purfideas

同じキーが複数の異なるシークレットに複数回使用されると、暗号化された結果にパターンが現れる可能性があります。 IVは、疑似ランダムであり、各キーで1回だけ使用される必要があり、結果を難読化するためにあります。同じIVを同じキーで2回使用しないでください。使用すると、目的が損なわれます。

IVを追跡する必要がないための最も簡単な方法は、結果の暗号化されたシークレットの前に追加するか、追加することです。そうすれば、それについてあまり考える必要はありません。そうすれば、最初または最後のNビットがIVであることが常にわかります。

シークレットを復号化するときは、IVを分割し、それをキーと一緒に使用してシークレットを復号化します。

2
Molibar

HTTPダイジェスト認証( RFC 2617 )の記述は、IV /ナンスの使用と必要性を理解するのに非常に役立ちました。

2
Peter Stone

ケースバイケースで評価する必要があるものの1つですか?

はい、そうです。使用している暗号と、入力がどのように見えるかを常に確認してください。一部の暗号はIVを使用しませんが、安全であるためにソルトを必要とします。 IVの長さはさまざまです。暗号のモードは、IVの使用目的(使用されている場合)を変更し、その結果、セキュリティで保護する必要のあるプロパティ(ランダム、一意、増分?)を変更できます。

ほとんどの人は「暗号ブロック連鎖」と呼ばれるモードでAES-256または同様のブロック暗号を使用することに慣れているため、一般的に推奨されます。これは、多くのエンジニアリング用途に適した、賢明なデフォルトの頼みの綱であり、適切な(繰り返しのない)IVが必要です。その場合、それはオプションではありません。

1
Rushyo

IVを使用すると、平文を暗号化して、暗号化されたテキストを攻撃者が解読しにくくすることができます。使用するIVの各ビットは、特定の平文から暗号化されたテキストの可能性を2倍にします。

たとえば、1文字の長さのIVを使用して「helloworld」を暗号化してみましょう。 IVは「x」になるようにランダムに選択されます。次に暗号化されるテキストは「xhelloworld」であり、「asdfghjkl」と表示されます。再度暗号化する場合は、最初に新しいIVを生成し(今回は「b」を取得するとします)、通常のように暗号化します(したがって、「bhelloworld」を暗号化します)。今回は「qwertyuio」を取得します。

重要なのは、攻撃者はIVが何であるかを知らないため、一致する暗号文を見つけるために、特定のプレーンテキストに対して可能なすべてのIVを計算する必要があるということです。このように、IVは パスワードソルト のように機能します。最も一般的には、IVは連鎖暗号(ストリーム暗号またはブロック暗号)とともに使用されます。連鎖ブロック暗号では、平文の各ブロックの結果が暗号アルゴリズムに送られ、次のブロックの暗号文が検索されます。このようにして、各ブロックは一緒にチェーンされます。

では、平文の暗号化にランダムIVを使用している場合、どのように復号化しますか?シンプル。暗号化されたテキストと一緒にIV(プレーンテキスト)を渡します。上記の最初の例を使用すると、最終的な暗号文は「xasdfghjkl」(IV +暗号文)になります。

はい、IVを使用する必要がありますが、適切に選択するようにしてください。適切な乱数ソースを使用して作成します。同じIVを2回使用しないでください。そして決して定数IVを使用しません。

初期化ベクトル に関するウィキペディアの記事は、一般的な概要を提供します。

0
John