random.randint生成加密安全密钥

时间:2017-03-20 14:17:44

标签: python random python-cryptography

此链接中的文档说明不应使用randint生成加密密钥: https://docs.python.org/2/library/random.html

我试图了解攻击者为何以及如何基于这样的密钥破解加密系统。

2 个答案:

答案 0 :(得分:4)

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

  

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

如上所述,算法的目的是快速和尽可能“随机”。注意第二句提到了算法的“周期”。由于计算机并不完美且只有大量内存,因此它们只能根据此算法生成如此多的“随机”数字。句点是机器开始重复之前可以达到的prng状态数(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的顺序和未来状态。我绝不是伪随机数生成算法的专家,但希望这能让你掌握这个主题:)

答案 1 :(得分:2)

Python random模块使用基于时间的随机模型,它是为建模和模拟而设计的,而不是安全性或加密技术。

攻击者可以了解创建密钥的时间,并确实可以帮助他们对您的密钥进行暴力破解。

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

secrets documenation

相关问题