密码保护PRNG的C语言

时间:2013-03-14 19:35:36

标签: c cryptography seed prng

我正在研究在C中生成非常大的随机整数。我发现/ dev / random是一个很好的来源,但如果熵池耗尽,它会阻塞。 / dev / urandom似乎是下一个goto,但随机性的质量相比并不好。有没有办法我可以使用/ dev / random中的整数来种子PRNG,这样我就不必继续读取/ dev / random?我正在寻找一个加密安全的PRNG,但不是长期的。

4 个答案:

答案 0 :(得分:7)

使用/dev/random中的整数来播种PRNG 正是/dev/urandom的作用。除非你有证据表明urandom存在特定的弱点,否则你正在重新发明轮子。

虽然urandom确实弱于/dev/random,但你提出的方案在完全相同的方式上是弱的,所以它没有提供仅仅使用urandom的好处。 urandom具有额外的好处,即当新的熵从底层硬件变得可用时,它可以连续地将新熵混合到生成的数字中。 FreeBSD例如只有有一个urandom风格的设备。

最后,urandom已经存在多年了,它的来源已经过安全专家的审查,而替代者可以自行解决这个问题。

答案 1 :(得分:0)

这可能取决于平台。有些人使用加密安全的PRNG已经用于/ dev / random。示例:FreeBSD,OpenBSD,OS X.您还可以查看Yarrow,Fortuna,ISAAC(基于RC4)。 如果您想进一步研究它,这是一个很好的起点:http://csrc.nist.gov/groups/ST/toolkit/index.html

答案 2 :(得分:0)

如果你只是想要一个大的熵池,你可以做一些基本的事情,例如从嘈杂的数据流(例如繁忙环境中的视频或音频)中获取数据块的SHA1。

那么问题就变成你想要多少熵,以及多快?因为“大数字”可能意味着从项目的一个Gb随机位到“我需要100k / sec恒定的熵流为此服务”

答案 3 :(得分:0)

如果你有硬件可以做得更好。检查您的CPU或任何其他模块是否支持加密随机数生成。 / dev / random和/ dev / urandom在加密方面都不安全。您不应该将它们用作应用程序中的来源。