Diffie-Hellman鍵交換を使用する場合、 安全な素数 を使用することが重要であると言われています。ただし、十分なビット長の非素数係数が生成された場合、公開通信から共有秘密を回復するために使用できる攻撃(g、g ^ a、g ^ b、係数)または暗号化されたメッセージ?
TL; DR:はい、解読される可能性があります。
注:最初は、あなたの質問に微妙なニュアンスがあることに気づきませんでした。安全な素数に言及し、次に素数に言及します。しかし、安全な素数は数学的な用語です。すべての素数が安全な素数であるとは限りません!安全な素数は、pも素数になるような素数2p + 1です。 DHのモジュラスが素数であることが重要であるだけでなく、それが安全な素数である必要があります最高のセキュリティ。
非素数が安全であるかどうかは、十分な長さで何を意味するかによって異なります。数が通常よりもはるかに大きい場合、それらを合理的に分割することは不可能かもしれませんが、正確な数に大きく依存します。
モジュラス(p)として安全な素数を使用する理由の1つは、<0、p)の範囲から多くの可能な秘密を確実に生成するためです。 pが素数でない場合、これは当てはまらない場合があります。生成するシークレットが少ないほど、ブルートフォースを実行しやすくなります。
たとえば、g = 5、p = 25を使用するとします。その場合、生成されるシークレットsは常に0または5のいずれかになります。明らかに、これは0から24までのすべての数よりも総当たりする方がはるかに簡単です。安全な素数(通常の素数ではない)は大きな素数サブグループを生成します。 、すべての可能なものでなくても。
別のさらに大きな問題は、非素数を使用する場合、pの因数の離散対数問題を解くだけでよく、これははるかに簡単です。詳しくは CryptoSE をご覧ください。
ご覧のように、十分に安全であるほど十分に大きい数を考えることはまだ可能です。たとえば、2つの異なる素数を選択して、どちらもそれ自体で安全になるのに十分な大きさである場合、それらを乗算して結果をpとして使用すると、安全です。ただし、小さな要素や同じ要素が多数あり、不必要に大きな数を使用するとパフォーマンスが低下するため、任意の値を実際に確認することはできません。
他にも気付かない問題があるかもしれません。
CryptoSEへのリンクを提供してくれたAleksanderRasに感謝します。
安全な素数を使用する理由は、素数を使用する最初の理由に関連しています。素数でさえ、素数グループが小さい場合があります。これは、範囲<0、p)から多くの秘密を生成しないことを意味します。安全な素数は、大きな素数グループを持つことにより優れているため、より多くの秘密を生成し、総当たり攻撃を困難にします。 CryptoSE でもう少し読むことができます。
はい、共有秘密を復元することは非常に現実的です。これは、複合数を構成するすべての素数を法とする離散対数問題のみを「のみ」持つようになるためです。これにはまだ時間がかかる可能性がありますが妥当な時間。
詳細については CryptoSEに関するこの質問 も参照してください。