Diffie-Hellmann 為什麼更喜歡更大的素數而不是更大的偽隨機秘密?
所以我建構了一個應用程序,目的是展示 Diffie-Hellman。我不完全理解算法中使用的數字大小的一些論點。似乎普遍認為使用的素數應至少為 1024 位,更優選為 2048 位。這不只是使用於生成公鑰的生成的秘密數字受到更多限制嗎?我將展示我對 256 位素數和 128 位素數的混淆。
如果我們有素數$$ a=4386627406713377435825230798660911668 $$和素數$$ b=84612854289522649808987883973782867615634280117273501953794963789129643590017 $$我認為很明顯,如果我們使用 prime
a
而不是b
. 而且因為 $$ a^{60}=3.371668438049062723431E+2198 $$ $$ b^{28}=9.294321182028859888665E+2153 $$ 因此,如果您使用 primea
生成 secret60
可以說與使用 primeb
和 using secret相同28
。在攻擊 Diffie-Hellman 時,(我知道有更有效的方法)將只是暴力破解它。取客戶端和伺服器生成的公鑰,檢查是否$$ a^{1..n}\mod primitive_-root = public_-key $$ 在同時使用素數
a
和素數的情況下,b
我會推測使用更大的素數會花費更少的嘗試來妥協,但計算量更大。我懷疑我要麼錯過了什麼,要麼有一個錯誤的觀點。為了使這個問題更簡潔:
考慮到上述情況,為什麼建議使用更大的素數,而不是更大的偽隨機數?
使用公共素數模數時 $ p $ (問題的 $ a $ 和 $ b $ ),Diffie-Hellmann 密鑰交換的參與者選擇秘密 $ x $ 不要寄 $ y=p^x $ 正如問題中所考慮的那樣(這使所做的推理無效)。
相反,參與者發送 $ y=g^x\bmod p $ , 在哪裡 $ g $ 是一些公共常數。 $ g=2 $ 會做(或經常做,取決於 DH 的變體)。根據定義 $ \bmod $ , 它認為 $ 0\le y<p $ , 然後 $ p $ 劃分 $ g^x-y $ . 後面的數字非常大(它已經超過 $ 0.3,p $ 因此十進制數字不適合任何電腦),但我們可以計算 $ g^x\bmod p $ 很容易使用成熟的模冪技術。在 Python 中,可以使用
pow(g,x,p)
.考慮到上述情況,為什麼建議使用更大的素數,而不是更大的偽隨機數?
我們可以選擇 $ p $ 和 $ g $ 以某種方式,使之間存在一對一的對應關係 $ x $ 和 $ y $ 在 $ [1,p) $ : 我們選擇 $ p $ 和 $ q=(p-1)/2 $ 素數,然後選擇 $ g $ 和 $ 1<g<p-1 $ 和 $ g^q\bmod p\ne1 $ . 在另一個常見的設置中,後者更改為 $ g^q\bmod p=1 $ , 現在在一個 $ x $ 在 $ [1,q) $ 和一個 $ y $ 出兩個在 $ [1,p) $ .
在這兩種情況下,較大的 $ p $ ,選擇範圍越廣 $ x $ 和 $ y $ . 因此我們不必在大的 $ p $ 和一大組隨機數。