从随机来源更好的随机数播种伪随机生成器

时间:2017-05-25 11:44:25

标签: c++ c security random entropy

假设我们有一个伪随机数生成器,它接受一个32位整数作为种子(例如来自C标准库的rand()函数),它从原始种子中获取随机数。如果那个种子来自,让我们说,放射性衰变,假设我们从调用rand()得到的随机数是"好"是正确的。随机数从放射性衰变中产生一个?

4 个答案:

答案 0 :(得分:2)

不,绝对不是。 C / C ++标准库的内置rand()函数通常实现为linear congruential generator(LCG)。它是已知最早的伪随机数发生器(PRNG)系列之一,它们通常具有众所周知的不良统计特性。此外,由于PRNG实际上产生由初始种子预定的数学序列,因此它们是可预测的。甚至加密安全的伪随机数生成器(如Blum Blum Shub)也是可预测的,即使它在计算上很难并且非常耗费时间来预测序列。

相比之下,基于放射性衰变的随机数发生器是真正的随机数发生器。生成的数字序列完全均匀分布且不可预测,样本之间没有任何可测量的相关性。

回到伪随机数,初始种子源的统计质量不会提高生成的伪随机序列的统计质量 - 它只取决于生成器本身。如果使用真随机数为PRNG播种,那么序列的第一个数字将是不可预测的,但是序列的质量将与没有真正随机种子时的质量相同。

如果您想要高质量的随机性,则必须使用高质量的随机数生成器。伪随机数生成器具有出色的统计特性(绝对着名的Mersenne Twister),通过所有当前的随机性统计测试 - 而生成的伪随机序列仍然是可预测的,统计上它是'难以区分真正随机的序列。

现代随机数生成器的可靠资源是Sebastiano Vigna's website

答案 1 :(得分:1)

随机数的质量来自随机数生成器的质量。有许多不同的生成伪随机数的方法,你选择的方法应该适合你的应用,但说实话,如果你有权使用无线电有源衰变监测设备,那么你可能能够访问真正的随机数(来自其他一些完全随机的真实世界事件),而不是播种伪的事件。

答案 2 :(得分:1)

即可。随机数序列的属性完全取决于随机数生成器(RNG)。因此,后续随机数之间的任何相关性都归结为RNG,而不是种子。

然而,尽管如此,种子对于避免在不同代码运行时生成的序列之间的相似性非常重要。因此,您应该始终尝试使用真正随机的种子为您的RNG播种。

答案 3 :(得分:0)

伪随机数(PRN)可能是接近随机数的序列。但是,True随机数(TRN)是通过从熵源提取输入来生成随机数的,而这些源可以是从振动到硬盘活动的任何物理环境。 C库的rand()属于PRN的类别。为了获得较高的随机性,最好使用使用/ dev / random或/ dev / urandom的库。

有关随机urandom-https://linux.die.net/man/4/urandom中的内核随机数源设备的更多详细信息,请参考urandom的联机帮助页。 “随机数生成器将来自设备驱动程序和其他来源的环境噪声收集到一个熵池中。该生成器还对熵池中的噪声位数进行估算。从该熵池中创建随机数。”