真随机数发生器

时间:2008-09-01 10:25:46

标签: algorithm language-agnostic random prng

很抱歉这不是一个“真实”的问题,但有时回来我记得在这里看到一篇关于随机随机化随机化生成真正随机数的帖子,而不仅仅是伪随机数。如果我搜索它,我就不会看到它。

有人知道那篇文章吗?

11 个答案:

答案 0 :(得分:27)

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

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

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

这些方案的技巧在于正确估计(随机性的豪华名称)。只要您正确估算熵,源是否为偏差并不重要。

为了说明这一点,我在此评论中点击 e 字母的几率远高于 z ,所以如果我使用键中断作为熵的来源是偏见的 - 但是在这个输入中仍然存在一些随机性。您无法准确预测本段中接下来将会出现哪个字母序列。您可以从这种不确定性中提取熵,并将其用作随机字节的一部分。

高质量的实时随机生成器(如Yarrow)内置了相当复杂的熵估计,并且只发出尽可能多的字节,因为它可以在其“随机池”中可靠地说出它。

答案 1 :(得分:17)

我相信那是thedailywtf.com - 即。不是你想做的事。

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

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

答案 2 :(得分:10)

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

关于随机性意味着什么存在哲学争论。在这里,我的意思是“在所有方面都无法区分统一(0,1)iid分布对所抽取的样本”我完全无视随机的哲学问题。

Knuth volume 2有一个分析,他试图按照你的建议创建一个随机数生成器,然后分析它失败的原因,以及真正的随机过程。第2卷详细研究了RNG。

其他人建议您使用随机物理过程生成随机数。然而,正如我们在Espo / vt交互中所看到的,这些过程可能具有微妙的周期性元素和其他非随机元素,部分原因是具有确定性行为的外部因素。一般来说,最好永远不要假设随机性,但总是要测试它,如果你意识到它们,你通常可以纠正这些伪影。

可以创建一个“无限”的比特流,确定性地完全随机出现。不幸的是,这种方法在存储器中随着要求的位数而增长(因为它们必须避免重复循环),因此它们的范围是有限的。

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

但是,由于来自给定生成器的随机数确定性地采用已知序列,因此搜索生成器并找到对齐序列的人可能会暴露您的过程。因此,如果您维护两个生成器,则可以避免立即将您的分发识别为来自特定随机数生成器。从第一个开始,您对i进行采样,然后将其均匀地映射到一个到n,其中n最多是相位维度。然后,在第二次你抽样i次,并返回第i个结果。在最坏的情况下,这会将周期大小减小到(原始周期大小/ n),但是对于该周期仍将生成均匀的随机数,并且这样做的方式使得在n中搜索对齐呈指数。它还将减少独立相位长度。除非您了解减少循环和独立相长对您的应用意味着什么,否则不要使用此方法。

答案 3 :(得分:10)

真随机数的算法不能存在,因为随机数的定义是:

  

具有不可预测的结果,并且在   理想情况下,所有结果都是平等的   可能;由此产生的   选择;缺乏统计学   的相关性。

有更好或更差的伪随机数生成器(PRNG),即完全可预测的数字序列,如果不知道一条信息就很难预测,称为种子

现在,极难推断种子的PRNG 加密安全。如果这是您所寻求的,您可能希望在Google中查找它们。

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

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

答案 4 :(得分:5)

在类Unix操作系统中,

According to Wikipedia /dev/random是一个特殊文件,可用作真正的随机数生成器。

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

/ dev / random例程维护池中真实随机性的估计值,并在每次请求随机字符串使用时减少它。当估计值降至零时,例程会锁定并等待非确定性事件的发生以刷新池。

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

答案 5 :(得分:4)

约翰·冯·诺伊曼曾经说过“有人试图通过算法手段产生随机数,当然是生活在罪中。”

在数学家或物理学家的意义上,偶数/ dev / random是随机的。甚至放射性同位素衰变测量也不是随机的。 (衰减率是。测量不是。盖格计数器在每次检测到事件后都有一个小的复位时间,在此期间他们无法检测到新事件。这会导致微妙的偏差。有很多方法可以大大减轻这种情况,但是不完全消除它。)

停止寻找真正的随机性。一个好的伪随机数生成器确实是你正在寻找的。

答案 6 :(得分:3)

如果您相信确定性宇宙,则不存在真正的随机性。 :-)例如,有人建议放射性衰变真正随机,但恕我直言,仅仅因为科学家尚未制定模式,并不意味着那里没有模式要解决。通常,当您需要“随机”数字时,您需要的是加密数字,这是其他任何人都无法猜测的。

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

答案 7 :(得分:3)

总结一些已经说过的内容,我们对安全性随机性来源的工作定义与我们对加密安全性的定义类似:如果聪明人看过它并且无法显示它并非完全不可预测。

没有系统用于生成无法预测的随机数,就像没有无法想象的加密密码一样。用于重要工作的可信解决方案仅仅是那些迄今为止难以击败的解决方案。如果有人告诉你,他们会卖给你一些东西。

聪明在密码学中很少得到回报。采用经过验证的真实解决方案。

答案 8 :(得分:3)

计算机通常有许多随时可用的随机噪声物理来源:

  • 麦克风(希望在嘈杂的地方)
  • 来自网络摄像头的压缩视频(指向变化的东西,如熔岩灯或街道)
  • 键盘&鼠标计时
  • 网络数据包内容和时间(全世界都有贡献)

有时

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

估计这些来源的熵是多么困难,尽管数据率很高且变化很大,但在大多数情况下这些来源的熵很低;但熵可以用保守的假设估算,或至少不浪费,以喂养像亚罗或福图纳这样的系统。

答案 9 :(得分:2)

无法获得“真正的”随机数,计算机是一种逻辑结构,不可能创建“真正的”随机任何东西,只能伪随机。然而,有更好和更差的伪随机算法。

为了获得一个“真正的”随机数,你需要一个物理随机源,一些赌博机器实际上内置了这些 - 通常它是放射性源,放射性衰变(据我所知,它是真实的) random)用于生成数字。

答案 10 :(得分:1)

生成随机数的最佳方法之一是Clock Drift。这主要适用于两个振荡器。

这是如何工作的类比,想象一辆赛车在一个简单的椭圆形赛道上,在赛道开始时有一条直线,而在其中一个轮胎上也有一条直线。当汽车完成一圈时,将根据道路上白线位置与轮胎之间的差异生成一个数字。

很容易生成,也无法预测。