2014-04-12 34 views
1

我需要为密码学中的学生作业生成随机数。为了加密的目的,在C中生成一个伪随机数最简单的方法是什么?

起初我想用

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

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

为了加密的目的,在C中生成伪随机数的最快/最简单的方法是什么?

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

+2

从/ dev/urandom中读取 – paj28

+3

这是一个技巧性问题。有简单的方法,有很好的方法,但没有简单的方法。密码RNG是__hard__。 –

+0

除非你的解决方案有你没有提到的要求,否则使用'/ dev/random'可能对学生作业足够好,而使用'srand(time)'(实际上'rand( )')不是。 –

回答

2

没有跨平台的解决方案。在Linux上,从/dev/urandom(如果您喜欢复杂性,请拨打freadread)阅读。从/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读取就可以了。

2

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

对于Linux系统:/dev/random返回的熵最大,/dev/urandom本身就是种子PRNG,可以直接由应用程序使用。 /dev/random然而,如果没有足够的熵可用,我建议/dev/urandom为大多数目的。从/dev/random/中读取太多可能会导致整个机器发生故障,因为任何请求它的熵可能会停止。在其他操作系统上,/dev/random/dev/urandom只需链接到种子PRNG。

对于Windows请看this article on MSDN

+0

增加了另一个答案,我读到你想编程你自己的PRNG,道歉。删除了Java SHA1PRNG示例代码。其余的答案仍然有效,但我会推荐OpenSSL作为API。 –

+0

由于OpenSSL的问题,我删除了我的其他帖子。 –

相关问题