為什麼 dhparams 生成的參數不符合 (2^p) mod (p-1)/2 == 1
?
我曾經
openssl dhparams
為測試生成 512 位 DH 參數。結果文件是:-----BEGIN DH PARAMETERS----- MEYCQQDgkQsR2SuYabxysYaxk2oB2Us+YKNbEBQCdhBzMZ/5fb1s80PBDsch5gRD A5TLoOG/XOc9hr6MXhNu2A6/WzZ7AgEC -----END DH PARAMETERS----- Vs-MacBook:LRS v$ openssl asn1parse -in dh512.pem 0:d=0 hl=2 l= 70 cons: SEQUENCE 2:d=1 hl=2 l= 65 prim: INTEGER :E0910B11D92B9869BC72B186B1936A01D94B3E60A35B101402761073319FF97DBD6CF343C10EC721E604430394CBA0E1BF5CE73D86BE8C5E136ED80EBF5B367B 69:d=1 hl=2 l= 1 prim: INTEGER :02
但是,如果我們採用這些數字併計算
(2 ^ prime) % ((prime-1)/2)
,結果不是 1,我認為應該是這種情況。 為什麼?
OpenSSL 更喜歡組 $ g $ (在這種情況下, $ 2 $ ) 是一個生成器,即 $ 2^x \bmod p $ 可以承擔 $ p-1 $ 不同的值(取決於 $ x $ )。因為這, $ 2^{(p-1)/2} $ 不能是 1,就好像它是, $ 2^x $ 最多可以承擔, $ (p-1)/2 $ 價值觀。
在裡面 $ g=2 $ 案例,以及在哪裡 $ p $ 是“安全素數”(即, $ (p-1)/2 $ 也是素數),那麼有一個簡單的規則;如果 $ p \equiv 3 \bmod 8 $ , 然後 $ 2 $ 將生成整個組(等等 $ 2^{(p-1)/2} \not\equiv 1 $ ); 如果 $ p \equiv 7 \bmod 8 $ , 然後 $ 2 $ 將僅生成一半可能的元素(因此 $ 2 ^{(p-1)/2} \equiv 1 $ . 快速檢查最後一個十六進制數字 $ p $ (
B
) 給我們 $ p \equiv 3 \bmod 8 $ .顯而易見的問題是“這對安全有什麼影響”?好吧,這個觀察可以讓攻擊者推導出每一方的 DH 私有指數的 lsbit;但是除此之外它什麼也沒做。有些人(包括我)會質疑為什麼有必要透露有關私有指數的任何資訊;OpenSSL 的人認為輕微的洩漏是可以接受的。
現在,如果您打算將該組用於 DH 以外的其他用途,這可能對您很重要;然而,很難抱怨一個工具不能用於它從未設計過的用途。另一方面,如果您需要 $ g $ 生成大小的子組 $ (p-1)/2 $ ,總有 $ g=4 $