Public-Key

為什麼 dhparams 生成的參數不符合 (2^p) mod (p-1)/2 == 1

  • September 14, 2016

我曾經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 $

引用自:https://crypto.stackexchange.com/questions/39963