5

我必须构建一个 One Time Pad 系统,为此,我必须构建自己的 TRNG。我想知道如何记录大气噪声并使用它来生成随机数。到目前为止,我已经尝试记录一个 .wav 文件并用 Java 读取它,但这些值似乎不是很……随机。有什么建议么?我知道 Random.org,但我不能真正使用他们的生成器,我必须自己构建,所以我想要了解 Random.org 的人们如何构建他们的数字生成器,将大气噪声作为“随机性”的来源。

4

6 回答 6

5

非实时解决方案

您可以做的是在之前录制房间周围的音频并保存一个临时的 WAV 文件。如果您知道基于 RIFF 规范的 WAV 文件是如何工作的。然后剥离长度为 44 字节的 WAV 标头。然后读取音频字节并根据您是否要生成 WORDS、DWORDS 或 BYTES 进行适当的转换,这取决于您。然后你应该有一些随机值可以使用。然后相应地使用这些随机值。

实时解决方案

因为我不知道你是想用 Java 还是其他语言来编程。另外,我不知道预期的平台;所以我不能向你推荐任何实时音频处理库。

对于 C#,您可以使用 NAudio,您可以实时录制音频并接收音频字节。然后您可以将音频字节转换为 DWORD、QWORD、WORD 等。您应该能够拥有一些随机值。请记住在停止生成随机数时停止记录并释放非托管资源。

关于 WAV 文件规范的好资源

WAV 文件结构

链接到规范(易于理解)

于 2012-08-07T18:31:15.770 回答
3

答案是未知的,可能是故意的。虽然很难确定,但该网站似乎是慈善和营利性工作的结合。每个无线电源仅产生几 Kbps 的随机数据。他如何在许多链接中描述它,我没有看到 CSRNG 的证据。没关系。出于 OTP 的目的,如果它不是真正随机的,它就是一种美化的流密码。(我认为这是布鲁斯和其他人一直说的。)

我很难回忆起一个好的 CSRNG 何时被破坏。我建议您使用 ISAAC 之类的东西或正确实施的块/流密码。Perfect Paper Passwords 可以做到这一点。使用带有 Fortuna 内部结构的 Fortuna 结构,使用上述密码/算法来生成大部分随机数据。Fortuna 系统可以定期通过 TRNG 将数据注入其中。预算中最好的 TRNG 是 random.org 加上本地生成的东西。最便宜的硬件解决方案是带有威盛挂锁(TRNG + SHA-1、SHA256、AES 和 RSA 加速)的威盛 Artigo 板,售价 300 美元。他们也有帮助你使用东西的库。(甚至还有一个伪 TRNG 在网络负载下使用处理器计时。)

请记住,加密货币通常是链中最强的环节。系统安全存在于许多层面:处理器、固件、外围固件(尤其是 DMA)、内核模式代码、操作系统、受信任的中间件或操作系统功能、应用程序。安全作为一个整体包括用户、策略、物理安全、EMSEC 等。任何过度担心 RNG 的人通常是在浪费精力。只需使用可接受的解决方案或我上面提到的东西。然后,专注于其余部分。尤其是人与系统的交互方式。配置、修补、操作系统选择、策略。大多数问题都发生在那里。

于 2012-04-15T03:22:07.653 回答
2

我记得 random.org 上的一篇文章,我现在似乎找不到了。我都记得他们使用了他们测量的噪声的 lsb。MSB 肯定不会是随机的。然后根据 lsb 生成一串 1 和 0。不要做一些愚蠢的事情,比如简单的二进制转换,那是行不通的。您可能必须以二进制形式对噪声进行采样,以使 lsb 的分布具有更均匀的采样。

他们用来确保均匀分布的技巧是不使用这个由 1 和 0 组成的字符串作为随机数。相反,他们会解析字符串,一次 2 位。每次匹配位(即 00 或 11)时,它们都会在随机字符串中添加 1。每次翻转位(即 01 或 10)时,它们都会在随机字符串中添加一个 0。

如果您制作自己的 TRNG,请务必验证它!

于 2012-01-19T01:14:05.210 回答
0

几乎不可能从软件中得到真正的随机数。即使是 wav 文件中的静态也可能会受到计算机产生的周期性 EMI 的影响,因此不是纯粹随机的。

您可以使用特殊硬件还是被迫坚持使用纯软件?为什么伪随机数不能满足您的需求?他们会在相对较少的随机样本上做得很好。因为您想在 OTP 中使用随机数,所以我猜您不会大规模使用它。

你能提供更多细节吗?

于 2011-11-03T07:51:05.440 回答
0

产生随机数的大气噪声方法很复杂,因为大气中充满了非随机信号,所有这些都污染了你寻找的熵。有一个更简单的方法。

很有可能您的 CPU 已经包含一个真正的随机数生成器,假设您有一个基于 Intel Ivy Bridge 的 Core/Xeon 处理器,该处理器于 2012 年 4 月上市。(新的 Haswell 架构也具有此功能)。

英特尔的随机发生器利用了不稳定数字电路内热噪声的随机效应。热噪声只是随机的原子振动,这与 Random.org 在对大气噪声进行采样时使用的基本物理现象几乎相同。采样的随机位经过复杂的调节和测试过程,以消除非随机信号的污染。我强烈推荐这篇关于 IEEE Spectrum 的优秀文章,它详细描述了这个过程。

英特尔添加了一个名为的新 x86 指令RDRAND,允许程序直接检索这些随机数。尽管 Java 尚不支持直接访问RDRAND,但可以使用 JNI。这是我对drnglib 项目采取的方法。例如:

DigitalRandom random = new DigitalRandom();
System.out.println(random.nextInt());

nextInt()方法实现为调用RDRAND. 考虑到随机性的质量,性能相当不错。使用 8 个线程,我生成了大约 760 MB/秒的随机数据。

于 2013-06-23T13:57:16.083 回答
0

真随机数发生器 (TRNG) 通常来自地震信号、非平稳生物信号等自然源。这些发生器面临的两个问题是:1) 数据点分布不均匀 2) 需要很长时间生成大量数字序列的时间(特别是当需求以百万计时)。然而,他们最重要的优势是他们不可预测的性质。为了克服他们的问题并保持其优势,最好将 TRNG 的输出融合到伪随机数生成器中。为此,您可以尝试在随机时间点使用大气噪声的幅度值,并使用它来播种 PRNG。这将帮助您获得大量均匀分布的值。由于种子是不可预测的,因此 PRNG 的输出也变得不可预测。

于 2019-03-13T12:11:10.257 回答