我听说计算机中的随机数生成并不是真正的随机,但是没有有效的算法可以检测到它。怎么能完全检测到它?
我听说计算机中的随机数生成并不是真正的随机,但是没有有效的算法可以检测到它。怎么能完全检测到它?
Answers:
真正随机的计算机:
从理论上讲,图灵机不可能实现真正的随机性,而且大多数计算机都无法生成真正的随机输出。因此,某些现代计算机包括允许计算机访问外部源的硬件,希望该外部源将具有一定的随机性。如何实现此目的的一个示例是跟踪计算机内部温度的细微波动。随机性也可以从外部来源获得。但是从您的帖子的语气来看,我不认为您感兴趣的是外部随机性。
种子:
没有外部附加条件,计算机所做的一切都是确定性的。这导致了一个大问题:如果您调用随机数生成程序,则每次输入相同的结果都会得到相同的结果。显然,我们需要一个程序,该程序输出一个随机数以在每次运行时更改其行为(否则,我们将不断获得相同的“随机”数,这并不是特别有用)。一种想法是为程序提供一些输入,每次运行该程序都会更改它,以便输出不同的数字。我们称此输入为“种子”。随机数生成器需要获取种子,执行一些操作,然后为我们提供一个随机数。
当前系统时间是种子的经典示例。这将产生一个具有高熵的长字符串,并且如果以足够精细的方式跟踪时间(即,如果系统时钟使用小时,那么“时间”是很差的种子),则您不太可能提供伪随机数两次生成相同的数字。
足够随机的算法:
现在,我们有了一种算法,每次运行至少都有一些不同的方法。我们给它提供一个种子,并且当使用相同种子提示时算法给出相同的数字,但我们希望它生成的数字是随机的。就像上面的操作一样-您输入一些输入,并且产生一些输出(希望与输入足够不同,成为“随机”输出)。
现在,假设您想出了自己的算法来执行此操作,并且您声称给它提供了许多不同的种子时,得出的数字几乎接近随机数。我们将如何测试它的质量?
现在,我们需要某种算法来获取种子,进行一些操作并产生一个随机数。最简单地说,该算法只能输出种子-每次给出的种子数都不相同,而随机种子则为我们提供随机输出。但这显然不是我们想要的。另一方面,就像许多实际的伪随机数生成器一样,算法可能相当复杂。我们如何分辨哪些算法从我们不必要的种子中为我们提供了“随机”数?如果我们不能准确地得到它,我们怎么知道哪个最好?
随机足以欺骗攻击者:
现在,您可能要指的是加密安全伪随机生成器。我认为最好的解释方法是在上述情况下-在这里,我们将随机性用于密码学,因此,在设计测试时,我们真正关心的是某人无法破解通过预测我们选择了什么随机数来确保我们的安全。我不知道您对密码学的熟悉程度,但可以想象我们正在做一个简单的替换密码-每个字母都被其他字母替换。我们希望随机选择这些替代品,因此攻击者很难猜测它们。但是,如果他能弄清楚我的随机数生成器是如何工作的,那么他将能够解决整个密码!因此,密码算法需要特别难以猜测的随机数生成器。
因此,CSPRG的定义是根据其他算法对它们的求解效果(这是我们最终遇到的问题)。具体来说,假设我有一个CSPRG,我将其称为R。当且仅当没有可行的算法可以猜测下一个要输出的位时,R才是CSPRG。即使您知道它输出的所有先前位,也是如此!
因此,假设我的CSPRG输出的前五位是10100。您不知道我用于程序的输入,但是可以访问用于编写CSPRG的代码。然后声称您不可能编写一个程序来确定下一位输出是101000还是101001。
因此,出于密码学的原因,有时会根据对其他程序的可预测性来定义伪随机数生成器的性能。请注意,这仍然给出了很多“随机性”的直觉,例如(例如)如果您知道所有随机输出都是奇数,则既不是加密安全的,也不是通过常识随机性测试的。
最近,我在麻省理工学院CSAIL计算理论小组博客上找到了一篇有关计算中随机性的好文章:您能告诉我是否有些随机性吗?
文章首先从Avi Wigderson的精彩演讲中 提取了一些想法,这些话题涉及计算中随机性的强大功能和局限性,调查了随机算法的美丽领域,以及伪随机性与计算难处理性之间令人惊讶的联系。
然后总结了有关量子密码学的一些最新成果。特别是有效测试某种设备的输出是否真正随机的方法(随机扩展协议)。
例如,请参见Umesh Vazirani,Thomas Vidick,可验证的量子骰子(或可测试的指数随机扩展)的最新工作。
摘要: 我们介绍了一种协议,通过该协议,一对量子机械设备可以用于从O(log n)个均匀位的种子生成n位真正的随机性。仅根据用户可以执行的简单统计测试,并假设设备遵守无信号原则,才可以证明所生成的比特是随机的。设备的内部运作没有其他假设。...
假设您正在谈论统计随机性 -加密还有其他需求!-大量的拟合优度测试可以检测数字序列是否适合给定的分布。您可以使用它们来测试(伪)随机数生成器是否健全(取决于测试的质量和所选的重要性)。
Diehard测试套件结合了不同的方法。
这是计算机科学中的一个广泛/复杂的话题,SamM的其他答案也解决了一些。您的具体问题似乎与计算机是否具有所谓的PRNG(即伪随机数生成器)有关,如何才能检测到这一点?
简短的答案是,构建了非平凡的PRNG,因此无法检测(推导)其算法。通常,如果PRNG是所谓的“安全”,即使攻击者知道用于生成伪随机序列的算法,他们也无法猜测用于生成序列的特定参数。通过这种方式,伪随机性与密码学有着许多深厚的联系,并且人们可以谈论“破坏” PRNG的方式与可以“破解”密码算法的方式几乎相同。这个领域有许多研究论文,它是密码学最前沿的活跃领域。
对于“平凡”的PRNG(例如线性同余生成器),如果攻击者知道用于生成它的算法并且不是使用“ bignums”生成的,则搜索空间“相对较小”,并且理论上攻击者也可以找到参数由特定PRNG使用,基本上是通过蛮力并尝试所有组合。
在某些情况下,可以通过对PRNG进行大量的统计随机性测试来破坏PRNG(再次取决于其“安全性”)。例如,这就是程序“ Dieharder”(由Brown 编写)的原理。还有一个NIST套件。
打破PRNG的内在难度/难度尚未在理论上得到严格的证明,但基本上与所谓的“活板门”或“单向函数”相关,它们可以在一个方向上有效地计算,但“难以”反转(反向) 。在密码学中,关于随机性硬度存在一些未解决的问题。这些问题与复杂性类别分离密切相关,例如著名的P =?NP问题。
有关破坏PRNG的问题还与Kolmogorov复杂度有关,Kolmogorov复杂度是一个研究可生成序列的最小图灵机的领域。破解PRNG还与找到“最短”程序来计算伪随机序列密切相关。通常,Kolmogorov的复杂性无法确定。
正如Gilles在评论中指出的那样,确实存在基于硬件的RNG,这些RNG是由物理电子过程构建而成的,例如与量子噪声相关的过程。如果设计正确,这些是坚不可摧的。
实际上,经典计算机所做的每一件事都是确定性的,即当您给他们一些任务时,它将以确定性的方式跟随它们。因此,如果您想拥有一个随机数,则可以根据时间(基于用户的输入时间)相应地对其进行计算,但是,如果您想要拥有一组随机数,则不能将时间用于下一个数字,因为数字将不再是独立的。
人们要做的是使用具有种子的伪随机生成器,即用于计算伪随机数生成器的所有数字的数字(在某些更复杂的模拟或其他任务中,可能需要更多的种子,如果需要一组以上的独立随机数)。如果要获得可重复的结果,则种子通常为0或特定的数字,如果您和不同的无法重复的结果,则种子通常为时间。
伪随机数生成器足够好的事实在于,它们遵循“伪随机数生成的基本特征”,以便有效地计算并表现得像真实的随机数:
根据伪随机数序列中的每个数字,都会计算出一个新数字(通常我们使用整数)。但是,在准备以特定数量的可用位数表示数字(例如二进制数)的特定基数中工作的伪随机数生成器序列中,有一个周期n。如果这个n不够大,将会有严重的问题,但是请不要担心,计算机科学家会很好地选择伪随机生成器的种子和其他参数,以得到一个好的n。
例如,可以相应地定义使用线性同余方法的可能的伪随机数生成器,它是最古老和已知的伪随机数生成器算法之一,可以:
它有四个值
:- X_0≥0
-一≥0
- Ç≥0
- M> X_0,其中:
x0是初始值,a,c和m是常量,其中:m> a,m> c,它会生成带插值的序列:
x_ {i + 1} =(a * x_i + c)MOD m
这些常数的值必须仔细选择。一种可能性是:
x_ {i + 1} =(1664525 * x_i + 1013904223)MOD 2 ^ 32,参考[1-2]
还有其他更复杂的算法可以生成随机数,从而避免了以前算法的某些问题,其中包括:[3]
- 某些种子状态的周期比预期的短(在这种情况下,此类种子状态可以称为“弱”);
- 大量生成数量的分布不均匀;
- 连续值的相关性;
- 输出序列的尺寸分布不佳;
- 某些值出现之间的距离与随机序列分布中的距离分布不同。
将来,经典计算机可能会结合到可以提供真正随机数并传递它们的量子系统。[4]
参考文献:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H.等。(1992)。“ fortran 77中的数字配方:科学计算的艺术”(第二版)。ISBN 0-521-43064-X。
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /