我需要在密码学学生做作业产生随机数。
起初我想用
srand(time(NULL));
int r = rand();
但我读了不应该用它来加密。 我想,如果可以不写我自己的伪随机数发生器。
什么是产生用C伪随机数用于加密目的最快/最简单的方法是什么?
我在Linux上,如果答案是不跨平台的,我不介意。
我需要在密码学学生做作业产生随机数。
起初我想用
srand(time(NULL));
int r = rand();
但我读了不应该用它来加密。 我想,如果可以不写我自己的伪随机数发生器。
什么是产生用C伪随机数用于加密目的最快/最简单的方法是什么?
我在Linux上,如果答案是不跨平台的,我不介意。
没有跨平台解决方案。 在Linux上,从阅读/dev/urandom
(与fread
,或read
,如果你有复杂的味道)。 从读出的字节/dev/urandom
适于加密使用从新鲜启动嵌入式系统或服务器缺乏熵除外。
该文档是过于保守的(从安全性的理论观念下,攻击者拥有无限的计算能力,而不是仅仅使用所有的电脑所产生的诠释,他的世界); 在大多数情况下, 这是完全没有用/dev/urandom
生成密钥 。
如果你需要生成大量的随机字节,你可能想实现一个伪随机数生成你的代码中,并使用/dev/urandom
只与熵种子吧。 如果你只是产生几个按键和类似少量的材料,或者如果你需要生成大量的随机数,但速度/dev/urandom
是不是一个瓶颈,或者如果这是一所学校的运动和实施一个PRNG不是锻炼的点,然后就从阅读/dev/urandom
罚款。
只有具有伪随机数发生器是不够的。 你需要有足够的熵种子它来启动它。 您可以通过设置通常从操作系统调用一个检索的种子做到这一点。 哪一个你应该使用取决于你所使用的方法。 你可以,如果你想要更高质量的随机数种子后混合。
对于Linux系统: /dev/random
返回最熵, /dev/urandom
本身就是一个播种PRNG并且可以由应用程序直接使用。 /dev/random
然而块如果没有足够的熵是可用的,我会建议/dev/urandom
大多数的目的。 从读太多/dev/random/
可搞垮整个机器的任何请求熵可能失速。 在其他操作系统上/dev/random
/dev/urandom
只是链接到种子PRNG。
对于Windows看看这篇文章在MSDN上 。