web-dev-qa-db-ja.com

RSA公開指数を1に設定するこのコミットが問題になるのはなぜですか?

Hacker Newsで this commit in SaltStack を見ましたが、それが何をするのか、または元のバージョンが暗号化エラーであった理由を正確に理解していません。 (暗号化の詳細についてもよくわかりません。)

-    gen = RSA.gen_key(keysize, 1, callback=lambda x, y, z: None)
+    gen = RSA.gen_key(keysize, 65537, callback=lambda x, y, z: None)

「1」の選択が置き換えられた理由を誰かが詳しく説明できますか?そして、なぜ「65537」が優れているのでしょうか。

37
James Faulcon

あなたは本質的に3つの質問をしました:

  • このコードは何をしているのですか?
  • 1が悪いのはなぜですか?
  • なぜ65537に置き換えられたのですか?

暗号化のバックグラウンドがあまりないようですので、そこにもいくつかのギャップを埋めようと思います。

このコードは何をしているのですか?

1の元の値が間違った選択であった理由を理解するには、 [〜#〜] rsa [〜#〜] がどのように機能するかについて少し理解する必要があります。

RSAはcryptosystem-キーの生成、暗号化、および復号化を実行する方法-であり、他の人に安全にメッセージを送信できます。 RSAは、public-key cryptosystemsというクラスのメンバーです。メッセージの暗号化はpublicであり、誰でも自由に知ることができます。公開鍵で暗号化されたメッセージを復号化するために使用する鍵は秘密であり、あなただけが知っているため、秘密鍵

南京錠と鍵を公開鍵と秘密鍵のアナログとして想像すると、これが実際のメッセージでどのように機能するかがわかります。

  • ボブはアリスに南京錠(彼の公開鍵)を渡し、鍵を鍵(彼の秘密鍵)に保持します。
  • ここで、アリスがボブにメッセージを送信したい場合、彼女はメッセージをボックスの中に入れ、彼の南京錠をボックスに置き、彼にボックスを送信します。
  • ボブだけが鍵を持っているので、ボブだけが南京錠のロックを解除して箱の中に入ることができます。

キーを実際に生成するには、RSAには次の3つの重要な数値が必要です。

  • 「N」、2つの非常に大きな素数pとqの積
  • 「e」、「公開指数」
  • 「d」、「プライベート指数」

RSAのセキュリティの大部分は、dNが与えられた場合、eが何であるかを理解するのが非常に難しいという事実から来ています。 RSAの公開鍵は、<N,e>の2つの番号で構成され、秘密鍵は<N,d>です。

言い換えれば、ボブの南京錠がどのように見えるかを知っている場合、ボブの南京錠を開くキーをリバースエンジニアリングすることは非常に難しいはずです。

1が悪いのはなぜですか?

1は、ボブの南京錠を開くキーをリバースエンジニアリングするのが非常に簡単になるため、悪い選択です。これは、その逆です。欲しい。

問題のあるセクション全体は次のようになります。

def gen_keys(keydir, keyname, keysize, user=None):
    # Generate a keypair for use with salt
    # ...
    gen = RSA.gen_key(keysize, 1, callback=lambda x, y, z: None)

これは、e = 1でRSAキーを生成するPythonフラグメントです。

Ne、およびdの関係は、次の式で与えられます。

d*e = 1 mod (p-1)(q-1)

ただし、待ってください。SaltStackのようにe = 1を選択すると、問題が発生します。

d = 1 mod (p-1)(q-1)

これで秘密鍵ができました! dが何であるかを理解できるため、セキュリティが破られています。したがって、全員の送信を復号化できます。これにより、南京錠を指定してボブのキーを簡単に取得できるようになりました。おっと。

実際にはそれよりも悪化します。 RSAでは、暗号化とは、公開鍵<N,e>で暗号化するメッセージmを送信することを意味します。暗号化されたメッセージcは次のように計算されます。

 c = m^e (mod N)

したがって、e = 1の場合、m^e = mであり、c = m mod Nがあります。

しかし、m < Nの場合、m mod Nmです。つまり、次のようになります。

 c = m

暗号化されたテキストはメッセージテキストと同じであるため、暗号化はまったく行われません!二重おっと。

うまくいけば、1が悪い選択である理由が明らかになります!

なぜ65537が優れているのですか?

65537は、珍しい、恣意的な選択のようです。たとえば、なぜe = 3だけを選択できなかったのか不思議に思うかもしれません。 eが低いほど、実行する必要のあるものを暗号化するため、暗号化が高速になります。

 c = m^e (mod N)

eが大きい場合、m^eは非常に大きな数になる可能性があります。

65537は主に、既存のハードウェアおよびソフトウェアとの互換性の理由、およびその他のいくつかの理由によるものであることが判明しました。 この暗号化StackExchangeの回答 それを詳細に説明しています。

適切なランダムパディングスキームを使用すると、セキュリティに影響を与えることなく、1以外のほぼすべての奇数の整数を選択できるため、パフォーマンスを最大化するのはe = 3です。

65
John Feminella