【问题标题】:True random number generator [closed]真随机数生成器[关闭]
【发布时间】:2008-09-01 10:25:46
【问题描述】:

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

有人知道那篇文章吗?

【问题讨论】:

  • 好吧,首先,您需要一些真正的熵来创建一个随机数。 Pseudo-random + Pseudo-random 不是真正的随机生成。 :) 我确实看到了一篇关于在暗箱中使用网络摄像头的噪音作为熵的文章,但这有点超出了主题。
  • 您可以使用来自 random.org> 等服务的真正随机种子为伪随机数生成器播种。但是,如果您知道种子,您仍然可以预测伪随机数生成器。
  • 不在这里,但这里有一些信息和真正的随机数。
    Random.org
  • 我建议将 Bambelweeny 57 Sub-Meson Brain 的逻辑电路连接到一个原子矢量绘图仪,该绘图仪悬挂在一个强大的 Browian Motion 发生器中(比如一杯热茶)。 hitchhikers.wikia.com/wiki/Infinite_Improbability_Drive>

标签: algorithm language-agnostic random prng


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • -1 加密安全伪随机!= 真随机
  • @NullUserException:是的,但这就是重点。熵池中的数据真正随机的,这就是它收集得如此仔细的原因。如果你直接使用这些数据,它确实是随机的;如果你用它来播种 PRNG,你会得到(希望是好的)伪随机值。
  • 有点像 Shannon-whatzama-callz-it? random ^ keyboard = random, bunch of pseudo random inputs xor-ed together = random?
  • @NullUserException:您的“真正随机”数字甚至可能不存在——整个宇宙是从 PRNG 运行的模拟吗?关键是,对于所有实际用途,加密安全的伪随机等价于真正的随机。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

    【讨论】:

    • 呃,什么?避免重复会减少随机性。随机序列重复。没有人会通过“搜索生成器并找到对齐序列”来破解 PRNG。他们要么搜索所有可能的种子,要么如果你使用糟糕的 PRNG,直接找出序列。
    • 另外,你提出的让它“更随机”的建议是通过默默无闻来保证安全。不要发明自己的密码系统,你不够聪明(我也不是)。完全令人满意的加密安全 PRNG 已经很容易获得。
    • 您混淆了样本的重复,四舍五入以适合您所需的范围,并重复系统的整个状态。由于确定性 RNG 是确定性的,如果整个系统的状态相同,则生成器的行为将重复(泵送)。请阅读 Knuth vol 2 或其他内容
    • 致其他读者:不要觉得你不够聪明 a) 测试你正在使用的任何内置生成器(有很多坏的,不适合模拟工作)b)充分了解现有的生成器,以了解哪种生成器适合您的需求 c) 学习以最佳方式使用结果
    • 您说“这种方法在内存中随着请求的位数而增长(因为它们必须这样做,以避免重复),所以它们的范围是有限的。”如果您的意思只是整个状态可以重复(显然就是这种情况),那么限制并不大:n 位状态允许 2^n 状态。
    【解决方案4】:

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

    具有不可预测的结果,并且在 理想情况下,所有结果均等 可能;从这样的结果 选择;缺乏统计 相关性。

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

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

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

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

    【讨论】:

    • +1 - 简单的术语和很好的解释。另外,/dev/random 对于加密来说确实足够好(检查en.wikipedia.org/wiki//dev/random
    • 算法被定义为在有限时间内终止的逐步过程。 PRNG 是一种特定类型的算法,但没有理由我实际上不能拥有基于物理现象的随机数生成算法,例如基于捕获光子并测量其极性的算法。算法和随机的定义都很重要,而且 PRNG 是“算法”的特定子集这一事实。它们都是算法。
    【解决方案5】:

    According to Wikipedia/dev/random,在类 Unix 操作系统中,是一个特殊的文件,用作真正的随机数生成器。

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

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

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

    【讨论】:

    • 不!仅仅因为/dev/random 从当前时间以外的更多来源播种本身并不意味着它是真正随机的。键盘计时和内核抖动并不是真正随机的。但是,我认为它可以使用硬件 RNG 是系统上安装了一个。那么它实际上将是真正随机的。也就是说,在绝大多数情况下,您不需要真正的随机数。我认为我们在我的公司中使用的唯一真正的 RNG 是在一台基本上只生成密钥的机器中的安全加密处理器中。
    • @vt:感谢您提供的信息。我第一段中的信息来自维基百科。如果您获得投票,我将在今晚晚些时候用您的答案更新该维基百科文章。
    • 键盘计时等确实具有一定(如果低)级别的信息熵。如果放入体面的算法中,您可以生成真正的随机性。 /dev/random 是一种实现。 yarrow 算法是另一种。蓍草纸解释它会(谷歌为它)。
    【解决方案6】:

    John von Neumann 曾经说过“任何试图通过算法手段生成随机数的人,当然都是活在罪恶之中”。

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

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

    【讨论】:

    • 硬件无线电衰减 RNG 通常比较三个(检测到的)衰减之间的两个间隔的大小。这解决了死区时间问题。 '当然它会留下 DNL 和其他电子问题,但你需要的不是“真的,真的随机”,而是“足够随机”。
    • 只要我今天在谈物理:你通常不会再为此选择 Geiger-Muller 管了。硅探测器更小、更便宜,并且需要更少的功率。
    • @rjh:很高兴引用诺伊曼的话!
    【解决方案7】:

    如果您相信确定性宇宙,那么真正的随机性就不存在。 :-) 例如,有人提出放射性衰变是真正随机的,但恕我直言,仅仅因为科学家还没有弄清楚这种模式,并不意味着那里没有模式待解决。通常,当您想要“随机”数字时,您需要的是其他人无法猜到的用于加密的数字。

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

    【讨论】:

    • 实际上,已经在数学上证明了量子力学固有的“随机性”背后没有潜在的顺序(贝尔不等式,en.wikipedia.org/wiki/Bell%27s_theorem)。除非你愿意接受非定域性,否则宇宙真的很奇怪:-P
    • 我想在这里强调 Dan 的评论。在 20 世纪的大部分时间里,这是一个争论的焦点,但这个问题在这一点上得到了很好的解决。此外,贝尔定理对于非专业人士来说是令人惊讶的。
    • @Dan - 贝尔定理不排除绝对没有随机性的可能性(参见 Superdeterminism - en.wikipedia.org/wiki/Superdeterminism)。整个宇宙都可能使用一个大 PRNG。
    • 这样的宇宙本质上是非本地的。
    【解决方案8】:

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

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

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

    【讨论】:

      【解决方案9】:

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

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

      有时

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

      很难估计这些来源的熵,尽管数据速率很高且变化很大,但在大多数情况下熵很低;但是熵可以通过保守的假设来估计,或者至少不会浪费,以供养像 Yarrow 或 Fortuna 这样的系统。

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

        • @kronoz:一些处理器(例如 AMD Geode)具有基于噪声晶体管的硬件 RNG,它利用量子随机性作为真正的随机源。放射性衰变是不必要的,还有许多其他同样随机的影响。
        • 有许多源包含足够的熵以适用于随机发生器,热漂移和白噪声就是这样的例子。这些反过来又会影响计算机中的不同组件。测量这种影响可以帮助随机性。
        • 所以...是的,严格来说,计算机无法通过计算生成随机序列,但由于该系统最终基于模拟组件,因此仍然有可能瞥见“真实”世界并提取一些如果它固有的随机性。
        • 放射性衰变不一定是“真正”随机的,我们只是还没有找到它的决定因素。
        • @devinb:虽然不能绝对排除您的说法,但它需要扔掉一个世纪以来经过实验验证的物理学。量子随机性要么是真正随机的,要么是非局部的。无论哪种方式,它都超出了人类的预测。
        【解决方案11】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-09
          • 2013-10-06
          • 2013-04-15
          • 1970-01-01
          • 2016-04-04
          • 2023-03-15
          • 2016-09-02
          相关资源
          最近更新 更多