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

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

我想检查我是否执行了 std::random_device 具有非零熵(即非确定性),使用 std::random_device::entropy() 函数。然而,根据 至 cppreference.com

"This function is not fully implemented in some standard libraries. For example, gcc and clang always return zero even though the device is non-deterministic. In comparison, Visual C++ always returns 32, and boost.random returns 10."

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

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

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

熵只是 RNG 质量的一种衡量标准(真实、准确的熵是无法测量的)。要对 std::random_device 的随机数质量进行实用且合理准确的测量,请考虑使用标准 随机性测试套件 ,例如 TestU01, diehard, or its successor dieharder。这些 运行 一组旨在对 RNG 施加压力的统计测试,确保它产生统计上随机的数据。

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


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

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

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

例如,Pi 的数字看起来是随机的,但一旦知道它们源自 Pi,这些数字的实际熵为零。在RNG中增加"Entropy"基本上是一个让数字来源尽可能模糊的问题。

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

Myths about /dev/urandom

§ 26.5.6

A random_device uniform random number generator produces non-deterministic random numbers.

If implementation limitations prevent generating non-deterministic random numbers, the implementation may employ a random number engine.

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

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

此外,您如何衡量熵的质量,正如您所知,这是寻找好的 rng 生成器的最大问题之一。

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

Entropy Estimation

In various science/engineering applications, such as independent component analysis, image analysis, genetic analysis, speech recognition, manifold learning, and time delay estimation it is useful to estimate the differential entropy of a system or process, given some observations.

正如所说,您必须依赖最终观察,而这些可能是错误的。

我觉得内部rng不够好,你可以随时尝试为此目的购买硬件设备。这个list on wikipedia有一个供应商列表,你可以在网上查看关于他们的评论。

性能

您必须考虑的一点是使用真实随机数生成器的应用程序的性能。一种常见的技术是将使用 /dev/random.

获得的数字用作梅森扭曲器中的种子

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

编辑 1:作为建议,我已将文章移至评论顶部,值得一读。感谢提示 :-).