抱歉,这不是一个“真正的”问题,但我记得以前在这里看到过一篇关于随机随机化随机发生器以生成真正随机数的帖子,而不仅仅是伪随机数。如果我搜索它,我看不到它。

有人知道那篇文章吗?

有帮助吗?

解决方案

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

无论调用 randomize() 多少次,都不可能从伪随机数中获得真正的随机数。

从特殊中获取“真实”随机数 硬件. 。您还可以从鼠标移动等中收集熵。

其他提示

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

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

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

这些方案的技巧在于正确估计 (随机性的时髦名称)。只要你正确估计了熵,来源是否有偏差并不重要。

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

高质量的真实随机生成器,例如 西洋蓍草 它们内置了相当复杂的熵估计,并且只会发出它可以可靠地说它在“随机池”中拥有的字节数。

在文章的最后,我将回答您的问题,即为什么您可能想要使用多个随机数生成器来获得“更多随机性”。

关于随机性的含义存在着哲学争论。在这里,我的意思是“在各个方面都与抽取样本上的均匀 (0,1) iid 分布没有区别”,我完全忽略了随机是什么的哲学问题。

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

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

有可能创建一个“无限”的比特流,它看起来完全是随机的、确定性的。不幸的是,这种方法在内存中随着所需位数的增加而增长(因为它们必须这样做,以避免重复循环),因此它们的范围是有限的。

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

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

真正随机数的算法不可能存在 定义 的随机数为:

具有不可预测的结果,在理想情况下,所有结果同样可能;由这种选择产生;缺乏统计相关性。

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

现在,很难推断种子的 PRNG 是 加密安全. 。如果您想要的话,您可能想在 Google 中查找它们。

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

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

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

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

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

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

约翰·冯·诺依曼曾经说过这样的话:“任何试图通过算法手段生成随机数的人当然都生活在罪恶之中。”

从数学家或物理学家的角度来看,甚至 /dev/random 也不是随机的。甚至放射性同位素衰变测量也不是随机的。(衰减率为。测量结果不是。盖革计数器在每次检测到事件后都有一个较短的重置时间,在此期间它们无法检测新事件。这会导致微妙的偏见。有一些方法可以大大减轻这种情况,但不能完全消除它。)

停止寻找真正的随机性。一个好的伪随机数生成器正是您所寻找的。

如果你相信确定性的宇宙,那么真正的随机性就不存在。:-) 例如,有人建议放射性衰变是 确实 随机,但恕我直言,仅仅因为科学家尚未找出该模式,并不意味着没有可以找出的模式。通常,当您需要“随机”数字时,您需要的是其他人无法猜到的加密数字。

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

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

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

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

计算机通常有许多现成的随机噪声物理源:

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

有时

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

困难的是估计这些来源的熵,尽管数据速率很高并且变化很大,但在大多数情况下熵很低;但熵可以用保守的假设来估计,或者至少不会被浪费,以供养西洋蓍草或福尔图纳这样的系统。

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

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

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

其工作原理的一个类比是想象一辆赛车在一个简单的椭圆形赛道上,在一圈的开始处有一条白线,在其中一个轮胎上也有一条白线。当汽车跑完一圈时,会根据道路上白线和轮胎上白线的位置差异生成一个数字。

非常容易生成且无法预测。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top