我查看过StackExchange网站,谷歌,维基百科以及所有其他常见来源,并且无法找到我的问题的好答案。
"在播种伪随机数发生器时,位大小是否重要?
据我所知,在很多或大多数情况下,时间被用作种子价值但是解释给出了为什么这样做所有处理它都是获得不断变化的种子价值的有用方法。尺寸似乎不是问题。
我开始深入研究一些与加密相关的问题,这引起了我的好奇心。作为外行人,如果使用例如1到100之间的整数作为种子,看起来生成的数字可以通过蛮力容易地再现。我经常看到0和1使用过。即使时间随意看,如果可以密切监视开始时间,也可能是强制性的。但是粗暴强制一个随机的256位数字会非常困难。
我是否正确或是否有一些我不知道的机制使这成为一个无问题?
我甚至不会假装不仅仅是其他人在此领域工作的最终用户,并且明白我的问题可能是天真的。然而,这是我不理解的事情,并希望得到一些帮助。
我目前正在使用python 3.x中的一个项目(这对我来说也很新)所以用该字符串标记了问题,但问题实际上比特定语言实现更通用(我认为)。
答案 0 :(得分:1)
种子的大小至少在理想情况下等于PRNG的状态长度的意义上是重要的。尽管在通常的实践中使用的种子长度为32或64位,但只有当底层PRNG的状态长度分别为32或64位时,这种种子才是合适的。然而,许多现代PRNG具有更长的状态长度。 (一般来说,种子种类越多,PRNG产生的随机数序列的种类就越多。)
答案 1 :(得分:0)
种子只有从可预测性的角度来看才是重要的。这个种子对"随机"没有影响。这些数字是在种子播种后从PRNG出来的。
如果你需要你的数字是不可预测的,就像如果有人可以找出你的种子并产生相同的数字序列那将是坏事,例如你是否真的在赌场经营钱或生成用于加密的私钥,那么你就不能使用微小的种子。
你必须使用不可预测的,高度随机的" entropy"种下你的PRNG。这些通常由您的操作系统提供(例如/dev/rand
),但由于这些功能的重要性,许多加密级库也提供了非常好的随机数生成器功能。
经典的srand(time(NULL))
调用,以秒为单位的纪元时间在C中播种PRNG,显示在所有地方。如果您可以猜测程序启动的时间,您可以准确地确定它们的生成器中有哪些数字。你可以预测"关于那个PRNG的一切。由于只有大约21亿次可能,你甚至可以蛮力这个。如果你知道+/-几个小时,它只有几千种可能性尝试,使它更加微不足道。
记住" P"在PRNG中代表"伪"这意味着"假的"。这些数字看起来是随机的,但是是程序生成的,唯一可以阻止人们发现这些数字的方法是通过正确播种你的PRNG。