真随机数发生器

对不起,这不是一个“真正的”问题,但有时候我记得在这里看到一个post,随机随机随机随机生成真正的随机数字,而不只是伪随机。 我没有看到它,如果我search它。

有人知道那篇文章吗?

我相信那是在thedailywtf.com – 即。 不是你想要做的事情。

无论您调用randomize()多less次,都无法从伪随机数中获得真正的随机数。

可以从特殊的硬件获得“真实”的随机数。 你也可以从鼠标移动和类似的东西收集熵。

我不得不不同意这个问题的很多答案。

可以在计算机上收集随机数据。 如果不能,SSL,SSH和VPN将不安全。

软件随机数发生器的工作方式是从许多不同的地方收集随机数据 ,如时钟漂移,中断时序等。

这些scheme的诀窍在于正确地估计 (随机性的名字)。 只要你正确地估计熵,那么源是否是偏见并不重要。

为了说明这一点,在这个评论中我碰到字母e的机会远远高于z ,所以如果我使用关键中断作为熵的来源,那将是偏见 – 但是仍然存在一些随机性在那个input。 你不能准确预测这一段中下一个字母的顺序。 您可以从这个不确定性中提取熵,并将其用作随机字节的一部分。

像Yarrow这样的高质量的实际随机生成器具有相当复杂的熵估计,并且只会发出尽可能多的字节,因为它可以可靠地说出它在“随机池”中的字节数。

在这篇文章的最后,我会回答你为什么要使用多个随机数生成器来实现“更多随机性”的问题。

关于随机性意味着什么有哲学辩论。 在这里,我的意思是“在统一的(0,1)iid分布的各方面,我不能指出”我完全忽略了随机性的哲学问题。

Knuth第2卷有一个分析,他试图创build一个随机数发生器,然后分析它为什么失败,以及真正的随机过程是什么。 第2卷详细研究了RNG。

其他人推荐使用随机物理过程来生成随机数字。 然而,正如我们在Espo / vt相互作用中所看到的那样,这些过程可以有细微的周期性元素和其他非随机元素,部分原因是由于具有确定性行为的外部因素。 一般来说,最好不要假设随机性,而总是要testing它,如果你知道这些东西,你通常可以纠正这种文物。

有可能创build一个“无限”的位stream,这些位stream完全是随机的,确定性的。 不幸的是,这种方法在内存中增加了要求的位数(因为它们必须避免重复周期),所以它们的范围是有限的。

实际上,使用具有已知属性的伪随机数发生器几乎总是更好。 要查找的关键数字是相空间维度(在样本之间大致偏移,您仍然可以依靠统一分布)和位宽度(每个样本中相对于对方一致随机的位数)和周期大小(分布开始重复之前可以采样的数量)。

但是,由于给定发生器的随机数是以已知的顺序确定的,所以你的程序可能会被某个人通过发生器search并find一个alignment顺序而暴露。 因此,如果您维护两台发电机,您很可能会避免您的分配被立即识别为来自特定随机数发生器。 从第一步开始,我们对样本进行抽样,然后将这个统一映射到一个n,其中n至多是相位维度。 然后,在第二次你抽样i次,并返回第i个结果。 这会在最坏的情况下将你的周期尺寸减小到(原始周期尺寸/ n),但是在那个周期中,仍然会产生统一的随机数,并且这样做的方式使得寻找alignment指数n。 这也会减less独立的相位长度。 除非您了解减less的周期和独立的相位长度对您的应用程序意味着什么,否则不要使用此方法

一个真正的随机数algorithm不能存在,因为随机数的定义是:

具有不可预测的结果,并且在理想的情况下,所有的结果同样可能; 由此select而产生; 缺乏统计相关性。

伪随机数发生器(PRNGs)有更好或更坏的结果,即完全可预测的数字序列,在不知道被称为种子的信息的情况下难以预测。

现在,很难推断种子的PRNG是encryption安全的 。 如果这是您所寻求的,您可能需要在Google中查找它们。

另一种方法(不pipe这是否是真正的随机是哲学问题)是使用随机数据源。 例如,不可预测的物理量,如噪音,或测量放射性衰变。

他们仍然受到攻击,因为他们可以独立测量,有偏见,等等。 所以这真的很棘手。 这是通过相当昂贵的定制硬件完成的。 我不知道/dev/random有多好,但是我敢打赌,这对于密码学来说还不够好(大多数encryption程序都带有自己的RNG,而Linux在启动时也会寻找一个硬件RNG)。

