Pseudo-Random-Generator

是否可以恢復 Python 的偽隨機數生成器使用的種子?

  • May 26, 2020

我使用 Python 腳本生成了一些隨機數。我有序列的前 40 個數字。有沒有辦法恢復種子或找到序列中的下一個 460 個數字?

這些數字是使用以下程式碼生成的。

import random

i=1
mn = 1
mx = 2
while i<500:
   print(random.randint(mn,mx))
   mn=mn*2
   mx=mx*2
   i=i+1

我有序列的前 40 個數字。有沒有辦法恢復種子或找到序列中的下一個 460 個數字?

首先要知道的是 Python 的 random 模組使用Mersenne Twister作為 PRNG。這不是一個加密安全的 RNG,事實上只要你有足夠的樣本就很容易恢復狀態。

您使用的 40 個大小數字不足以恢復完整的 MT 狀態並以這種方式找到下一個輸出。

當作業系統隨機性不可用時,恢復 Python 使用的時間種子就綽綽有餘了。您可以在最近的過去執行時間值的蠻力。然而,最新版本的 Python 2/3 會從 urandom 或類似的可用狀態初始化完整狀態,並且不能用這個小輸出來反轉。

(當然你仍然可以打電話random.get_state(),但大概你不是在問這個;)

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