Random-Number-Generator

關於“xorwow”PRNG 的初始化

  • March 19, 2021

原始論文中,Marsaglia 定義了**xorwow()函式並給出了初始狀態的一些範例值。 $ x $ , $ y $ , $ z $ , $ v $ , $ w $ 和 $ d $ . 但我不清楚**這些值是如何選擇的,或者它們如何從種子中“隨機化”。本文不在這裡詳細介紹。Wikipedia 的程式碼略有不同xorwow()(我認為應該是等價的),但同樣沒有說明如何初始化狀態——除了*“必須將狀態數組初始化為前四個單詞中不全為零”*。

那麼,用完全隨機的數據(例如取自作業系統的熵源)初始化所有6 個狀態變數是“安全的”嗎?或者是否需要以特定形式初始化這些變數中的任何一個以獲得“好的”隨機數?例如,Marsaglia 是否選擇了一些表現最好的“神奇”值?還有,櫃檯呢 $ d $ ? 應該 $ d $ 甚至是隨機的?

好的,第一件事。在任何情況下都不要使用 XORWOW 生成任何對手無法預測的加密秘密或價值。

很抱歉大喊大叫,但非常重要的是要指出 xorwow 不是加密安全的隨機數生成器;這是一個帶有假鬍子的LFSR。

我不確定為什麼維基百科評論說前四個需要非零。特別是狀態 (0, X, 0, 0, 0)、(0, 0, X, 0, 0) 和 (0, 0, 0, X, 0) 都將轉換為 (0, 0, 0 , 0, X),因此也可能很弱。與所有 LFSR 一樣,重要的是不要用全零載入寄存器(因此前五個變數不應全為零)。還要避免將增量設置為偶數(wiki 程式碼中的數字 362437)。如果您遵循這兩個條件,則狀態將循環遍歷所有 $ 2^{192}-2^{32} $ 價值觀和不同的種子只會讓你從周期的不同點開始,並且幾乎是等價的。如果寄存器以非常空閒的狀態開始,則會出現一個小問題,它們只是慢慢地從稀疏狀態演變出來,但是在大量呼叫之後,這將變得平滑。

這將使生成器適用於例如為實值函式的蒙特卡羅積分生成值。但它仍然不適合任何加密目的。(再次抱歉大喊大叫)。

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