2017-03-20 137 views

回答

3

Python使用的伪随机数发生器(PRNG)来创建由你的程序被用于“随机”的数字。这些数字是从似乎只是随机的数学算法中产生的。 python使用的算法是Mersenne Twister。如文档中所述:

Python使用Mersenne Twister作为核心生成器。它产生了 53位精度浮点数,周期为2 ** 19937-1。 C中的基础 实现既快速又线程安全。 Mersenne Twister 是 存在的最广泛测试的随机数发生器之一。然而,完全确定性的是,它不适用于所有目的,并且完全不适用于加密 的目的。

如前所述,该算法的目的是为了既快速又尽可能“随机”。注意第二句提到算法的“时期”。由于计算机并不完美,只有有限的内存,因此只能根据此算法生成如此多的“随机”数字。该时间段是机器在开始重复之前可以达到的状态数(https://softwareengineering.stackexchange.com/questions/273105/why-is-the-period-of-a-pseudorandom-number-generator-important)。再加上这个,python根据你正在运行程序的机器的内部特性决定使用什么“状态”或使用什么“种子”。 (请参阅random.seed上的文档)

random.seed(a = None)¶初始化随机数 生成器的内部状态。

如果可用,请参阅os.urandom() 函数以了解有关可用性的详细信息,但不包含当前时间或操作的种子参数 。

正因为如此,攻击者可以在程序中重新创建和确定prng的排序和未来状态,使用暴力和运行该应用程序的计算机的基本知识。我绝不是伪随机数生成算法的专家,但希望这可以让你掌握这个主题:)

+0

'由于“随机”数字的概念并不真实存在于现实世界中......“许多人会不同意你的看法。作为一名专业统计人员,我就是其中之一。我的许多量子物理学家朋友也会质疑你的说法。我是否强烈建议您删除该文件,因为您的文章的其余部分没有必要? – pjs

+0

@pjs谢谢您的反馈,我非常感谢!我当然不是量子物理学的专家,所以我不会质疑你或你的物理学家。你能提供一个简短的解释或链接来支持你的主张吗?如果有人质疑我未来的观点,我很乐意为您的建议提供证据。 – PrestonM

+1

我不是物理学家,我是统计学家。按照我们的标准,任何无法确定地预测的事物都是随机的,而且当前未知的结果并不是*先验确定的可以/应该被建模为随机性。对于物理学家的观点,请参阅http://www.nature.com/nature/journal/v464/n7291/edsumm/e100415-06.html。此外,请查看海森堡的不确定性原理,这证明您无法同时确定对象的位置和速度:http://abyss.uoregon.edu/~js/21st_century_science/lectures/lec14.html – pjs

1

Python random模块使用基于时间的随机,它是为建模和仿真而设计的,而不是安全或密码学。

攻击者可以理解密钥的创建时间,它确实可以帮助他们暴力破解密钥。

在Python 3中,您有secrets模块来解决此问题。

secrets documenation

+1

这里的源代码说,它将被播种os.urandom如果可用... https://hg.python.org/cpython/file/2.7/Lib/random.py ..这意味着如果os.urandom可用,它是安全的吗? – surbhi

+0

绝对不是。这意味着它取决于您的操作系统类型。 – nivhanin