如何检测到数字生成器不是真正随机的?


20

我听说计算机中的随机数生成并不是真正的随机,但是没有有效的算法可以检测到它。怎么能完全检测到它?


1
这篇文章可能对您有帮助。
安东

6
如果您要做的只是检查其输出,那么冒着学究的风险,实际上不可能确定地说给定的源不是随机的。您可以连续掷出次公平硬币并每次都获得正面,而在10 100 + 1次抛掷中获得正面的机会仍然是50%。通过检查源,我们通常可以识别非随机事物(例如,伪随机数生成器……我们可以根据种子和算法预测序列)。许多明显的随机性来源可能还不够了解,无法可靠地进行预测。不过,这是哲学上的。1010010100+1个
Patrick87

@ Patrick87如果用“确定性”来表示数学上的意思,那是真的。但是,有统计测试可以使您具有任意重要性(前提是数据为“良好”)。
拉斐尔

@ Patrick87虽然听起来平凡的风险......你说:“你可以翻转一个公平的硬币次连续并获得头每次” ......不,我不能。任何能够让我连续看到10个3个脑袋但仍然相信这是一个公平的硬币的模型都无法很好地捕捉现实。不过,这确实是哲学上的。;-)10100103
唐·哈奇

Answers:


15

真正随机的计算机:

从理论上讲,图灵机不可能实现真正的随机性,而且大多数计算机都无法生成真正的随机输出。因此,某些现代计算机包括允许计算机访问外部源的硬件,希望该外部源将具有一定的随机性。如何实现此目的的一个示例是跟踪计算机内部温度的细微波动。随机性也可以从外部来源获得。但是从您的帖子的语气来看,我不认为您感兴趣的是外部随机性。

种子:

没有外部附加条件,计算机所做的一切都是确定性的。这导致了一个大问题:如果您调用随机数生成程序,则每次输入相同的结果都会得到相同的结果。显然,我们需要一个程序,该程序输出一个随机数以在每次运行时更改其行为(否则,我们将不断获得相同的“随机”数,这并不是特别有用)。一种想法是为程序提供一些输入,每次运行该程序都会更改它,以便输出不同的数字。我们称此输入为“种子”。随机数生成器需要获取种子,执行一些操作,然后为我们提供一个随机数。

当前系统时间是种子的经典示例。这将产生一个具有高熵的长字符串,并且如果以足够精细的方式跟踪时间(即,如果系统时钟使用小时,那么“时间”是很差的种子),则您不太可能提供伪随机数两次生成相同的数字。

足够随机的算法:

现在,我们有了一种算法,每次运行至少都有一些不同的方法。我们给它提供一个种子,并且当使用相同种子提示时算法给出相同的数字,但我们希望它生成的数字是随机的。就像上面的操作一样-您输入一些输入,并且产生一些输出(希望与输入足够不同,成为“随机”输出)。

现在,假设您想出了自己的算法来执行此操作,并且您声称给它提供了许多不同的种子时,得出的数字几乎接近随机数。我们将如何测试它的质量?

现在,我们需要某种算法来获取种子,进行一些操作并产生一个随机数。最简单地说,该算法只能输出种子-每次给出的种子数都不相同,而随机种子则为我们提供随机输出。但这显然不是我们想要的。另一方面,就像许多实际的伪随机数生成器一样,算法可能相当复杂。我们如何分辨哪些算法从我们不必要的种子中为我们提供了“随机”数?如果我们不能准确地得到它,我们怎么知道哪个最好?

1个ñ

随机足以欺骗攻击者:

现在,您可能要指的是加密安全伪随机生成器。我认为最好的解释方法是在上述情况下-在这里,我们将随机性用于密码学,因此,在设计测试时,我们真正关心的是某人无法破解通过预测我们选择了什么随机数来确保我们的安全。我不知道您对密码学的熟悉程度,但可以想象我们正在做一个简单的替换密码-每个字母都被其他字母替换。我们希望随机选择这些替代品,因此攻击者很难猜测它们。但是,如果他能弄清楚我的随机数生成器是如何工作的,那么他将能够解决整个密码!因此,密码算法需要特别难以猜测的随机数生成器。

因此,CSPRG的定义是根据其他算法对它们的求解效果(这是我们最终遇到的问题)。具体来说,假设我有一个CSPRG,我将其称为R。当且仅当没有可行的算法可以猜测下一个要输出的位时,R才是CSPRG。即使您知道它输出的所有先前位,也是如此!

因此,假设我的CSPRG输出的前五位是10100。您不知道我用于程序的输入,但是可以访问用于编写CSPRG的代码。然后声称您不可能编写一个程序来确定下一位输出是101000还是101001。

因此,出于密码学的原因,有时会根据对其他程序的可预测性来定义伪随机数生成器的性能。请注意,这仍然给出了很多“随机性”的直觉,例如(例如)如果您知道所有随机输出都是奇数,则既不是加密安全的,也不是通过常识随机性测试的。


7
总体而言,这是一个好答案(但不完整),但是有两点是错误的。“对于计算机来说,真正的随机性是不可能的,因为它们所做的一切都是确定性的。”并非总是如此,某些处理器包括硬件RNG。计算机还可以对可能是随机的外部输入作出反应。“……对于密码学来说,所以我们真的不在乎它们在分布方面有多“随机””:实际上,有时在加密中均匀分布很重要,例如CBC的IV和DSA中的k参数。
吉尔(Gilles)'所以

