此链接中的文档说不应使用 randint 生成加密密钥: https ://docs.python.org/2/library/random.html
我试图了解攻击者为什么以及如何基于这样的密钥破解密码系统。
此链接中的文档说不应使用 randint 生成加密密钥: https ://docs.python.org/2/library/random.html
我试图了解攻击者为什么以及如何基于这样的密钥破解密码系统。
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-发电机重要)。再加上这一点,python 会根据您运行程序的机器的内部特性来决定使用什么“状态”或使用什么“种子”。(请参阅 random.seed 上的文档)
random.seed(a=None)¶ 初始化随机数生成器的内部状态。
没有或没有来自当前时间或操作系统特定随机源(如果可用)的参数种子(有关可用性的详细信息,请参见 os.urandom() 函数)。
因此,攻击者可以使用蛮力和运行应用程序的机器的基本知识重新创建和确定程序中 prng 的顺序和未来状态。我绝不是伪随机数生成算法方面的专家,但希望这能让你掌握这个主题:)
Pythonrandom
模块使用基于时间的随机,它是为建模和模拟而设计的,而不是安全或密码学。
攻击者可以了解密钥的创建时间,这确实有助于他们潜在地暴力破解您的密钥。
在 python 3 中,您有 secrets
解决此问题的模块。