何時使用安全素數或 Schnorr 組
使用的協議 $ \mathbb{Z}_{p}^* $ 算術經常選擇 $ p $ 成為一個安全素數( $ p = 2q + 1 $ , 對於素數 $ q $ ) 或具有 Schnorr 組形式 ( $ p = rq + 1 $ , 對於素數 $ q $ )。我知道這樣做的原因是為了防止 Pohlig-Hellman 算法。
看起來兩者都是安全的,只要 $ q $ 足夠大。但是,據我所知,安全素數通常用於 Diffie-Hellman,而 Schnorr 群素數則用於 DSA。(例如,
dhparam
和dsaparam
OpenSSL 命令)。我的問題是:這是什麼原因?我看到 Schnorr 群素數更有效,因為 $ q $ 更小,使求冪更快。但如果是這樣的話,為什麼在 Diffie-Hellman 中似乎避免了它?使用帶有 Schnorr 群素數的 Diffie-Hellman 或帶有安全素數的 DSA 是否安全?
(這個問題部分包含在ElGamal 和 Schnorr 組中,但那裡沒有回答)
使用帶有 Schnorr 群素數的 Diffie-Hellman 或帶有安全素數的 DSA 是否安全?
安全,是的;高效,沒有。
對於 DSA,該簽名算法包含一個巧妙的技巧,可以將簽名的大小減少到子組大小的兩倍( $ q $ )。因此,我們希望盡可能地減小子組的大小(不影響安全性)。您可以使用安全的素數,但這意味著簽名最終會比要求的大得多。
對於DH,沒有相應的妙招;關鍵份額是 $ p $ . 但是,有兩件事會導致性能差異:
- 我們使用一個小的 $ g $ (經常 $ g=2 $ ); 這樣一個 $ g $ 有訂單 $ q $ ,所以效果很好。這麼小的 $ g $ 使初始模冪運算更便宜。相反,對於 Schnorr 組,您必須使用 $ g $ 隨團體一起提供的(會更大)
- 我們可以安全地重用私有指數。在安全素數的情況下,如果有人給了我們一個虛假的密鑰共享,他們可以推斷出我們的私人指數的 lsbit,但沒有別的;因此,洩漏是最小的。相比之下,使用 Schnorr 群,他們可以推導出我們的私人指數模 $ s $ 對於每一個小 $ s $ 這是一個因素 $ r $ (在哪裡 $ p = rq+1 $ 是施諾爾群);您可以通過選擇來防禦這種情況 $ r $ 是素數的 2 倍(我還沒有聽說有人這樣做,但他們可以),或者通過將關鍵份額提高到 $ q $ (這將通過重用私有指數來消除任何潛在的性能增益)。
您說 Schnorr 小組更有效率,因為 $ q $ 更小;這不是真的,因為有了一個安全的素數,沒有理由從整個範圍中隨機選擇你的私人指數 $ [1, q-1] $ ; 您可以從較小的範圍中進行選擇(例如,如果您使用 Schnorr 組,您將使用的範圍);沒有已知的離散對數方法可以使用附加資訊。