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

时间:2015-02-08 05:16:19

标签: c++ c++11 random

我想检查一下std::random_device的执行情况 使用std::random_device::entropy()函数具有非零熵(即,是非确定性的)。但是,根据 到cppreference.com

  

“在某些标准库中未完全实现此功能。   例如,即使设备,gcc和clang也总是返回零   是非确定性的。相比之下,Visual C ++总是返回32,   和boost.random返回10.“

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

4 个答案:

答案 0 :(得分:10)

我建议您阅读本文的讲座。

Myths about /dev/urandom

§26.5.6

  

random_device均匀随机数生成器生成非确定性随机数。

     

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

所以基本上它会尝试在linux / dev / {u}随机窗口RltGenRandom中使用内部系统“true”随机数生成器。

另一点是你不相信那些随机性来源,因为它们依赖于内部噪声或者是近距离实现。

此外,你如何确保熵的质量,因为你知道这是试图找到好的发电机的最大问题之一。

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

Entropy Estimation

  

在各种科学/工程应用中,例如独立的   成分分析,图像分析,遗传分析,语音   识别,流形学习和时间延迟估计是有用的   给出了估计系统或过程的微分熵   一些观察结果。

因为它必须依赖于最终观察,而这些可能是错误的。

我认为内部rng不够好,你总是可以尝试为此目的购买硬件设备。这个list on wikipedia有一个供应商列表,您可以查看有关它们的互联网评论。

效果

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

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

编辑1:作为建议,我已将文章移到评论的顶​​部,这是一个很好的阅读。谢谢你的提示: - )。

答案 1 :(得分:6)

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

如果您不相信平台提供良好的熵源,那么您应该使用自己的加密安全PRNG,例如基于AES的PRNG。也就是说,平台供应商强烈要求他们的随机数实际上是随机的,并且将PRNG嵌入到您的应用中意味着PRNG在发现不安全的情况下不能轻易更新。只有你自己决定权衡:)

答案 2 :(得分:3)

熵只是RNG质量的一种衡量标准(真实的,无法测量精确的熵)。要对std::random_device随机数质量进行实际且合理准确的衡量,请考虑使用标准随机性测试套件,例如TestU01,{{3} }或其继任者diehard。它们运行一系列统计测试,旨在强调您的RNG,确保它产生统计随机数据。

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


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

相反,操作系统提供的随机数源往往由硬件计数器和事件播种,例如页面错误,设备驱动程序事件和其他不可预测性的来源。理论上,鉴于精确的硬件状态(因为它们不是基于例如量子或热噪声),这些事件可能是完全可预测的,但实际上它们是不可预测的,它们产生良好的随机数据。

答案 3 :(得分:1)

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

例如,Pi的数字看起来是随机的,但一旦你知道它们是从Pi派生的,那么数字的实际熵就是零。增加&#34;熵&#34;在RNG中,基本上是一个使数字来源尽可能模糊不清的问题。