random.randint 生成加密安全密钥

random.randint to generate cryptographically secure keys

link 中的文档指出不应使用 randint 生成加密密钥: https://docs.python.org/2/library/random.html

我试图了解攻击者为何以及如何能够基于此类密钥破解加密系统。

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

攻击者可以了解密钥的创建时间,这确实有助于他们潜在地暴力破解您的密钥。

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

secrets documenation

Python 使用伪随机数生成器 (prng) 来创建供您的程序使用的 "random" 数字。这些数字是由看似随机的数学算法生成的。 python 使用的算法是 Mersenne Twister。如文档中所述:

Python uses the Mersenne Twister as the core generator. It produces 53-bit precision floats and has a period of 2**19937-1. The underlying implementation in C is both fast and threadsafe. The Mersenne Twister is one of the most extensively tested random number generators in existence. However, being completely deterministic, it is not suitable for all purposes, and is completely unsuitable for cryptographic purposes.

如前所述,该算法的目的是既要快又要尽可能 "random"。注意第二句提到了算法的"period"。由于计算机并不完美,而且只有有限的内存,因此它们只能根据此算法生成这么多 "random" 个数字。周期是机器在开始重复之前可以达到的 prng 状态数 (https://softwareengineering.stackexchange.com/questions/273105/why-is-the-period-of-a-pseudorandom-number-generator-important)。与此相结合,python 根据您 运行 程序所在机器的内部特性决定使用什么 "state" 或使用什么 "seed"。 (参见 random.seed 上的文档)

random.seed(a=None)¶ Initialize internal state of the random number generator.

None or no argument seeds from current time or from an operating system specific randomness source if available (see the os.urandom() function for details on availability).

正因为如此,攻击者可以使用蛮力和您 运行 应用程序所处机器的基本知识,在您的程序中重新创建和确定 prng 的排序和未来状态。我绝不是伪随机数生成算法方面的专家,但希望这能让您对这个主题有所了解 :)