web-dev-qa-db-ja.com

セキュリティ上の理由から、RSA公開指数は{3、5、17、257、または65537}のみにする必要がありますか?

私のプロジェクトでは、4451hという公開指数の値を使用しています。 1つの商用RSA暗号化ライブラリを使い始めるまでは、安全で大丈夫だと思いました。このライブラリでこの指数を使用すると、例外がスローされます。

このライブラリの開発者に問い合わせたところ、「この機能は、RSAキーへの攻撃を防ぐためのものです。その結果、指数値は{3、5、17、257、または65537}に制限されます。このチェックを無効にすると、リスクが大きいため、まだ調査中です。」

RSAの破壊に{3、5、17、257、または65537}以外の値が使用されていると聞いたのは、私の人生で初めてです。私は、不適切なパディングが脆弱である3のみを使用することを知っていました。

本当にそうですか?確かに、別のライブラリを使用することはできますが、そのような答えの後、私は自分のソリューションのセキュリティについて心配しました。

70

すべての素数p-1の公約数が「正しい」(つまり、すべての素数pモジュラスを分割します)。

If小さな指数を使用する場合and暗号化にパディングを使用しない場合andまったく同じメッセージをいくつかの異なる公開鍵で暗号化すると、メッセージが危険にさらされます:ife = 3、そしてメッセージを暗号化しますm 公開鍵n1n2およびn、次にc = mmodnfori = 1 to3。By 中国の剰余定理 、その後、再構築できますmmodn12、これはmであることが判明(モジュロなし)nのため12はより大きい整数です。 (非モジュラー)キューブルート抽出では、mを抽出するだけで十分です。

ここでの弱点は、小さな指数ではないです。むしろ、暗号化に不適切なパディング(つまり、パディングがまったくない)を使用しているためです。埋め込みは、暗号化であろうと署名であろうと、RSAのセキュリティにとって非常に重要です。適切なパディング( PKCS#1 で説明されているものなど)を使用しない場合、多くの弱点があり、上記の段落で概説されているものは最大のものではありません。それにもかかわらず、誰かが指数サイズ関連の弱点に言及するときはいつでも、彼は多かれ少なかれ直接この出来事に言及します。これは少し古くて不正確な知識であり、big指数の禁止に逆にされることがあります(これは神話なので、逆神話も神話であり、それ以上ではありません- -そしてそれ以下-実証済み);これはあなたがここで観察していることだと思います。

ただし、大きな公的指数を回避する理由はいくつかあります。

  • 小さな公開指数は効率を向上させます(公開鍵操作の場合)。

  • 小さなprivate指数を持つことにはセキュリティ上の問題があります。プライベートな指数の長さがパブリックな指数の長さの29%を超えない場合のキー回復攻撃が説明されています。秘密指数を強制的に短くしたい場合(例えば、秘密鍵の操作を高速化するため)、多かれ少なかれ大きな公開指数(モジュラスと同じ大きさ)を使用する必要があります。したがって、公的指数を短くすることを要求することは、一種の間接的な対策と見なすことができます。

  • 広く展開されている一部のRSA実装は、大きなRSA公開指数を窒息させています。例えば。 WindowsのRSAコード(CryptoAPI、HTTPSのInternet Explorerで使用)は、単一の32ビットWord内の公開指数のエンコードを要求します。より大きな公開指数を持つ公開鍵を処理することはできません。

それでも、「リスクは大きいかもしれません」は一般的な正当化のように見えます(「これはセキュリティの問題です」は、「実装しなかったが、どんな怠惰も認めたくない」という通常の言い方です)。

64
Thomas Pornin

開発者は単に間違っています。指数0x4451(10進数の17489)には何の問題もありません。セキュリティ上の問題は発生しません。

昔、人々は同じ指数を複数の受信者に送信することでThomas Porninが説明した攻撃のために、小さな指数が問題であると考えていました。しかし、今日、指数はそれとは何の関係もないことを理解しています。問題は不適切なパディングでした。これらの攻撃は、パディングを適切に使用することによって防止されます。塩の価値がある暗号ライブラリは、適切なパディングを使用するほうがはるかに優れています(そうしないと、はるかに悪い問題が発生します)。

したがって、暗号ライブラリがその指数の使用をフラットに禁止する正当な理由はありません。

とはいえ、パフォーマンスの観点からは、指数が小さいほどパフォーマンスは向上します。最良の選択はe = 3です。これは最高のパフォーマンスを提供し、既知のセキュリティ上の問題がないためです。 (実際には、e = 2の方が少し優れています。これは、Rabin暗号化とも呼ばれます。ただし、そのスキームはあまり知られていないため、わずかに異なるコードが必要なため、広く使用されていません。)

21
D.W.

これらの5つの数値は Fermat素数 です。

彼らは2の形なのでk + 1、暗号化はme =m・((m22...k...)2一般的な場合 の場合、同様のサイズの指数を持つ指数よりも単純で高速です。

それらは素数なので、eが(pと素素であるというテスト− 1)(q− 1)は、eというテストにすぎません分割しません。

したがって、これはセキュリティよりも速度や慣習についての可能性が高いです。効率的であることに問題があるというわけではありません。しかし、確かに、 その他の答え が示唆するように参照を求めてください。

this post も参照してください。

19
aaz

RSA鍵の公開指数が{3,5,17,257,65537}のセットにのみ含まれる必要がある理由を私は知りません。ご指摘のとおり、実装エラーの悪影響(不適切なパディングなど)が大きくなる可能性があるため、3や5などの小さな指数を使用するとリスクが高くなります。 NISTは2 ^ 16より大きい公開指数のみを許可しますが、それらの決定の理由はわかりません。

使用するライブラリの開発者からの回答に満足して、具体的なリファレンスを求めてはいけません。多くの場合、一部の論文は誤解されていました。たとえば、一部の開発者がPhong Nguyenによる「暗号化ソフトウェアを信頼できますか?GNU Privacy Guard v1.2.3の暗号化欠陥」という論文のセクション4を読んで、誤った結論に達したと想像できます。上記のようなものです。このペーパーでは、GnuPGによって生成された公開鍵が65539などの異常な値であることが判明した場合、攻撃者は秘密鍵について少しの情報を学習します。GnuPGの鍵生成アルゴリズムは、 65539は悪い公開鍵ではありません。

8
Accipitridae

公開指数の他の値が脆弱であることへの言及は見つかりませんでした。 RSA.comのRSAアルゴリズムへのガイド によれば、パフォーマンス上の理由から、2の累乗に近い公開指数を使用することをお勧めします

Wikipedia によれば、NISTは65537より小さい公開指数を許可していません。これは、指数が適切に埋め込まれていない場合、指数が小さいことが問題になるためです。

7
Andreas Arnold