Random-Number-Generator
反轉 Mersenne Twister 需要多少個 12 位整數輸出?
我正在創建一個應用 Python
random
算法 (Mersenne Twister) 來生成隨機 12 位整數的 Web 應用程序。我擔心使用者如何通過使用 API 呼叫記錄所需的序列數來預測未來的結果import random def rand12bits(): return random.randint(0, 4095)
我需要多少這些輸出來預測未來的序列?
我知道有足夠的(624)個觀察到的 32 位整數輸出,它可以被反轉。但在這種情況下,RNG 只給出 12 位整數。我錯過了什麼嗎?請原諒我的天真,我對此並不陌生。
我需要多少這些輸出來預測未來的序列?
好吧,要恢復 RNG 狀態,您需要觀察 19968 位的輸出(轉換為狀態);通過一次查看 12 位,您將在 1665 次輸出之後看到足夠多的內容。
您可能會遇到的一個問題是:12 位可能不是來自連續的 Mersenne Twister 輸出,因此我們無法簡單地重構 624 字狀態。這是真實的; 然而 Mersenne Twister 在 GF(2) 中是完全線性的;因此,我們可以將 19968 位初始狀態描述為觀察到的輸出狀態的線性函式,並且(使用足夠的線性方程)求解初始狀態。這顯然比簡單的“這裡有一個 624 字的中間狀態”要工作得多。不過很實用。
另一件需要注意的是,這個估計假設初始狀態是完全未知的。如果它是部分已知的(例如,初始狀態是 256 位未知值,後跟一個已知模式),這會減少所需的輸出數量(因為那些已知的初始狀態位給了我們自由方程)