13

好的,我想这完全是主观的,但我正在考虑随机数生成器的熵源。大多数生成器都是以当前时间播种的,对吗?好吧,我很好奇还有哪些其他来源可以用来生成完全有效的随机(松散定义)数字。

使用多个源(例如时间 + 当前 HDD 寻道时间 [我们在这里太棒了])一起创建一个比单个源“更随机”的数字吗?来源数量的逻辑限制是什么?多少才真正够?仅仅因为方便才选择时间吗?

如果不允许这种事情,请原谅,但我对来源背后的理论感到好奇。

4

15 回答 15

19

维基百科关于硬件随机数生成器的文章列出了一些有趣的使用物理属性的随机数来源。

我最喜爱的:

  • 由连接到 PC 的盖革计数器检测到的核衰变辐射源。
  • 光子穿过半透明镜子。互斥事件(反射-传输)被检测并分别与“0”或“1”位值相关联。
  • 来自电阻器的热噪声,经过放大以提供随机电压源。
  • 雪崩二极管产生的雪崩噪声。(多么酷啊?)
  • 大气噪声,由连接到 PC 的无线电接收器检测到

维基百科文章的问题部分还描述了许多这些来源/传感器的脆弱性。随着老化/退化,传感器几乎总是产生递减的随机数。这些物理来源应通过统计测试不断检查,可以分析生成的数据,确保仪器没有无声无息地损坏。

于 2008-11-19T02:46:07.863 回答
9

SGI 曾经使用熔岩灯在不同“glob 阶段”的照片作为熵的来源,最终演变成一个名为LavaRnd的开源随机数生成器。

于 2008-11-19T02:53:44.277 回答
5

我使用Random.ORG,它们提供来自大气噪声的免费随机数据,我用它来定期重新播种 Mersene-Twister RNG。在没有硬件依赖的情况下,它几乎是随机的。

于 2008-11-19T02:55:08.907 回答
4

不要担心随机数生成器的“好”种子。序列的统计特性不依赖于生成器的播种方式。然而,还有其他事情。担心。请参阅随机数生成中的陷阱

对于硬件随机数发生器,这些物理源都需要测量,测量过程存在系统误差。您可能会发现“伪”随机数的质量高于“真实”随机数。

于 2008-11-19T02:43:10.350 回答
3

Linux 内核使用设备中断时序(鼠标、键盘、硬盘驱动器)来生成熵。维基百科上有一篇关于熵的好文章。

于 2008-11-19T03:06:52.970 回答
3

现代 RNG 既检查了附近种子中的相关性,又在播种后运行了数百次迭代。所以,不幸的是,无聊但真实的答案是,它真的无关紧要。

一般来说,使用随机物理过程必须检查它们是否符合均匀分布,否则会被去除。

在我看来,使用一个很好理解的伪随机数生成器通常会更好。

于 2008-11-19T03:29:16.933 回答
2

我使用了一个加密程序,该程序使用用户鼠标移动来生成随机数。唯一的问题是程序必须暂停并要求用户随机移动鼠标几秒钟才能正常工作,这可能并不总是可行的。

于 2008-11-19T03:14:30.367 回答
2

几年前我发现了HotBits——这些数字是由放射性衰变产生的,真正的随机数字。

每天可以下载多少个数字是有限制的,但我总是很开心将这些用作 RNG 的真正随机种子。

于 2008-11-19T03:20:22.303 回答
2

一些 TPM(可信平台模块)“芯片”具有硬件 RNG。不幸的是,我的戴尔笔记本电脑中的 (Broadcom) TPM 缺少此功能,但今天出售的许多计算机都配备了使用真正不可预测的量子力学过程的硬件 RNG。英特尔已经实施了热噪声种类。

此外,不要单独使用当前时间来为 RNG 播种用于加密目的或任何对不可预测性很重要的应用程序。将当时的一些低阶位与其他几个来源结合使用可能是可以的。

类似的问题可能对您有用。

于 2008-11-19T19:22:15.467 回答
1

抱歉,我迟到了这个讨论(现在 3 1/2 岁是什么?),但我重新燃起了对 PRN 生成和熵的替代来源的兴趣。Linux 内核开发人员 Rusty Russell 最近在他的博客上讨论了熵的替代来源(除了/dev/urandom)。

但是,他的选择给我留下了深刻的印象。NIC 的 MAC 地址永远不会改变(尽管它与其他所有地址不同),并且 PID 似乎可能的样本量太小。

