(この質問がここではなく暗号に属しているという合意がある場合は、遠慮なく[私に教えて]移行してください。)
私が読んだ内容(特に暗号ブロックチェーンモードのAESを見ると)から、初期化ベクトルは繰り返されないか、状況によっては少なくとも完全に予測不能になるはずです。次の「弱体化」IVシーケンスを考えると、
暗号的に健全な乱数
古い「乱数」
非繰り返しで単調に増加する非連続カウンター(高解像度クロックなど)
1行1列のカウンターで、保護されたデータの期待される有用性の約10倍になることはありません。
定数IV
すべてゼロのIV
さて、IVを弱めると、どのような攻撃が可能になり、弱体化のどの段階になりますか?私は特に、「保存」された状態で、認証なしでデータを保存することに特に関心があります。
2つの優れた回答の後、考えられる攻撃に関して、質問を少し精緻化したいと思います。ここに私のパズルのいくつかのピースと補足的な質問があります:
暗号化されたデータはクレジットカード番号です。
たとえば、クライアントのレコードがあり、各クライアントのカードがそのクライアントのレコードに関連付けられているとします。
私の主な最終目的は、クレジットカード番号を平文で漏らさないことです。
さて、私の補足的な質問は次のとおりです。私が見る限り、攻撃者が一定のIVで行うことができるすべてのことは、「アハ、クライアントAとクライアントBは同じクレジットカードを使用する」と言うことです。それでどれだけのダメージを与えることができますか?
CBCには2つの明確な「危険」があります。 CBCは次のように機能することに注意してください。ブロックを暗号化するには、最初にXORそれを前の暗号化ブロックと一緒に使用します。IVは、最初に暗号化するブロックの「以前の暗号化ブロック」にすぎません。アイデアは、ブロック暗号は決定論的な順列であるということです。同じキーと同じ入力ブロックを使用すると、同じ出力が得られます。前の暗号化ブロックを使用したXORは、「ランダム化」を意味します。したがって、危険は次のとおりです。
ブロック衝突は、不運または無作為性の欠如により、前のブロックとのブロックのXORが、事前に取得済みの値につながる場合です。
たとえば、固定IVを使用する場合(すべてゼロかどうかは関係ありません)、同じバイトシーケンスで始まる2つのメッセージは、でもある2つの暗号化ストリームを生成します同じバイトシーケンスで開始します。これにより、部外者(「攻撃者」)は、2つのファイルがある程度まで同一であったことを確認できます。これは、ブロックの細かさで特定できます。これは悪いことだと考えられています。暗号化は、このような種類のリークを防ぐことになっています。
counterをIVとして使用する場合、カウンターには構造があり、「通常の」データalsoにも構造。極端な場合として、暗号化されたメッセージもカウンターで始まると仮定します(たとえば、メッセージにシーケンス番号で始まるヘッダーが含まれるプロトコルの一部です):IVのカウンターとそのカウンターは互いにキャンセルされる場合がありますXORを使用すると、固定IVの状況に戻ります。これは悪いです。私たちは本当に暗号化システムがプレーンテキスト形式に関するいくつかの複雑な要件を必要とせずに機密性を提供するときにそれを好みます。 「カウンター」として高解像度の時計でも同じ問題が発生する可能性があります。
Chosen-plaintext attackは、暗号化されるデータの一部を攻撃者が選択できる場合です。 CBCでは、攻撃者がIVを予測できる場合、プレーンテキストデータを調整してそれに一致させることができます。
これが BEAST攻撃 の基礎です。 BEAST攻撃では、攻撃者はSSLを「シースルー」しようとします。 SSL 3.0およびTLS 1.0では、各レコードはCBCで暗号化されており、各レコードのIVは前のレコードの最後の暗号化されたブロックです:攻撃者がワイヤーとの位置を監視していますストリームにデータを入力するには、レコードの放出をトリガーするのに十分なバイトをプッシュし、それを観察して、次のレコードに使用されるIVを推定します。そのIVの内容は、攻撃者がプッシュする次のバイトで始まります。
表示するすべてのIV生成方法のうち、最初の1つ( 暗号的に強力なPRNG で生成されたIV)のみが、選択された平文攻撃から保護します。これは TLS 1.1 に追加されたものです。
データベース内のクレジットカードのような特定の状況では、可能な攻撃の一部が適用される場合と適用されない場合があります。ただし、「手抜き」をしすぎないようにしてください。ユーザーデータをデータベースに入れると、選択平文攻撃が適用される可能性があります。たとえば、SQLインジェクション技術を使用してデータベースを見ることができる攻撃者は、「基本ユーザー」として振る舞い、偽のクレジットカード番号を提供する可能性があります。 、データベースに何が表示されるかを確認するだけです。
特に、そのシナリオで、確定的暗号化を使用する場合(そして、それが固定IVで得られるものであり、すべてゼロかどうかにかかわらず)、攻撃者は単純にブルートフォース クレジットカード番号 :数値は16桁ですが、そのうちの1つはチェックサムであり、最初の4桁または6桁は銀行のものであり、残りの1桁は必ずしも「ランダム」ではありませんなので、そのような種類の攻撃は効果的です。
結論として、CBCを使用する場合、必須 CBCを使用適切に、つまり、非常にランダムなIVを使用します。単調なカウンター(またはクロック)を使用する場合は、CBCを使用しないでください。代わりに、単調なカウンターで完全に満足できることがわかっているモードを使用してください。 [〜#〜] gcm [〜#〜] 。この本で暗号アルゴリズムが使用されている場合、セキュリティを達成するのはすでに十分難しいため、ここでの「創造性」は排除する必要があります。
そしてもちろん、特定のキーで暗号化されたコンテンツは、キー自体と同じくらい秘密ではありません。攻撃者がデータベースへの読み取りアクセス権を持っている場合、可能性がありますは、データベース以外、特に暗号化キー自体への読み取りアクセス権を持っている可能性があります。これは、キーを格納する場所、および攻撃者のアクセスの範囲(SQLインジェクション、盗まれたバックアップテープ、フロントエンドシステムの完全なハイジャックなど)によって異なります。
IVを使用する主な理由は、同じプレーンテキストが同じ暗号化テキストを2回生成するのを防ぐためです。 CBCでは、テキストをブロックで暗号化します。次のテキストがあり、各行がブロックであるとします。
AAAAAA
BBBBBB
CCCCCC
DDDDDD
そして
AAAAAA
CCCCCC
EEEEEE
FFFFFF
IVを使用しない場合、AAAAAA
の暗号化ブロックは両方のテキストで同じになります。これは、暗号化されたブロックが暗号化されたファイルの先頭で同じであることに誰かが気づいた場合、彼は最初に他のファイルが何から始まっているかを知っていることを意味します。
IVの背後にある考え方は、それを2回使用しないことです。一意である必要があります。一意ではなく、再利用する可能性がある場合、既知のプレーンの暗号化されたバージョンとの類似性が原因で、プレーンテキストの一部を回復できるという前述の状況に遭遇する可能性があります。テキスト。
これらを1つずつ見ていきましょう。
暗号的に健全な乱数
衝突が統計的にありそうにないと仮定すると、あなたはかなり安全です。独自性は私たちが目指しているものです。
古い「乱数」
ランダム性自体はそれほど重要ではありません。衝突の可能性があります。 RNGに短期間または統計的に可能性の高い結果(つまり、不均一な分布)のような問題がある場合、衝突抵抗を損ない、CBCを弱める可能性があります。
非繰り返し、単調増加、非連続カウンター(高解像度クロックなど)
100%繰り返されておらず、複数のマシンが通信している(クロックが同期されている可能性があることに注意してください)状況ではない場合、比較的安全です。繰り返しますが、問題はIVの再利用であるため、同じクロックを持つ2台のマシンがあると、このモデルで統計的に妥当な衝突が発生する可能性があります。
1行1列のカウンター、繰り返されないように十分に大きい、たとえば保護されたデータの期待される有用性の10倍
絶対に問題ありません。任意のギブキーのグローバルな一意性要件のカウンター要素を想定します。
定数IV
IVがわかっている場合(これは想定されているはずです)、これはCBCを完全に破壊します。すべての意図と目的でIVを単に無視できます。
すべてゼロのIV
繰り返しますが、これはCBCを壊しますが、それは一定だからです。キーごとに1つのメッセージに対して1回だけ使用される場合でも、それは安全です。 IVの内容は特に重要ではありません。キーごとに一意である必要があります。