web-dev-qa-db-ja.com

RSAキーペアは一意ですか?

主に次のコマンドを使用して、RSAキーペアを生成します。

ssh-keygen -t rsa -b 4096 -C "[email protected]"

公開/秘密RSA鍵ペアを生成します。このコマンドを繰り返し実行すると、異なるキーペアが表示されます。

  1. ssh-keygenは一意です(この時点では衝突を考慮していません)?

  2. はいの場合、ssh-keygenさまざまな人がさまざまなタイミングで生成するすべてのキーペアが一意であり、同じものにならないことを保証しますか?

  3. いいえの場合、鍵ペアの一意性はどの要素に依存しますか?キー長スペース以外、および [〜#〜] prng [〜#〜]

6
anand

Ssh-keygenが生成するすべての鍵ペアは一意になりますか(現時点では衝突を考慮していません)?

はい、すべての鍵ペアは一意であり、確率は99.99999%をはるかに上回ります。これは主に、キースペースのサイズと使用されるCSPRNGの品質によるものです(以下を参照)。

はいの場合、ssh-keygenは、さまざまなユーザーがさまざまなタイミングで生成したすべての鍵ペアが一意であり、同じものにならないことをどのように保証しますか?

そのような保証はありませんが、とにかく一意であることが効果的に保証されています。これは、OSが高品質のCSPRNG(Cryptographically Secure Pseudo-Random Number Generator)アルゴリズムを使用しているためです。これは、出荷時よりもはるかに信頼性が高い(つまり、予測不可能)アルゴリズムですPRNGほとんどの言語で使用できます。

いいえの場合、鍵ペアの一意性はどの要素に依存しますか?キーの長さのスペースとPRNG以外。

一意性は [〜#〜] csprng [〜#〜] に由来し、「通常の」PRNGではありません。違いはエントロピーの選択です。

A PRNGは単にシードを取ります(通常、プログラマが怠惰な場合は「0」、またはtime()からなどの任意のメジャー)、何かがビットを要求するたびにビットをシャッフルします、その後、より多くのシャッフルを実行します。出力が一定期間観察されるまでランダムに見えるだけです。その時点で、(a)使用されたシード、および(b)次の無限の出力数を決定できます。その特定のPRNGから観察されます。

対照的に、CSPRNGは、実行時間が長くなるほどエントロピーを構築します。これは、複数のデバイスから定期的に読み取りを行い、受信データにかなり複雑な抽象化を適用して、「ランダム」ビットのプールを生成することによって行われます。これは、この回答をロードしたときにLinuxのフレーバーを実行している場合、この回答の一部がエントロピープールに浮動している可能性があることを意味します(とにかく使用されるまで)。

もちろん、これらのビットは論理的にはランダムですが、コンピュータには実際には「ランダム」なことを実行する機能はありません(常に正確に与えられた指示に従います)が、汎用アルゴリズムがないという意味ではランダムです。人または機械のいずれかによって考案されたものは、元のエントロピー数を決定することを期待できます。これは、乱数が生成されるときに常に補充されます。

コンピューターはネットワーク、ディスクなどからさまざまなタイプの入力をかなり予測できない順序で受信するため(待ち時間、再試行、その他のハードウェアの物理的特性のため)、2つのシステムを完全に同期させることは不可能です。 CSPRNGも同期します。同様に、文字どおりにカーネルをデバッグしていない限り、CSPRNGの出力を予測することは不可能であり、そうするか、または現在の状態を報告しようとすると、CSPRNGの状態が変化します。

もちろん、公式文書はこれについては非常に明確です。鍵が2回生成されることはないということを証明する方法がないため、これはすべて理論的なものです。ただし、オッズは、重複していたランダムなキーを見つけることに対して信じられないほどスタックされており、実際には不可能であるとも言えます。

8
phyrfox