根据维基百科 /dev/random ,在类Unix操作系统中,是一个特殊的文件,可以作为一个真正的随机数生成器。

/ dev / random驱动程序收集来自各种非确定性来源的环境噪声,包括但不限于在操作系统环境中发生的键盘间定时和中断间隔定时。 噪声数据被采样,并与一个类似CRC的混合函数组合成一个不断更新的“熵池”。 随机位串是通过对该池的内容进行MD5散列获得的。 单向散列函数从池数据中提取真正的随机比特,并隐藏来自对手的池的状态。

/ dev / random例程维护池中真随机性的估计,并在每次请求使用随机string时减less它。 当估计值降到零时,例程会locking并等待非确定性事件的发生来刷新池。

/ dev / random内核模块还提供另一个接口/ dev / urandom,它不等待熵池重新计算并返回所需的字节数。 因此/ dev / urandom在生成时相比于/ dev / random更快,只有当需要非常高质量的随机性时才使用它。

约翰·冯·诺依曼(John von Neumann)曾经说过,“任何试图通过algorithm手段产生随机数的人当然都活在罪中”。

在math家或物理学家的意义上,甚至没有/ dev / random是随机的。 甚至连放射性同位素衰变测量都是随机的。 (衰减率是,测量不是,盖革计数器在每次检测到事件后都有一个小的复位时间,在这段时间内,他们无法检测到新的事件,这就导致了一些微妙的偏差。不完全消除它。)

停止寻找真正的随机性。 一个好的伪随机数发生器真的是你在找什么。

如果你相信一个确定性的宇宙,那么真正的随机性就不存在了。 :-)例如,有人提出放射性衰变是真正的随机性,但恕我直言,因为科学家还没有制定出这种模式,并不意味着没有一个模式可以解决。 通常情况下,当你需要“随机”数字时,你需要的是encryption的数字,没有其他人能够猜到。

最接近你可以随意的是衡量自然的东西,没有敌人也能够衡量。 通常情况下,从测量结果中丢掉最重要的位,使数字更容易均匀分布。 硬核随机数用户可以获得测量放射性事件的特殊硬件,但是通过按键间隔和鼠标移动等方式,用户可以通过计算机获得一些随机性。如果计算机没有直接用户,则可以通过CPU温度传感器,并从networkingstream量。 你也可以使用连接到声卡的networking摄像头和麦克风,但我不知道是否有人这样做。

总结一下已经说过的一些话,我们对什么是一个安全的随机性来源的定义与我们对密码安全的定义是类似的:如果聪明的人看了它,并且不能显示它不是“完全不可预知。

没有任何系统可以产生无法预测的随机数字,就像没有encryption密码不可能被破解一样。 用于重要工作的可信解决scheme仅仅是那些迄今为止难以打败的解决scheme。 如果有人告诉你,他们正在卖东西。

聪明在密码学中很less得到回报。 去尝试和真正的解决scheme。

一台电脑通常有许多随机噪声的物理来源:

  • 麦克风(希望在嘈杂的地方)
  • 来自networking摄像头的压缩video(指向可变的东西,比如熔岩灯或街道)
  • 键盘和鼠标的时间
  • networking包的内容和时间(全球贡献)

有时

  • 基于时钟漂移的硬件
  • 盖革计数器和其他罕见事件的检测器
  • 各种传感器连接到A / D转换器

估计这些来源的熵是困难的,尽pipe数据率高且变化很大,但在大多数情况下, 但是熵可以用保守的假设来估计,或者至less不会被浪费掉,来喂养像Yarrow或Fortuna这样的系统。

不可能获得“真正的”随机数,计算机是一个逻辑构造,不可能创build“真正”的随机任何东西,只是伪随机的。 然而,那里有更好和更差的伪随机algorithm。

为了获得一个“真正的”随机数,你需要一个物理的随机源,一些赌博机器实际上有内置的 – 通常它是一个放射源,放射性衰变(据我所知真正是随机的)被用来产生号码。

生成随机数的最好方法之一是通过时钟漂移 。 这主要适用于两个振荡器。

比喻一下这个工作原理是如何设想一个简单的椭圆形赛车上的赛车,在赛车开始时有一条直线,在其中一条轮胎上也是一条直线。 当赛车完成一圈时,将根据道路上的白线位置和轮胎上的位置差异产生一个数字。

很容易产生和不可能预测。