我需要为密码学中的学生作业生成随机数。
起初我想使用
srand(time(NULL));
int r = rand();
但我读到不应该用它来加密。 我想尽可能不编写我自己的伪随机数生成器。
为了加密目的,在C中生成伪随机数的最快/最简单的方法是什么?
我在Linux上,我不介意答案是不是跨平台的。
答案 0 :(得分:2)
仅使用伪随机数生成器是不够的。你需要用足够的熵来播种它才能启动它。您可以通过设置通常从其中一个操作系统调用中检索的种子来完成此操作。您应该使用哪一个取决于您使用它的方法。如果你想要更高质量的随机数,你可以稍后混合种子。
对于Linux系统:/dev/random
返回最多的熵,/dev/urandom
本身是种子PRNG,可以由应用程序直接使用。 /dev/random
然而,如果没有足够的熵可以阻止,我会建议/dev/urandom
用于大多数目的。从/dev/random/
读取太多内容会导致整个机器崩溃,因为任何请求熵的东西都可能停滞不前。在其他操作系统上,/dev/random
/dev/urandom
只链接到种子PRNG。
对于Windows,请查看this article on MSDN。
答案 1 :(得分:2)
没有跨平台的解决方案。在Linux上,如果您对复杂性有所了解,请从/dev/urandom
(fread
)或read
阅读。从/dev/urandom
读取的字节适用于加密使用,除非是刚刚启动的嵌入式系统或缺少熵的服务器。
文档过于保守(源于理论上的安全性,即攻击者拥有无限的计算能力,而不仅仅是使用世界上所有的计算机);在大多数情况下,it is perfectly fine to use /dev/urandom
to generate cryptographic keys。
如果您需要生成大量随机字节,您可能需要在代码中实现pseudo-random number generator,并仅使用/dev/urandom
以熵为其播种。如果您只是生成一些键和类似的少量材料,或者您需要生成大量随机数,但/dev/urandom
的速度不是瓶颈,或者这是一个学校练习,实施PRNG不是练习的重点,那么只需阅读/dev/urandom
即可。