使用大气噪声的真随机数发生器

问题描述 投票:5回答:6

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

random numbers trng
6个回答
5
投票

Non Real-time solution

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

Real-time solution

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

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

Good Resources On The WAV File Specification

Link to the specification (Easy to understand)


3
投票

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

我发现很难回想起一个好的CSRNG何时被打破。我建议您使用类似ISAAC或正确实现的块/流密码。完美的纸质密码就是这样做的。使用Fortuna结构和Fortuna的内部结构,使用上述密码/算法生成大部分随机数据。 Fortuna系统可以定期向TRNG注入数据。预算上最好的TRNG是random.org和本地生成的东西。最便宜的硬件解决方案是带VIA Padlock的VIA Artigo主板(TRNG + SHA-1,SHA256,AES和RSA加速),售价300美元。他们也有图书馆来帮助你使用东西。 (甚至有一个伪TRNG在网络负载下使用处理器时序。)

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


2
投票

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

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

如果您自己制作TRNG,请务必进行验证!


0
投票

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

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

你能提供更多细节吗?


0
投票

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

假设您拥有基于英特尔Ivy Bridge的Core / Xeon处理器,并且可以在2012年4月上市,那么您的CPU已经包含了一个真正的随机数生成器。(新的Haswell架构也具有此功能)。

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

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

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

nextInt()方法实现为调用RDRAND的JNI本机调用。考虑到随机性的质量,性能非常好。使用8个线程,我生成了约760 MB /秒的随机数据。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.