他写道:“没有外部的补充,计算机所做的一切都是确定性的”。如前所述,外部添加是对诸如RNG之类的设备的引用。没有这些增加,我们的计算能力就等于不可能具有真正随机性的TM的计算能力。
肯特·蒙特·卡斯珀森

如果我没记错的话,我在吉尔斯的评论后补充了这一点。
SamM 2014年

4

最近,我在麻省理工学院CSAIL计算理论小组博客上找到了一篇有关计算中随机性的好文章:您能告诉我是否有些随机性吗?

文章首先从Avi Wigderson的精彩演讲中 提取了一些想法,这些话题涉及计算中随机性的强大功能和局限性,调查了随机算法的美丽领域,以及伪随机性与计算难处理性之间令人惊讶的联系

然后总结了有关量子密码学的一些最新成果。特别是有效测试某种设备的输出是否真正随机的方法(随机扩展协议)。

例如,请参见Umesh Vazirani,Thomas Vidick,可验证的量子骰子(或可测试的指数随机扩展)的最新工作。

摘要: 我们介绍了一种协议,通过该协议,一对量子机械设备可以用于从O(log n)个均匀位的种子生成n位真正的随机性。仅根据用户可以执行的简单统计测试,并假设设备遵守无信号原则,才可以证明所生成的比特是随机的。设备的内部运作没有其他假设。...


3

假设您正在谈论统计随机性 -加密还有其他需求!-大量的拟合优度测试可以检测数字序列是否适合给定的分布。您可以使用它们来测试(伪)随机数生成器是否健全(取决于测试的质量和所选的重要性)。

Diehard测试套件结合了不同的方法。


0

这是计算机科学中的一个广泛/复杂的话题,SamM的其他答案也解决了一些。您的具体问题似乎与计算机是否具有所谓的PRNG(即伪随机数生成器)有关,如何才能检测到这一点?

简短的答案是,构建了非平凡的PRNG,因此无法检测(推导)其算法。通常,如果PRNG是所谓的“安全”,即使攻击者知道用于生成伪随机序列的算法,他们也无法猜测用于生成序列的特定参数。通过这种方式,伪随机性与密码学有着许多深厚的联系,并且人们可以谈论“破坏” PRNG的方式与可以“破解”密码算法的方式几乎相同。这个领域有许多研究论文,它是密码学最前沿的活跃领域。

对于“平凡”的PRNG(例如线性同余生成器),如果攻击者知道用于生成它的算法并且不是使用“ bignums”生成的,则搜索空间“相对较小”,并且理论上攻击者也可以找到参数由特定PRNG使用,基本上是通过蛮力并尝试所有组合。

在某些情况下,可以通过对PRNG进行大量的统计随机性测试来破坏PRNG(再次取决于其“安全性”)。例如,这就是程序“ Dieharder”(由Brown 编写)的原理。还有一个NIST套件

打破PRNG的内在难度/难度尚未在理论上得到严格的证明,但基本上与所谓的“活板门”或“单向函数”相关,它们可以在一个方向上有效地计算,但“难以”反转(反向) 。在密码学中,关于随机性硬度存在一些未解决的问题。这些问题与复杂性类别分离密切相关,例如著名的P =?NP问题。

有关破坏PRNG的问题还与Kolmogorov复杂度有关,Kolmogorov复杂度是一个研究可生成序列的最小图灵机的领域。破解PRNG还与找到“最短”程序来计算伪随机序列密切相关。通常,Kolmogorov的复杂性无法确定。

正如Gilles在评论中指出的那样,确实存在基于硬件的RNG,这些RNG是由物理电子过程构建而成的,例如与量子噪声相关的过程。如果设计正确,这些是坚不可摧的。


“构建非平凡的PRNG,以便无法检测(推导)其算法”-我认为这是不对的。实际上,您的下一个句子与此矛盾。您要修改答案来解决此问题吗?
DW

可以更精确地充实它,但不能遵循,您的具体反对意见是什么?关键是,如果算法是安全的,则不能仅凭暴力手段仅凭数据序列来确定生成序列的算法,并且在这种情况下暴力手段不太可能成功。
vzn 2014年

1
我的具体异议是,这句话对我来说听起来是错误的:听起来您在说PRNG的设计目的是使观察其输出的人无法推断出算法是什么,但事实并非如此。大多数PRNG并不是为了阻止某人学习算法而构建的。通常,该算法是公开的。也许您的意思是建立PRNG,以便不能将它们的输出与真实随机位区分开?
DW

1
“如果算法是安全的,则仅凭数据序列就不能仅凭数据序列来确定生成序列的算法”-这也不正确。该算法通常是公开的。只是种子是非公开的,并且只有种子很难从输出中获得。
DW

-1

实际上,经典计算机所做的每一件事都是确定性的,即当您给他们一些任务时,它将以确定性的方式跟随它们。因此,如果您想拥有一个随机数,则可以根据时间(基于用户的输入时间)相应地对其进行计算,但是,如果您想要拥有一组随机数,则不能将时间用于下一个数字,因为数字将不再是独立的。

人们要做的是使用具有种子的伪随机生成器,即用于计算伪随机数生成器的所有数字的数字(在某些更复杂的模拟或其他任务中,可能需要更多的种子,如果需要一组以上的独立随机数)。如果要获得可重复的结果,则种子通常为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 /


这并不能真正回答问题。您将说明如何生成随机数,而不是如何检测给定的RNG是否随机。即使这样,您的解释还是有些欠缺,线性一致并不是“最好的”之一。现在确实存在硬件RNG,不需要量子计算。您很有可能在PC上拥有一个,在手机中拥有一个,甚至在信用卡中拥有一个。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.