既知のプレーンテキスト攻撃を防ぐために、RSAを介して暗号化するメッセージにパディングする場合は、OAEPを使用することをお勧めします。
誰かがこれをより詳細に詳しく説明できますか?具体的には、前のスキームの弱点を、理論的観点と実際的/現実的な観点の両方から知りたいです。
RSAのコアでの演算は、モジュラー指数です。与えられた入力m、計算meモジュロn。 一般的にこれは、整数モジュロnの一方向置換ですが、一般的な非対称暗号化に必要なすべての特性を満たしているわけではありません。
eが小さく、mが小さい場合、-meはnよりも小さい可能性があります。この時点で、指数剰余はモジュラーではなくなり、効率的に元に戻すことができます。
操作は確定的であり、徹底的な検索が可能ですメッセージ上:実際の暗号化されたメッセージとの一致が見つかるまで、攻撃者は可能なメッセージを暗号化します。
べき乗剰余は順応性があります:mの「暗号化」を考えると1およびm2、単純な乗算はm1メートル2。これは 準同型暗号化 に似ており、コンテキストに応じて適切なプロパティとなる場合とそうでない場合があります。
これらの理由により、RSAの対象となる整数mは、単独で暗号化するデータであってはなりませんが、-mが "not"であることを保証する変換の結果である必要があります小さい」、いくつかのランダムなバイトが含まれ、順応性を抑止します。
PKCS#1の「v1.5」パディングは、2つの(既知の)警告に従って、適切に機能します。
攻撃者が悪意のあるメッセージを送信して復号化し、復号化エンジンが正しいパディング構造を見つけたかどうかを確認できる場合、復号化エンジンを パディングOracle に変えることができます。これはSSLサーバーに対して機能するブライチェンバッハーの攻撃であり、SSL対称鍵を回復するために約100万の中止されたハンドシェイクを必要とします。 SSLサーバーにはパッチが適用されています(復号化でパディングが見つからない場合でも、エンジンは「プレマスターシークレット」ではなくランダムなblobを続行します)が、これはPKCS#1 v1.5の潜在的な問題を浮き彫りにします。
このパディング方式は「証明された」ことがありませんでした。セキュリティ証明は、きちんと整える必要があります。私の意見では、このパディングはより良いものになりました。それは、フィールドで展開され、ほぼ20年間広く使用されていることです。しかし、経験を裏付けるいくつかの数学があるとき、多くの人々はそれを好みます。
[〜#〜] oaep [〜#〜] は、これらの2つの点で状況を改善することを目的としています。オラクルのパディングについては、 物事はそれほど明確ではありません ;そして、最初の証明は、Shoupによって幾分間違っていることが示されました。証明は、RSAの場合、藤崎、岡本、Pointcheval、およびSternによって「修復」されました(OAEPは、一般的なパディングスキームとして設計されましたが、RSAを使用した場合にのみ、セキュリティの証明ができました)。
要約すると、OAEPは以前のパディングを改善してchosen ciphertext attack(not chosen平文攻撃:公開鍵は公開されているため、誰でも自由に暗号化できます)が、v1.5のパディングは既にヒューリスティック 100万個程度の復号化に適しています。多くの目的には十分であり、他の目的のためにパッチを適用できます(SSLの場合と同様)。 OAEPの方が優れています正しく実装されている場合、これは通常信じられているほど簡単ではありません。
私はもっと深く掘り下げたかったので、ダニエルブライチェンバッハによるRSA暗号化標準PKCS#1に基づくプロトコルに対する選択された暗号文攻撃を読んでしまいました。
主な弱点は、PKCS#1パディングによっていくつかの仮定を行うことができるためです。これらの仮定は、攻撃を設計するために悪用される可能性があります。紙をチェックしてください、それは巧妙な攻撃です!攻撃は4つの段階で構築され、各段階で前の段階よりも多くの情報が段階的に抽出されます。これは非常に反復的ですが、実用性の範囲内です(通常のSSLセッションキーの場合は1日)。
ステージ2〜4のラッチ/ナローイングは、次の2つの理由により可能です。
特に有限体の整数の逆数を使用すると、指数関数を非常に快適に操作できます。これは、RSA /モジュラー指数自体のプロパティであり、パディング自体ではありません。たとえば、論文の1つの引用:
暗号文cの復号化m = c ^ d(mod n)を見つけようとする攻撃者は、ランダムな整数sを選択し、無害に見えるメッセージc '=(s ^ e)* c mod nの復号化を要求できます。 。答えm '=(c')^ dから、m = m's ^ −1(mod n)なので、元のメッセージを簡単に復元できます。
選択した暗号文とリモート側の復号化結果との間の直接的な数学的関係をマッピングできます。これは同型であり、入力に対する操作で出力に対して同じ操作が生成されます。正確な結果はわかりませんが、「値はわかりませんが、以前の値の2倍になりました」と推測できます。実際の値自体は、範囲を描画してから、範囲を繰り返し狭めることでわかります。
OAEPは、RSA復号化(モジュラ指数)とパディングチェックの間にハッシュ(アンバランス型Feistelハッシュ)を追加するため、状況を少し変更します。これは基本的に上記の#2ポイントを混乱させ、ステージ1からの知識を渡すことができないため、攻撃はステージ2-4に進むことができません-OAEPからのハッシュは、リモートパーティが見ているものを理解する能力を大きく歪めます OAEPデコード 。可能な唯一の方法は、ハッシュ関数を決定論的に反転させて、情報収集段階を進めることができる場合です。しかし、それはハッシュが壊れていることを意味します。
つまり、RSAは悪意のあるものです。つまり、攻撃者は制御された方法でメッセージを変更できます。つまり、既知の定数を掛けます。その結果、うまくいけばこれを防ぐために、ある種のパディングが必要です。攻撃者から「このメッセージは何ですか?」と尋ねられたくないのです。彼に別のメッセージを解読するために必要な情報を提供します。 (他の攻撃があります:調査は http://crypto.stanford.edu/~dabo/papers/RSA-survey.pdf )
エルゴパッドが必要です。最初のパディング方式では、最初に定数バイト、次にランダムな非ゼロバイト、次にゼロバイトが配置され、残りの数はメッセージでした。これは良さそうだった。
悲しいことに、これは、攻撃者がrMの最初のバイト、Mが任意のメッセージ、rが任意の数である定数であるかどうかを知ることができることを意味します。これは、90年代後半に遡るように、キーを因数分解するのに十分であることがわかります。 www.bell-labs.com/user/bleichen/papers/pkcs.psが論文です。
SSL v3.0は安全ではなく、他のいくつかの展開されたプロトコルも安全ではなかったため、これはかなり深刻な問題になりました。