選擇一個大的 NUMS 安全素數
假設我想使用以下簡單的雜湊函式。對於一條消息 $ m $ , 公開一些 $ a $ 和素數 $ p $ 並提高 $ a^m \bmod p $ (不要介意此操作的計算費用)。
這個散列函式是安全的,因為離散對數問題很困難,但前提是 $ p-1 $ 有一個很大的素數(以避免被索引演算破壞)。但是,我想如果每個人都使用相同的 $ p $ ,我還不如選擇 $ p $ 所以它的最大因素是盡可能大,換句話說選擇 $ p $ 成為一個安全素數(意思是 $ \frac{(p-1)}{2} $ 也是素數)。
那麼我怎樣才能選擇 p 作為一個安全素數,同時又使它成為一個 Nothing-Up-My-Sleeve 數,以建構一個好的密碼散列協議。
那我就選 $ a $ 成為最小的發電機 $ \bmod p $ (這很容易檢查安全素數,因為我需要做的就是找到最小的 $ a $ 為此 $ legendre(a,p)=-1 $ ).
好吧,對於“如何找到一個既是 Nothing-Up-My-Sleeve”數字的安全素數,顯而易見的答案是採用RFC 3526中列出的素數之一。這些素數(有多種尺寸)都是形式 $ p = 2^n - 2^{n-64} - 1 + 2^{64} \cdot ( \lfloor 2^{n-130} \pi \rfloor + i ) $ , 在哪裡 $ i $ 是最小的非負整數,使得兩者 $ p $ 和 $ (p-1)/2 $ 是素數。模內的大部分位來自於的二進制展開 $ \pi $ 似乎滿足 Nothing-Up-My-Sleeve 屬性。
另外,我不知道選擇發電機是否明智;畢竟,從雜湊 $ a^m \bmod p $ , 攻擊者可以推導出值 $ m \bmod 2 $ 如果 $ a $ 是一個發電機。似乎更謹慎 $ a $ 是二次餘數(並且使用 RFC 3526,以及任何安全素數 $ p \bmod 8 = 7 $ ), $ a=2 $ 是這樣一個二次餘數,並且使取冪運算稍微便宜一些。