web-dev-qa-db-ja.com

簡単に言えば、RSA OAEPおよびRSA PSSとは

グーグルまたはYouTubeを使用した後も、RSA OAEPおよびRSA PSSに関する情報が見つかりません。誰かが私にそれを簡単な言葉で説明できますか? RSAは公開鍵と秘密鍵です。 OAEPやPSSのような多くのバリアントがあるのはなぜですか?

16
Killney

「教科書」/「生」/「パッドなし」RSAには「おっと、現実の世界が起こった」という問題があります。

モジュラスが4096ビットのRSA鍵を検討してください。誰かがそのキーで暗号化されたメッセージを復元することはほぼ不可能であるべきですよね?このキーの公開指数値(e)が_3_であると仮定します。

アリスがこの公開鍵を使用してボブへのメッセージ「いいえ」を暗号化する場合、彼女は次のようなことをします

  • _"No"_ => ASCII("No") => _0x4E 0x6F_ => _m=0x4E6F_。
  • c = POW(0x4E6F, 3) MOD n => _c = 0x75CCE07084F MOD n_。
    • nは4096ビットの数値(指定)であるため、_0x75CCE07084F_よりも大きいため、_c=75CCE07084F_です。

マロリーは_[506 0x00s] 07 5C CE 07 08 4F_の送信を確認します。 「うーん」と彼女は思った、「それは疑わしい量のゼロだった」。彼女は_calc.exe_をプログラマモード(hex)で起動して_75CCE07084F_を入力し、それを10進数(_8095174953039_)に切り替えます。彼女はそれをScientificモードにコピーして貼り付け、キューブルートボタン(_20079_)を押します。彼女は整数解にこだわり、コピー/貼り付けモード切り替えダンスを実行して、16進数に戻ります(_0x4E6F_)。彼女はさらにASCIIチャートをチェックし、メッセージが英語の単語「いいえ」であった可能性が高いことを再構築します。マロリーは秘密鍵を使用せずにこのメッセージを回復しました。

何が悪かったのか?

メッセージと指数の組み合わせにより、モジュラス演算が不要になりました。 n番目の根を計算するのは楽しいことではありませんが、扱いにくい問題ではありません。

_e=3_の場合、モジュラス演算は、長さがキーのサイズの3分の1未満のmには関係しません。 4096ビットのキーの場合、これは、キーが関連していないため、すべてのm <= 170バイトがすぐに回復可能であることを意味します。

それを修正するには?

1つの方法は、公開指数の最小サイズを増やすことです。ただし、RSAの教科書にある二次的な問題は解決しません。同じメッセージを同じキーで暗号化して送信するのは毎回同じです。

もう1つの方法は、mが常に「ほぼn」になるようにすることです。通常のメッセージを受け取り、それを元に戻すことでこれを達成できるように見えますが、a)nを超える可能性があり、b)mが多数の0x00で終了すると失敗します。 (それでも決定論の問題は解決されません)。

したがって、考え出された解決策は、常にメッセージに「パディング」して、いくつかの高ビットが設定されていること、およびすべての累乗が係数値を使用することを確認することでした。

PKCS1パディングを入力してください

PKCS#1(暗号化)パディングは次のようになります

_00 02 [a bunch of non-zero random bytes] 00 [the message]
_

ゼロ以外のランダムバイトの数は、サイズが_(keysize + 7) / 8_バイトのバッファに完全に収まるように必要な数です(8で除算して切り上げ)。仕様によると、最小値は8です。これは、任意のメッセージの同じ暗号化された値を生成する可能性が_2^64_の1つであることを意味します。これは、一意性のかなり良い確率です。また、メッセージが短いほど、重複する可能性は低くなります。

このメッセージの「サイズ」は4096-6 = 4090ビットです。 3番目にすると、4090 * 3 = 12270ビットの領域で回答が生成されます。これは間違いなく4096ビットのモジュラスを超えるため、modが確実に含まれるようにします。また、メッセージを簡単に復号化できないようにするという当初の目標も解決しました。

何がこれ時間間違っていましたか?

間違った答えは「正常に復号化」できることがわかりました。メッセージCは、オッズのある4096ビットのキーkに対して有効です。

_1/256 * 1/256 * (255/256)^8 * (1 - (255/256)^502)
_

(「最初のバイトはゼロ」、「2番目のバイトは2」、「8バイト内にゼロは表示されない」、「最終的にゼロが表示される」)

_0.004 * 0.004 * 0.996^8 * (1 - 0.996^502)
0.004 * 0.004 * 0.969 * (1 - 0.140)
0.004 * 0.004 * 0.969 * 0.860
1.27e-5
_

したがって、78千メッセージごとに約1が「有効」ですが、誤りです。これはボブを混乱させ、ボブに愚かなことを言わせることができます。イブ(マロリーよりも多くの自由時間がある)が彼女が望んでいるなら、今度はボブを巧妙な意味不明な言葉で送信し始め、混乱していると彼が言ったときにそれを観察できます。 ( ブライチェンバッハー攻撃(Crypto.SE)

OAEPパディングを入力してください

OAEPパディングはもっと複雑です( https://tools.ietf.org/html/rfc3447#section-7.1 )。それはそのような方法で構築されます

  • 本当に高いビットはまだ常に設定されています
  • ランダム性は引き続き注入されるため、非決定性は保持されます
  • 復号化操作は、the正解(vs「多分正しい」という回答)が得られたかどうかを判断できます。

OAEPは、「正確性」プロパティをハッシュアルゴリズムに依存しているため、優れたハッシュアルゴリズムが使用されている限り、トリッキーな二次回答がないことを意味します。

さて、署名についてはどうですか?

同様の(ただし異なる)引数を使用すると、教科書RSAからPKCS#1署名パディングへと進みます。

PKCS#1からPSSへの移行は、説明が少し難しいです。 RFC 3447 から引用するには:

このドキュメントでは、付録付きの2つの署名方式、RSASSA-PSSおよびRSASSA-PKCS1-v1_5を指定しています。 RSASSA-PKCS1-v1_5に対する攻撃は知られていないが、堅牢性を高めるために、RSASSA-PSSは新しいアプリケーションで最終的に採用することをお勧めします。 RSASSA-PKCS1-v1_5は、既存のアプリケーションとの互換性のために含まれており、新しいアプリケーションには引き続き適切ですが、RSASSA-PSSへの段階的な移行が推奨されます。

PSSは、署名生成プロセスにランダム性を追加し、検証中にランダム性を削除/検証する方法論を追加します。

結論

プリミティブRSA操作は、必要な処理を実行し、数値を別の数値に変換します。これを最初の数値に戻すことができます。重要なサフィックスを「安全に」するには、関数への入力に少し制約を課す必要があります。パディングアルゴリズムはこれらの制約を提供します(新しい制約が学習されると、新しいパディングアルゴリズムが発明されます)。

40
bartonjs