如何找到 std::random_device 的"true"熵?

how to find the "true" entropy of std::random_device?

本文关键字:true device 何找 std random      更新时间:2023-10-16

我想检查我的实现是否std::random_device具有非零熵(即不确定(,使用std::random_device::entropy()函数。然而,根据到 cppreference.com

"这个功能在某些标准库中没有完全实现。 例如,gcc 和 clang 始终返回零,即使设备 是不确定的。相比之下,视觉C++始终返回 32, 和 boost.random 返回 10。

有没有办法找到真正的熵?特别是,做现代电脑(MacBook Pro/iMac等(具有非确定性来源或随机性,例如使用散热监视器?

我向你推荐这篇文章的讲座。

关于/dev/urandom 的神话

§ 26.5.6

random_device统一随机数生成器产生不确定的随机数。

如果实现限制阻止生成非确定性随机数,则实现可以采用随机数引擎。

所以基本上它会尝试使用内部系统的"真"随机数生成器,在linux/dev/{u}random o windows RltGenRandom中。

不同的一点是,您不信任这些随机性来源,因为它们依赖于内部噪声或紧密实现。

此外,您如何测量熵的质量,因为您知道这是试图找到好的RNG发生器的最大问题之一。

一个估计可能

非常好,而另一个估计可能报告不太好的熵。

熵估计

在各种科学/工程应用中,例如独立成分分析、图像分析、基因分析、语音识别、流形学习和延时估计很有用估计系统或过程的微分熵,给定一些观察。

因此,您必须依靠最终的观察结果,而这些观察结果可能是错误的。

我你认为内部rng不够好,你可以随时尝试为此目的购买硬件设备。维基百科上的这个列表有一个供应商列表,你可以在互联网上查看关于他们的评论。

性能

您必须考虑的一点是使用实随机数生成器的应用程序内的性能。一种常见的技术是在 mersenne twister 中使用使用/dev/random 获得的数字作为种子。

如果用户无法物理访问您的系统,您将需要在可靠性和可用性之间取得平衡,具有安全漏洞的系统与无法工作的系统一样糟糕,最后您必须对重要数据进行加密。

编辑1:作为建议,我已经将文章移到了评论的顶部,是一个很好的阅读。感谢您的提示:-(。

所有标准给你的都是你已经看到的。您需要了解给定标准库如何实现random_device才能回答这个问题。例如,在Visual Studio 2013 Update 4中,random_device转发到rand_s转发到RtlGenRandom,这实际上可能是(总是?(加密安全的伪随机数生成器,具体取决于您的Windows版本和可用的硬件。

如果您不信任该平台提供良好的熵源,那么您应该使用自己的加密安全 PRNG,例如基于 AES 的 PRNG。也就是说,平台供应商有强烈的动机让他们的随机数实际上是随机的,将 PRNG 嵌入到您的应用程序中意味着如果发现 PRNG 不安全,则无法轻松更新。只有您可以自己决定这种权衡:)

熵只是RNG质量的一个度量(真正的,精确的熵是不可能测量的(。为了对std::random_device的随机数质量进行实用且合理准确的测量,请考虑使用标准的随机性测试套件,例如TestU01,diehard或其后继者dieharder。它们运行一系列统计测试,旨在对您的 RNG 施加压力,确保它产生统计随机数据。

请注意,统计随机性本身并不能证明 RNG 适用于加密应用程序。


许多现代计算机具有易于访问的硬件随机性来源,即音频输入、相机和各种传感器中的模数转换器。它们表现出低水平的热噪声或电噪声,可用于产生高质量的随机数据。但是,据我所知,实际上没有操作系统使用这些传感器来提供其系统随机数源(例如/dev/[u]random(,因为此类物理随机数源的比特率往往非常低。

相反,OS 提供的随机数源往往由硬件计数器和事件(如页面错误、设备驱动程序事件和其他不可预测性源(设定种子。从理论上讲,考虑到精确的硬件状态,这些事件可能是完全可预测的(因为它们不是基于例如量子或热噪声(,但在实践中,它们足够不可预测,以至于它们会产生良好的随机数据。

熵作为一个科学术语在描述随机数时被误用。复杂性可能是一个更好的术语。 物理学中的熵被定义为可用量子态数量的对数(在RNG中没有用(,信息论中的熵由香农熵定义,但这面向另一个极端 - 如何将尽可能多的信息放入嘈杂的比特流中,而不是如何最小化信息。

例如,Pi

的数字看起来是随机的,但是一旦你知道它们来自 Pi,数字的实际熵就为零。增加RNG中的"熵"基本上是使数字来源尽可能模糊的问题。