如何找到 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"基本上是一个让数字来源尽可能模糊的问题。
我推荐你这篇文章的讲座。
§ 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:作为建议,我已将文章移至评论顶部,值得一读。感谢提示 :-).
我想检查我是否执行了 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"基本上是一个让数字来源尽可能模糊的问题。
我推荐你这篇文章的讲座。
§ 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:作为建议,我已将文章移至评论顶部,值得一读。感谢提示 :-).