Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何找到;“真的”;std::random_设备的熵?_C++_C++11_Random - Fatal编程技术网

C++ 如何找到;“真的”;std::random_设备的熵?

C++ 如何找到;“真的”;std::random_设备的熵?,c++,c++11,random,C++,C++11,Random,我想检查我的std::random_设备的实现是否 使用std::random\u device::entropy()函数,具有非零熵(即非确定性)。然而,根据 到 “此功能在某些标准库中没有完全实现。 例如,gcc和clang始终返回零,即使设备 比较而言,Visual C++总是返回32, 和boost.random返回10。“ 有没有办法找到真正的熵?尤其是现代人 计算机(MacBook Pro/iMac等)具有不确定性来源或随机性,例如使用散热监视器?标准提供给您的一切都是您已经看到的。

我想检查我的
std::random_设备的实现是否
使用
std::random\u device::entropy()
函数,具有非零熵(即非确定性)。然而,根据 到

“此功能在某些标准库中没有完全实现。 例如,gcc和clang始终返回零,即使设备 比较而言,Visual C++总是返回32, 和boost.random返回10。“

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

标准提供给您的一切都是您已经看到的。为了回答这个问题,您需要了解给定标准库如何实现
random\u device
。例如,在Visual Studio 2013 Update 4中,
random_device
转发到哪个设备,根据您的Windows版本和可用硬件,它实际上可能(始终?)是一个加密安全的伪随机数生成器


如果您不相信平台提供了良好的熵源,那么您应该使用自己的加密安全PRNG,例如基于AES的PRNG。这就是说,平台供应商有强烈的动机让他们的随机数字实际上是随机的,而将PRNG嵌入到你的应用程序中意味着,如果发现PRNG不安全,就无法轻松更新PRNG。只有你自己才能做出权衡:)

熵只是RNG质量的一个衡量标准(确实,精确的熵是不可能衡量的)。为了实际而合理地测量你的<代码> STD::RealthyDebug 随机数质量,考虑使用标准随机性测试套件,如它的继任者。它们运行一系列统计测试,旨在强调您的RNG,确保它产生统计随机数据

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


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


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

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


例如,圆周率的数字看起来是随机的,但是一旦你知道它们来自圆周率,数字的实际熵就是零。在RNG中增加“熵”基本上是一个使数字的来源尽可能模糊的问题。

我向您推荐本文的讲座

§26.5.6

随机随机数发生器产生不确定的随机数

如果实现限制阻止生成非确定性随机数,则实现可采用随机数引擎

因此,基本上,它将尝试在linux/dev/{u}random和windows RltGenRandom中使用内部系统“true”随机数生成器

另一点是,您不信任这些随机性源,因为它们依赖于内部噪声或是相近的实现

此外,你如何测量熵的质量,正如你所知,这是寻找好的rng发生器的最大问题之一

一个估计可能非常好,另一个估计可能报告不太好的熵

在各种科学/工程应用中,如独立 成分分析,图像分析,基因分析,语音 识别、流形学习和时延估计——这很有用 估计系统或过程的微分熵,给定 一些观察

正如它所说的,你必须依靠最终的观察,而这些可能是错误的

我认为内部rng不够好,你可以尝试购买硬件设备。这有一个供应商列表,你可以在网上查看他们的评论

演出

你必须考虑的是使用实际随机数生成器在应用程序中的性能。一种常见的技术是将使用/dev/random获得的数字用作mersenne捻线机的种子

如果用户无法实际访问您的系统,您需要平衡可靠性和可用性,一个有安全漏洞的系统和一个不工作的系统一样糟糕,最后您必须对重要数据进行加密


编辑1:根据我的建议,我把这篇文章移到了我评论的顶部,这是一篇好文章。感谢您的提示:-)。

-Ivy Bridge x86处理器提供了一个随机数,它至少可以保存用于加密目的。有一个很好的老把戏,生成大量随机数,将它们写入文件并用gz压缩