我想std::random_device
用std::random_device::entropy()
函数检查我的实现是否具有非零熵(即非确定性).但是,根据cppreference.com
"这个函数在某些标准库中没有完全实现.例如,即使设备是非确定性的,gcc和clang也总是返回零.相比之下,Visual C++总是返回32,而boost.random返回10."
有没有办法找到真正的熵?特别是,现代计算机(MacBook Pro/iMac等)是否具有非确定性源或随机性,例如使用散热监视器?
Rai*_*maj 10
我推荐你这篇文章的讲座.
§26.5.6
random_device均匀随机数发生器产生非确定性随机数.
如果实现限制阻止生成非确定性随机数,则实现可以使用随机数引擎.
所以基本上它会尝试使用内部系统"真正的"随机数生成器,在linux/dev/{u}随机窗口RltGenRandom中.
另一点是你不相信那些随机性的来源,因为它们依赖于内部噪声或者是紧密的实现.
另外,你如何确保熵的质量,因为你知道这是试图找到好的发电机的最大问题之一.
一种估计可能非常好,而其他估计可能报告不太好的熵.
在各种科学/工程应用中,例如独立分量分析,图像分析,遗传分析,语音识别,流形学习和时间延迟估计,在给定一些观察结果的情况下估计系统或过程的微分熵是有用的.
因此,你必须依靠最终的观察,而那些可能是错的.
我认为内部rng不够好,你总是可以尝试为此目的购买硬件设备.这对维基百科名单有供应商的列表,你可以检查有关它们的互联网审查.
您必须考虑的一点是使用真实随机数生成器在您的应用程序中的性能.一种常见技术是在mersenne twister中使用/ dev/random获得的数字作为种子.
如果用户无法在物理上访问您的系统,则需要在可靠性和可用性之间取得平衡,具有安全漏洞的系统与无法工作的系统一样糟糕,最后您必须加密重要数据.
编辑1:作为建议我已将文章移至评论的顶部,这是一个很好的阅读.谢谢你的提示:-).
所有标准都是你已经看到的.您需要了解给定标准库如何实现random_device
以回答此问题.例如,在Visual Studio 2013 Update 4中,random_device
向前rand_s
转发RtlGenRandom
,可能实际上(始终是?)加密安全伪随机数生成器,具体取决于您的Windows版本和可用硬件.
如果您不相信平台提供良好的熵源,那么您应该使用自己的加密安全PRNG,例如基于AES的PRNG.也就是说,平台供应商强烈要求他们的随机数实际上是随机的,并且将PRNG嵌入到您的应用中意味着PRNG在发现不安全的情况下无法轻易更新.只有你自己决定权衡:)