這個 Mersenne Twister 種子是如何找到先驗已知的 20 個字元的字元串的?
有人為 Mersenne Twister 生成了一個種子,目的是讓該種子產生這個字元串:
"9!dlroW ,olleH"ck,@
長度為 20 個字元。下面解釋了他為什麼這樣做,但我不知道他是如何破解它的。
他為什麼這樣做:
Code Golf 上的使用者feersum這樣做是為了生成一個Hello, World!Seed 程式語言中的程序。顯然,他不僅僅是暴力破解了這個種子,它有 4200 位數的長度。*他是怎麼做到的?*此外,該使用者還有其他答案,其中他使用了大概相同的技巧,請參閱:this answer。
我們所知道的:種子往往非常大(比通過加法和生成的蠻力強制的要大得多)。此外,他找到的每一個種子都必須用種子生成 624 個整數,然後再扭曲接下來的 20 個整數以產生上述字元串的數字數據。暴力破解長度為 n 的字元串的複雜度是 O(96^n),確實非常複雜。
**我懷疑的是:**他過濾了他生成的種子,以將 n 長度的複雜度降低到大約 O(log(96^n)),這簡化為 O(1)。我不認為“他可以使用超級電腦”是一個可行的答案。
**一個可接受的答案:**任何可以解釋他可能如何做到這一點的東西,即使他實際上做了不同的事情。要知道這個問題的答案可能需要很長時間。
有趣的 Mersenne Twister 瑣事:您可以用少至 624 個輸出生成 Mersenne twister 的狀態,然後預測未來的輸出。
注意:在 Hello, World! 上承諾了幾個賞金。詢問他是否要解釋他是如何做到的。多年過去了,他沒有退縮。也許這些賞金會傳遞給你,因為你已經解釋了這一點。
他是怎麼做到的?
實際上,當您提到:
您可以用最少 624 個輸出生成梅森撚線器的狀態,然後預測未來的輸出。
這是真的,但你可以用它做其他事情。您還可以生成先前的輸出(即,梅森撚線器輸出在您看到的塊之前的塊上是什麼),先前的狀態(即撚線器的狀態必須是什麼,這樣,在撚線器的迭代之後,您將獲得選定的狀態)併計算必要的種子以獲得特定狀態。
因此,他很可能是這樣做的:
- 創建了 624 個整數的輸出,其中包括
"9!dlroW ,olleH"ck,@
(即 20 個字節或 5 個整數)以及 619 個任意值。這些最後的 619 個整數將被忽略,因此為它們選擇什麼值並不重要。- 重建了生成此輸出所需的內部撚線器狀態。
- 生成了之前的twister狀態需要經過twister排列後生成這個狀態
- 生成了生成此扭曲狀態所需的種子
就是這樣。以上手工操作有點繁瑣;這對於一個程序來說是相當微不足道的。