我必须建立一个One Time Pad系统,为此,我必须建立自己的TRNG。我想知道如何制作记录大气噪声并使用它来生成随机数。到目前为止,我已经尝试过记录.wav文件并用Java读取它,但这些值似乎并非随机。有什么建议?我知道Random.org,但是我不能真正使用他们的发生器,我必须建立自己的发生器,所以我想要的是对Random.org上的人如何构建他们的数字生成器的一些见解,大气噪声作为一个“随机性”的来源。
答案 0 :(得分:5)
您可以做的是在进入之前录制房间周围的音频并保存临时WAV文件。如果你知道WAV文件是如何工作的,它基于RIFF规范。然后剥去长度为44个字节的WAV标头。然后读取音频字节并根据您是否要生成WORDS,DWORDS或BYTES进行正确的转换,这取决于您。然后你应该有一些随机值来使用。然后相应地使用这些随机值。
因为我不知道你是想用Java还是其他语言来编程。另外,我不知道预定的平台;所以我不推荐你任何实时音频处理库。
对于C#,您可以使用NAudio,您可以实时录制音频并接收音频字节。然后你可以将音频字节转换为DWORD,QWORD,WORD等。你应该能够有一些随机值。记住停止记录并在生成随机数时停止释放非托管资源。
答案 1 :(得分:3)
答案是未知的,可能是故意的。虽然很难确定,该网站似乎是慈善和营利工作的结合。每个无线电源仅产生几Kbps的随机数据。他如何在许多链接中描述它,我没有看到CSRNG的证据。没关系。对于OTP目的,如果它不是真正随机的,那么它是一个美化的流密码。 (我认为这就是布鲁斯和其他人一直说的。)
我发现很难回想起一个好的CSRNG何时被打破。我建议你使用类似ISAAC或正确实现的块/流密码。完美的纸质密码就是这样做的。使用Fortuna结构和Fortuna的内部结构,使用上述密码/算法生成大部分随机数据。 Fortuna系统可以定期向TRNG注入数据。预算上最好的TRNG是random.org和本地生成的东西。最便宜的硬件解决方案是带有VIA Padlock的VIA Artigo主板(适用于SHA-1,SHA256,AES和RSA的TRNG +加速),售价300美元。他们也有图书馆来帮助你使用东西。 (甚至还有一个伪TRNG在网络负载下使用处理器时序。)
请记住,加密通常是链中最强大的链接。系统安全性存在于许多层面:处理器,固件,外围固件(esp DMA),内核模式代码,操作系统,可信中间件或OS功能,应用程序。整体安全包括用户,政策,物理安全,EMSEC等。任何担心RNG过多的人通常会浪费精力。只需使用我接受的解决方案或上面提到的内容。然后,专注于其余部分。特别是人与系统的互动方式。配置,修补,操作系统选择,策略。大多数问题都发生在那
答案 2 :(得分:2)
我记得random.org上的一篇文章,我现在似乎无法找到。我都记得他们使用了他们测量的噪音。 MSB肯定不是随机的。然后根据lsb生成一个1和0的字符串。不要像简单的二进制转换那样做一些愚蠢的事情,这是行不通的。您可能必须以二进制方式对噪声进行采样,以使lsb的分布具有更均匀的采样。
他们用来确保均匀分布的技巧是不使用这个1和0的字符串作为随机数。相反,他们会一次解析字符串,2位。每次匹配(即00或11)时,他们在随机字符串中添加1。每次比特翻转(即01或10)时,他们都会在随机字符串中添加0。
如果您自己制作TRNG,请务必进行验证!
答案 3 :(得分:0)
几乎不可能从软件中获得真正的随机数。甚至wav文件中的静态信息也可能受到计算机产生的周期性EMI的影响,因此不是纯粹随机的。
您可以使用特殊硬件还是被迫坚持使用纯软件?为什么伪随机数不能满足您的需求?他们会在相对较少的随机样本上做得很好。因为你想在OTP中使用随机数,我猜你不会大规模使用它。
你能提供更多细节吗?
答案 4 :(得分:0)
生成随机数的大气噪声方法很复杂,因为大气中充满了非随机信号,所有信号都会污染您寻找的熵。有一种更简单的方法。
如果您拥有基于英特尔Ivy Bridge的Core / Xeon处理器(2012年4月开始提供),那么您的CPU已经包含真正的随机数生成器很有可能。(新的Haswell架构也具有此功能)。< / p>
英特尔的随机发生器利用不稳定数字电路内部热噪声的随机效应。热噪声只是随机原子振动,这与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 /秒的随机数据。
答案 5 :(得分:0)
真正的随机数发生器(TRNG)通常来自自然资源,例如地震信号,非平稳生物信号等。这些发生器面临的两个问题是: 1)数据点分布不均匀 2)生成大型数字序列需要花费很长时间(特别是当需求以百万为单位时)。 但是,它们最重要的优势是其不可预测的性质。为了克服它们的问题并保留其优势,最好融合TRNG的输出以播种伪随机数生成器。为此,您可以尝试在随机时间点使用大气噪声的幅度值,并将其用作PRNG的种子。 这将帮助您获得大量均匀分布的值。由于种子是不可预测的,因此PRNG的输出也将不可预测。