在Windows上等同于/ dev / urandom?

时间:2014-02-26 17:46:29

标签: windows prng

我的应用程序希望获得一个随机数,最好使用熵(如果可用),但不需要加密质量,并且希望确保在系统熵池耗尽时调用不会阻塞(例如在服务器上)在一个农场)。我知道CryptGenRandom(http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx),但是没有指定它在不利熵条件下阻塞的行为。在Unix上,/ dev / urandom支持这个用例。 Windows上是否有相同的功能?我宁愿避免使用非系统RNG来获得非阻塞语义。

3 个答案:

答案 0 :(得分:2)

对于玩具应用程序,您可以使用rand(),但Windows上的实现质量非常差。

更好的选择就是在程序中包含一个合适的伪随机数生成器。 Mersenne Twister是IMO的一个很好的选择,特别是因为有很多可用的实现(包括在C ++ 11标准库和Boost中)。

答案 1 :(得分:0)

如果我需要对随机数进行非阻塞行为,我通常会预先生成n个数字并将它们存储在内存变量中:即如果我知道每秒需要30个随机数,则需要3秒计算它们(包括块),然后我将在主代码加载时预先生成300,将它们存储在数组或向量中并在需要时使用它们;使用它们的时候,每次使用它们时,我会在一个单独的线程上生成另一个,用新生成的随机数替换使用的随机数,然后移动到列表中的下一个,这样当我达到极限时(在这种情况下) 300)我知道什么时候我可以在数组/向量/列表的开头再次启动,所有随机数都是新的,并且是非阻塞的(因为它们是预先生成的)。

这意味着你可以使用你喜欢的任何随机数生成器,而不用担心阻塞行为,但是它有使用更多ram的费用,可以忽略不计,但是对于那种编码我需要随机数。

希望这会有所帮助,因为我无法将这一切都纳入评论:)

答案 2 :(得分:0)

你可以等待一个充满熵的好种子,并按照GMasucci建议预先生成一长串随机数。

除非你的系统已经受到损害,否则它似乎是一个很好的种子,足以生成一系列不相关的数字,如http://www.2uo.de/myths-about-urandom/中所述

从讨论开始,我得到了一个连续的(" true" /" fresh")随机数字,如果您的系统状态(您的熵源),它只需要它已知并且攻击者知道他们当前的状态)它在某些时候受到了损害。在为您的块cypher提供更多随机性后,其输出的可预测性将降低。

种子来源?两个或更多可信软件不太可能已被泄露。我试图模糊使用时间函数作为种子的函数的可预测性:local rand_function()+一些变量delay + mysql的rand()。 从那里,由一些好的库生成的伪随机数列表。