什么是产生下加密目的的伪随机数的最简单的方法?(What is the easiest way to

2019-10-19 21:09发布

我需要在密码学学生做作业产生随机数。

起初我想用

srand(time(NULL));
int r = rand();

但我读了不应该用它来加密。 我想,如果可以写我自己的伪随机数发生器。

什么是产生用C伪随机数用于加密目的最快/最简单的方法是什么?

我在Linux上,如果答案是不跨平台的,我不介意。

Answer 1:

没有跨平台解决方案。 在Linux上,从阅读/dev/urandom (与fread ,或read ,如果你有复杂的味道)。 从读出的字节/dev/urandom适于加密使用从新鲜启动嵌入式系统或服务器缺乏熵除外。

该文档是过于保守的(从安全性的理论观念下,攻击者拥有无限的计算能力,而不是仅仅使用所有的电脑所产生的诠释,他的世界); 在大多数情况下, 这是完全没有用/dev/urandom生成密钥 。

如果你需要生成大量的随机字节,你可能想实现一个伪随机数生成你的代码中,并使用/dev/urandom只与熵种子吧。 如果你只是产生几个按键和类似少量的材料,或者如果你需要生成大量的随机数,但速度/dev/urandom是不是一个瓶颈,或者如果这是一所学校的运动和实施一个PRNG不是锻炼的点,然后就从阅读/dev/urandom罚款。



Answer 2:

只有具有伪随机数发生器是不够的。 你需要有足够的熵种子它来启动它。 您可以通过设置通常从操作系统调用一个检索的种子做到这一点。 哪一个你应该使用取决于你所使用的方法。 你可以,如果你想要更高质量的随机数种子后混合。

对于Linux系统: /dev/random返回最熵, /dev/urandom本身就是一个播种PRNG并且可以由应用程序直接使用。 /dev/random然而块如果没有足够的熵是可用的,我会建议/dev/urandom大多数的目的。 从读太多/dev/random/可搞垮整个机器的任何请求熵可能失速。 在其他操作系统上/dev/random /dev/urandom只是链接到种子PRNG。

对于Windows看看这篇文章在MSDN上 。



文章来源: What is the easiest way to generate a pseudo-random number in C for cryptographic purpose?