セキュリティとcrpytoは初めてですが、使用するアルゴリズムに応じて、公開鍵と秘密鍵が異なる方法で生成されることを知っています。
しかし、RSAをインスタンスとして取り上げましょう(素数を使用)、
アルゴリズムはランダムに、または構造化された方法でキーを生成しますか?
つまり、公開鍵/秘密鍵を要求すると、アルゴリズムは次のようになります。
-ランダムな素数を生成してから、それらから公開/秘密鍵を生成しますか?または
-たとえば、以前に生成したすべてのキーを含むデータベースがあり、新しいキーをそれらと比較して衝突を回避しますか?
または、生成された公開/秘密鍵がこれまで生成されたことがないことをどのように保証できますか?
ランダムプライム生成の仕組みは、特定のサイズ(2048ビットなど)の巨大なランダムな奇数を生成することです。次に、素数性がチェックされます。素数でない場合は、2ずつ増分され、再度チェックされます。これが素数であることが見つかるまで繰り返されます。これについては、 別の回答 で詳しく説明します。
2つの秘密鍵が同じになるのを防ぐ具体的なことは何もありませんが、その確率は非常に低く、無関係です。衝突を明示的に回避する理由はありません。これは、システムに乱数の適切なソースがあることを前提としています。バグのある乱数ジェネレータまたはランダム性の低いソースを備えた組み込みシステムは、素因数を共有するRSAモジュラスを生成する可能性があり、最大のものをチェックすることで 簡単な暗号解読 につながります2つの係数間の共通の分母であり、それらを結果で除算して両方の素因数を取得します。