我涉足了一个Mersenne Twister(在我的 Linux 机器上),它使用以下算法播种。如果有人愿意和感兴趣,我正在征求任何意见/反馈:

  1. 在下面创建一个 64 位 + 256 位 * 文件数的数组缓冲区/proc
  2. 将时间戳计数器 (TSC) 值放在此缓冲区的前 64 位中。
  3. 对于以下每个/proc文件,计算 SHA256 和:

    • /proc/meminfo
    • /proc/self/maps
    • /proc/self/smaps
    • /proc/interrupts
    • /proc/diskstats
    • /proc/self/stat

      将每个 256 位哈希值放入 (1) 中创建的数组的自己的区域中。

  4. 创建整个缓冲区的 SHA256 哈希。注意:我可以(并且可能应该)使用完全独立于 SHA 函数的不同散列函数 - 这种技术已被提议作为针对弱散列函数的“保护措施”。

现在我有 256 位希望随机(足够)的熵数据来播种我的 Mersenne Twister。我使用上面的方法来填充 MT 数组的开头(624 个 32 位整数),然后用 MT 作者的代码初始化该数组的其余部分。此外,我可以使用不同的散列函数(例如 SHA384、SHA512),但我需要不同大小的数组缓冲区(显然)。

最初的 Mersenne Twister 代码需要一个 32 位种子,但我觉得这非常不合适。“仅仅”运行 2^32-1 个不同的 MT 来寻找破解加密货币在当今时代并没有超出实际可能性的范围。

我很乐意阅读任何人对此的反馈。批评是非常受欢迎的。我将捍卫我对上述/proc文件的使用,因为它们在不断变化(尤其是/proc/self/*文件,并且 TSC 总是产生不同的值(纳秒 [或更好] 分辨率,IIRC)。我已经对此进行了顽固的测试(到几千亿比特的曲调),它似乎正在以优异的成绩通过。但这可能更多地证明了 Mersenne Twister 作为 PRNG 的稳健性,而不是我如何播种它。

当然,这些并不是完全不受黑客攻击的影响,但我只是没有看到所有这些(和 SHA*)在我的有生之年被黑客攻击破坏。

于 2012-04-18T01:33:51.023 回答
0

有些使用键盘输入(按键之间的超时),我听说我在小说中认为可以使用无线电静态接收 - 但当然这需要其他硬件和软件......

于 2008-11-19T02:44:12.003 回答
0

宇宙微波背景光谱顶部的噪声。当然,您必须首先去除一些各向异性、前景物体、相关探测器噪声、星系和局部群速度、极化等。仍然存在许多陷阱

于 2008-11-19T19:40:35.337 回答
0

不要担心随机数生成器的“好”种子。序列的统计特性不依赖于生成器的播种方式。

我不同意John D. Cook 的建议。如果您将 Mersenne Twister 的种子设置为除 1 之外的所有位都设置为 0,它最初会生成非随机的数字。生成器需要很长时间才能将这种状态转化为可以通过统计测试的任何东西。简单地将生成器的前 32 位设置为种子将产生类似的效果。此外,如果整个状态设置为零,则生成器将产生无穷无尽的零。

正确编写的 RNG 代码将具有正确编写的种子算法,该算法接受 64 位值并种子生成器,因此它将为每个可能的输入生成合适的随机数。因此,如果您使用的是可靠的库,那么任何种子都可以。但是,如果您将自己的实现组合在一起,那么您需要小心。

于 2009-02-07T14:59:08.873 回答
0

种子的来源并不那么重要。更重要的是伪数生成器算法。然而,我前段时间听说过为一些银行业务生成种子。他们综合考虑了许多因素:

  • 时间
  • 处理器温度
  • 风扇转速
  • 中央处理器电压
  • 我不记得更多了:)

即使其中一些参数没有及时改变,您也可以将它们放入一些好的散列函数中。

如何生成好的随机数?

也许我们可以考虑无限数量的宇宙?如果这是真的,新的平行宇宙一直在被创造,我们可以这样做:

int Random() {
    return Universe.object_id % MAX_INT;
}

每时每刻我们都应该在平行宇宙的另一个分支上,所以我们应该有不同的身份。唯一的问题是如何获取 Universe 对象:)

于 2009-02-07T15:40:33.983 回答
0

如何在一个固定的时间内关闭一个线程,该线程将在一个紧密的循环中操纵一些变量,然后再被杀死。您最终得到的结果将取决于处理器速度、系统负载等...非常老套,但比 srand(time(NULL)) 更好...

于 2009-12-09T23:35:09.560 回答