Pycrypto的Random.get_random_bytes和简单随机字节生成器有什么区别?
我在Pycrypto这个库里发现了一种生成随机字节的方法:
from Crypto import Random
Random.get_random_bytes(5)
我在想,这个方法和下面这种简单的生成器有什么不同:
import random
def get_random_bytes(N):
ASCII = "".join(chr(x) for x in range(255))
return "".join(random.choice(ASCII) for _ in range(n))
注意:我直觉上觉得Pycrypto的方法在加密方面更“可靠”。查看random
的文档,它说这个生成器的周期是2**19937-1
。而Random.get_random_bytes
则说明它可以生成加密强度的字节。这是什么意思呢?
当然,我希望使用库里提供的实现,而不是自己写。我只是想理解背后的加密概念。
1 个回答
5
对于一个加密安全的随机数生成器来说,任何输出的序列都不会让你知道下一个输出会是什么。
而random这个生成器是基于梅森旋转算法的。它内部有624个32位的数字作为状态。如果你得到了1248个输出值,你就能知道它在某个时刻的全部状态。这样的话,你就可以100%准确地预测出所有未来的输出。