【发布时间】:2017-08-11 20:55:06
【问题描述】:
此链接中的文档说 randint 不应该用于生成加密密钥: https://docs.python.org/2/library/random.html
我试图了解攻击者为什么以及如何基于这样的密钥破解密码系统。
【问题讨论】:
-
没错,你应该使用秘密模块
标签: python random python-cryptography
此链接中的文档说 randint 不应该用于生成加密密钥: https://docs.python.org/2/library/random.html
我试图了解攻击者为什么以及如何基于这样的密钥破解密码系统。
【问题讨论】:
标签: python random python-cryptography
Python 使用伪随机数生成器 (prng) 来创建程序使用的“随机”数。这些数字是由看似随机的数学算法生成的。 python 使用的算法是 Mersenne Twister。如文档中所述:
Python 使用 Mersenne Twister 作为核心生成器。它产生 53 位精度浮点数,周期为 2**19937-1。底层证券 C 中的实现既快速又线程安全。梅森捻线机 是最广泛测试的随机数生成器之一 存在。但是,由于是完全确定性的,因此不适合 用于所有目的,并且完全不适合加密 目的。
如前所述,算法的目的是既要快速又尽可能“随机”。注意第二句提到了算法的“周期”。因为计算机不是完美的,只有有限的内存,它们只能根据这个算法产生这么多的“随机”数字。周期是机器在开始重复之前可以达到的 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 的顺序和未来状态。我绝不是伪随机数生成算法方面的专家,但希望这能让你掌握这个主题:)
【讨论】:
Python random 模块使用基于时间的随机,其设计用于建模和模拟,而不是安全或密码学。
攻击者可以了解密钥的创建时间,这确实有助于他们潜在地暴力破解您的密钥。
在 python 3 中,您有 secrets 模块来解决此问题。
【讨论】: