如何找到 std::random_device 的"true"熵?
how to find the "true" entropy of std::random_device?
我想检查我的实现是否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中的"熵"基本上是使数字来源尽可能模糊的问题。
- 无论条件是否为true,if总是在c++中执行
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- Arduino-C++ bool 不会从 false 变为 true
- 如何使布尔变量仅在设置为 true 时才为真?
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 对于完成布尔值设置为 true 后未停止的循环
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- OLE DB 大容量复制操作始终将 true 加载到位列中
- cin.fail() not returning true
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 如何使用boost定义布尔类,可能的值应该是TRUE或FALSE?
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 我在OpenCV中有错误的"approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true)"
- 如果语句表达式调用函数,则需要测试是否为 true
- 如何检查条件是否为 true 5 秒?
- 加载安全区图像"A device attached to the system is not functioning"
- ROS CPP 相当于 Python subprocess.call() 和 shell=True
- C++ if 语句将条件设置为 true 和循环中的 OR-ing 条件之间的行为差异