备选熵源

13

好的,我猜这完全是主观的等等,但我在思考随机数生成器的熵来源。通常生成器使用当前时间作为种子,对吧?那么,我很好奇还有哪些其他的来源可以用来产生完全有效的随机(宽松定义)数字。

使用多个来源(例如时间+当前硬盘寻道时间[我们在这里进行幻想])一起创建的数字是否比单个来源的数字更“随机”?源数量的逻辑极限是什么?多少才足够?选取时间只是因为它方便吗?

如果这种提问不被允许,请原谅,但我很好奇这些来源背后的理论。


九。九。九。九。……这就是随机性的问题,你永远无法确定。 - tvanfosson
1
RFC 1149.5规定4为标准IEEE认证的随机数。 - Chris Charabaruk
15个回答

19

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

我的最爱:

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

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


2
项目想法:USB 仓鼠轮 - Ates Goral
1
从技术上讲,其中有几个不是随机的,它们只是比任何模拟在未来的100年内都要复杂数百个数量级... - RCIX
雪崩噪声并不像你想象的那么酷。它指的是在非导电材料中积累的自由电子:https://en.wikipedia.org/wiki/Avalanche_breakdown - Andreas

9

SGI曾经使用熔岩灯在各种“球形阶段”拍摄的照片作为熵的来源,最终演变成了一个名为LavaRnd的开源随机数生成器。


5

我使用Random.ORG,它们提供来自大气噪声的免费随机数据,我用它来定期重新生成 Mersene-Twister RNG 的种子。这是一种没有硬件依赖性的最随机的方法。


4
不必担心随机数生成器的“好”种子。序列的统计属性不取决于生成器的种子。然而,还有其他需要担心的事情。请参见Pitfalls in Random Number Generation
至于硬件随机数生成器,这些物理源必须进行测量,而测量过程存在系统误差。您可能会发现“伪”随机数比“真实”随机数具有更高的质量。

3

Linux内核使用设备中断时间(鼠标、键盘、硬盘)来生成熵。维基百科有一篇关于熵的不错的文章


3
现代随机数生成器在种子附近检查相关性并进行几百次迭代。因此,令人遗憾但却是真实的答案是它并不非常重要。
一般来说,使用随机物理过程必须检查它们是否符合均匀分布和其他趋势。
在我看来,更好的方法通常是使用非常容易理解的伪随机数生成器。(参考链接)

2

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


2
我几年前发现了HotBits——这些数字是从放射性衰变中生成的,是真正的随机数。
每天下载数字有限制,但我一直很有趣地将它们用作RNG的真正、真正随机的种子。

2
一些可信平台模块(TPM)“芯片”拥有硬件随机数生成器。不幸的是,我的Dell笔记本上的(Broadcom)TPM缺乏此功能,但今天出售的许多计算机都配备了使用真正不可预测的量子力学过程的硬件随机数生成器。英特尔已经实现了热噪声类型的随机数生成器。
同时,不要仅使用当前时间来为密码目的或任何需要不可预测性的应用程序提供随机数生成种子。将时间的几个低阶位与其他几个源结合使用可能是可以接受的。
您可能会发现类似的问题对您有用。

1

很抱歉我来晚了(这个讨论已经进行了3年半了?),但我对PRN生成和替代熵源产生了新的兴趣。Linux内核开发人员Rusty Russell最近在他的博客上讨论了替代熵源(而不是/dev/urandom)。

但是,我对他的选择并不是很满意;网卡的MAC地址永远不会改变(虽然它与所有其他地址都不同),而PID似乎是一个可能样本量太小的选择。

我已经在我的Linux机器上尝试了Mersenne Twister,它使用以下算法进行种子生成。如果有人愿意并感兴趣,请提供任何评论/反馈:

  1. 创建一个数组缓冲区,其大小为64位 + /proc 文件数量 * 256位。
  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总是产生不同的值(纳秒[或更好]分辨率,如果我没记错的话)。我已经在这方面运行了Diehard tests(达到数百亿个比特),看起来表现良好。但这可能更多地证明了Mersenne Twister作为PRNG的可靠性,而不是我如何进行种子处理。

当然,这些并不是完全无法被黑客攻击的,但我只是不认为所有这些(以及SHA*)都会在我的有生之年被攻破和破解。


我知道我回复晚了6年,但我认为你的方法过于复杂。如果您不想使用/dev/urandom来种子化您的PRNG(您始终应该这样做),那么您可以只读取/proc/sys/kernel/random/uuid三次,使用SHA-256哈希三个结果,并将其用作种子。每个都是类型4 UUID,提供122位熵。因此,两个UUID仅提供244位,这就是为什么您需要收集三个并使用SHA-256进行哈希处理的原因。这是更好的方法,因为/proc/sys/kernel/random/uuid是使用密码安全的/dev/urandom生成的。 - Aaron Toponce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接