python的可种子CSPRNG



使用random模块,您可以对其进行种子设定,以便每次都获得相同的值。

import random
random.seed(1)
print(random.randint(1,100)) # outputs 18 every time
lst = [1,2,3]
random.shuffle(lst)
print(lst) # [2, 3, 1] every time

有CSPRNG可以做到这一点吗?例如,根据这个问题,我如何在python中创建一个加密安全的随机数?,random.SystemRandom是安全的。但播种它并没有得到同样的回报。

from random import SystemRandom
s = SystemRandom()
s.seed(1)
print(s.randint(1,100)) # 81, 16, 100, 58
lst = [1,2,3]
s.shuffle(lst)
print(lst) # [1, 3, 2], [3, 2, 1]

是否存在这样的CSPRNG?还是这否定了安全方面?

randomgen包提供NumPy兼容的CSPRNG,例如ChaCha,它可以用作:

import numpy as np
from randomgen import ChaCha
rg = np.random.Generator(ChaCha(seed=1234, rounds=8))
rg.integers(1, 100)

注:

  • 我使用的是减少回合的变体,20回合更正常,但8回合似乎对大多数目的来说已经足够了
  • randomgen提供了自己的Generator,但它已被弃用并进入numpy

最新更新