此链接中的文档说明不应使用randint生成加密密钥: https://docs.python.org/2/library/random.html
我试图了解攻击者为何以及如何基于这样的密钥破解加密系统。
答案 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
模块来解决此问题。