抱歉这不是一个“真正的”问题,但有时我记得在这里看到一篇关于随机化随机化器以生成真正随机数的帖子,而不仅仅是伪随机数。如果我搜索它,我看不到它。
有人知道那篇文章吗?
抱歉这不是一个“真正的”问题,但有时我记得在这里看到一篇关于随机化随机化器以生成真正随机数的帖子,而不仅仅是伪随机数。如果我搜索它,我看不到它。
有人知道那篇文章吗?
我不得不不同意这个问题的很多答案。
可以在计算机上收集随机数据。如果不能,SSL、SSH 和 VPN 将不安全。
软件随机数生成器的工作方式是从许多不同的地方收集随机数据池,例如时钟漂移、中断时序等。
这些方案的诀窍在于正确估计熵(随机性的时髦名称)。只要你正确估计熵,源是否是偏差并不重要。
为了说明这一点,我在此评论中击中字母e的机会比z高得多,所以如果我使用键中断作为熵的来源,那将是偏差 - 但仍然存在一些随机性在那个输入中。您无法准确预测本段中接下来会出现哪个字母序列。您可以从这种不确定性中提取熵并将其用作随机字节的一部分。
像Yarrow这样的高质量实随机生成器内置了相当复杂的熵估计,并且只会发出它可以可靠地说它在其“随机池”中的尽可能多的字节。
我相信那是在thedailywtf.com 上- 即。不是你想做的事情。
无论您调用多少次 randomize(),都无法从伪随机数中获得真正的随机数。
您可以从特殊硬件中获得“真正的”随机数。您还可以从鼠标移动之类的东西中收集熵。
在文章的最后,我将回答你为什么要使用多个随机数生成器来实现“更多随机性”的问题。
关于随机性的含义存在哲学争论。在这里,我的意思是“在所有方面都与所抽取样本上的均匀(0,1)独立同分布分布无法区分”我完全忽略了随机是什么的哲学问题。
Knuth 第 2 卷有一个分析,他尝试按照您的建议创建一个随机数生成器,然后分析它失败的原因,以及真正的随机过程是什么。第 2 卷详细检查了 RNG。
其他人建议您使用随机物理过程来生成随机数。然而,正如我们在 Espo/vt 相互作用中看到的那样,这些过程可能具有微妙的周期性元素和其他非随机元素,部分原因是具有确定性行为的外部因素。一般来说,最好永远不要假设随机性,而是始终对其进行测试,如果您知道这些伪影,通常可以纠正它们。
可以创建一个“无限”的比特流,这些比特流看起来完全随机、确定性。不幸的是,这些方法在内存中随着请求的位数而增长(因为它们必须这样做,以避免重复循环),所以它们的范围是有限的。
在实践中,使用具有已知属性的伪随机数生成器几乎总是更好。要寻找的关键数字是相空间维度(它在您仍然可以指望均匀分布的样本之间大致偏移)和位宽(每个样本中相对于彼此均匀随机的位数) 和循环大小(在分布开始重复之前可以采集的样本数)。
但是,由于来自给定生成器的随机数确定性地处于已知序列中,因此您的过程可能会被某人搜索生成器并找到对齐序列而暴露。因此,如果您维护两个生成器,您可能会避免立即将您的分布识别为来自特定的随机数生成器。从第一个开始,您对 i 进行采样,然后将其均匀地映射到一个到 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/urandom 在生成时比 /dev/random 快得多, /dev/random 仅在需要非常高质量的随机性时使用。
John von Neumann 曾经说过“任何试图通过算法手段生成随机数的人,当然都是活在罪恶之中”。
在数学家或物理学家的意义上,甚至 /dev/random 都不是随机的。甚至放射性同位素衰变测量也不是随机的。(衰减率是。测量值不是。盖革计数器在每次检测到事件后都有一个小的重置时间,在此期间它们无法检测到新事件。这会导致细微的偏差。有办法大大减轻这种情况,但是没有完全消除它。)
停止寻找真正的随机性。一个好的伪随机数生成器确实是您正在寻找的。
如果你相信一个确定性的宇宙,那么真正的随机性是不存在的。:-) 例如,有人提出放射性衰变确实是随机的,但恕我直言,仅仅因为科学家们还没有弄清楚这种模式,并不意味着没有一种模式可以解决。通常,当您想要“随机”数字时,您需要的是其他人无法猜测的加密数字。
最接近随机的方法是测量任何敌人也无法测量的自然事物。通常,您会从测量中丢弃最重要的位,从而使数字更有可能均匀分布。硬核随机数用户可以获得测量放射性事件的特殊硬件,但是您可以从使用计算机的人那里获得一些随机性,例如按键间隔和鼠标移动,如果计算机没有直接用户,来自 CPU 温度传感器,并来自网络流量。您还可以使用连接到声卡的网络摄像头和麦克风之类的东西,但我不知道是否有人这样做。
总结一下已经说过的一些内容,我们对什么是安全随机源的工作定义类似于我们对密码安全的定义:如果聪明的人已经看过它并且无法证明它是随机的,那么它看起来是随机的。 t 完全不可预测。
没有系统可以生成无法想象的随机数,就像没有无法想象的密码密码一样。用于重要工作的可信赖解决方案只是那些迄今为止被证明难以击败的解决方案。如果有人告诉你其他情况,他们就是在卖给你一些东西。
聪明在密码学中很少得到回报。选择久经考验的真正解决方案。
计算机通常有许多现成的随机噪声物理源:
而有时
困难的是估计这些来源的熵,尽管数据速率很高且变化很大,但在大多数情况下熵很低;但是熵可以通过保守的假设来估计,或者至少不会浪费,以供养像 Yarrow 或 Fortuna 这样的系统。
不可能获得“真正的”随机数,计算机是一种逻辑结构,不可能创建“真正”随机的任何东西,只能产生伪随机。然而,有更好和更差的伪随机算法。
为了获得一个“真正的”随机数,您需要一个物理随机源,一些赌博机实际上内置了这些 - 通常它是一个放射源,放射性衰变(据我所知是真正随机的)用于生成号码。
生成随机数的最佳方法之一是通过Clock Drift。这主要适用于两个振荡器。
其工作原理的一个类比是想象一辆赛车在一个简单的椭圆形赛道上,一圈开始有一条线,其中一个轮胎上也有一条线。当汽车跑完一圈后,会根据白线在路面上的位置和轮胎上的位置之差生成一个数字。
非常容易生成且无法预测。