据我了解,PRNG 使用的种子会生成一系列并非真正随机的数字。是否有可能通过每次使用不同的种子一遍又一遍地重用 PRNG 来创建一个真正的随机数生成器。种子可以从开发/随机或当前时间或时钟滴答中提取。如果没有,那么是否有一个真正的随机数生成器在软件中实现?
谢谢
据我了解,PRNG 使用的种子会生成一系列并非真正随机的数字。是否有可能通过每次使用不同的种子一遍又一遍地重用 PRNG 来创建一个真正的随机数生成器。种子可以从开发/随机或当前时间或时钟滴答中提取。如果没有,那么是否有一个真正的随机数生成器在软件中实现?
谢谢
如果您每次需要随机数时都重新播种 PRNG,则可以剪掉中间人并直接将种子用作随机数。
但是你所说的都是在实践中完成的。这些是所谓的密码安全 PRNG,它们被用于许多操作系统中,为密码应用程序提供随机数。它们经常从熵池中重新播种,并且被设计为很难从知道过去的数字中计算出下一个数字(例如,对于 LCG 来说这是非常微不足道的事情)并且也很难计算过去当前的数字。
这种方法的好处是您不会阻止生成随机数。系统中的熵是一种有限资源,只能来自外部资源,因此通过使用 CSPRNG,您可以安全地拉伸它,同时不会危及安全性。
简单的答案是没有这样的实现,因为据我所知,这根本不可能。要生成真正的随机数,您需要外部熵源,例如硬件随机数生成器。
时钟不是很随机,但 /dev/random 有一些随机性——它实际上就像一桶随机性,你可以根据随机性产生和消耗的速率来消耗它。如果你使用 dev/random,那么你就没有使用 RNG。从 /dev/random 播种 RNG 是多余的。
英特尔正在研究的东西如果能像宣传的那样工作,那将是真正具有开创性的东西。它实际上会使硬件 PRNG 变得多余。