Diffie-Hellman

生成用作 Diffie-Hellman 密鑰交換參數的組時可能需要注意哪些事項?

  • February 9, 2016

由於重用廣泛使用的組進行 Diffie-Hellman 密鑰交換可能會通過對該特定組的預計算來更容易地發現第三方密鑰,我想知道在生成用作 Diffie-Hellman 參數的自定義組時可能會出現什麼問題.

以下是我目前認為關於要求的真實情況。如果這是錯誤的或不夠詳細,請糾正我或進一步解釋:

  • Diffie-Hellman 密鑰交換工作需要一個欄位。
  • 沒有零因子的環也是整數域。有限的積分域也是域。由於某種原因,具有素數模的群也是一個沒有零因數的有限環,因此是有限積分域,因此也是一個域。
  • 為了難以攻擊,模數需要足夠大,並且需要確保模數實際上是素數,而不僅僅是偽素數。

您沒有列出的一項要求是生成器 $ g $ 需要生成一個大素數階的子組;如果這不是真的,這可能會出錯:

  • 如果順序 $ g $ (我們稱之為 $ q $ ) 有一個因數 $ r $ ,那麼攻擊者可以聽到 $ g^x $ , 決定 $ x \bmod r $ 在 $ O(\sqrt{r}) $ 時間。如果 $ r $ 不大,這立即意味著您正在洩漏數據
  • 更糟糕的是,如果訂單 $ r $ 是平滑的(沒有大的因素),這使得 DLOG 問題很容易。

正如曼德拉果所說,一種策略是尋找一個素數 $ p $ 和 $ (p-1)/2 $ 素數。這個策略肯定有很多值得喜歡的地方。你可以使用(說) $ g=2 $ ,這可以使計算更容易(並且如果 $ g $ 恰好是 $ 2q $ ,這意味著攻擊者可以了解你的 DH 私有值的 lsbit,這並不能告訴他太多,你甚至可以通過確保 $ p \equiv 7 \pmod{8} $ .

另一方面,它也是一個相對昂貴的選擇,因為它正在尋找一個價值 $ p $ 滿足這兩個條件意味著要通過很多候選人。現在,如果您很少進行這種計算(例如,每天一次),那真的沒什麼大不了的。但是,如果您要為每次交換創建一個新組,那麼您需要的肯定是更昂貴的。

另一種方法是:

  • 搜尋 256 位素數 $ q $
  • 完成後,掃描 2048 位值 $ kq+1 $ 為素數;當你找到它時,呼叫它 $ p $
  • 為了 $ g $ , 選擇任意值 $ x $ (2 件作品),併計算 $ x^k \bmod p $ ; 如果該值不是 1,則將其用於 $ g $ .

生成器的順序 $ g $ 將會 $ q $ ,這是一個足夠大的素數,我們不需要擔心攻擊 $ O(\sqrt{q}) $ 時間。

昂貴的操作是尋找 $ p $ ,這並不比任何其他針對該大小的素數搜尋更昂貴。

一個考慮可能是生成一個組,以便素數模 p 可以寫成以下形式:

$$ p = 2q +1 $$ 在哪裡 $ q $ 是素數。由於每個子群 $ Z_p $ 有訂單 $ a $ 這樣 $ a|p-1 $ 該組唯一可能的子組的階數為 2 或 $ q $ . 然後你可以為訂單子組使用生成器 $ q $ .

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