【问题标题】:Draining the entropy of std::random_device耗尽 std::random_device 的熵
【发布时间】:2018-12-27 12:03:48
【问题描述】:

我正在使用std::random_device 并想检查它的剩余熵。根据 cppreference.com:

std::random_device::entropy

double entropy() const noexcept;

[...]

返回值

设备熵的值,如果不适用,则为零。

注意事项

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

Linux 内核设备 /dev/urandom 的熵可以使用 ioctl RNDGETENTCNT 获得 - 这是 GNU libstdc++ 中的 std::random_device::entropy() 从 8.1 版开始使用的内容

所以在 Linux ang g++ >= 8.1 下,我应该很好……但我不是:

#include <random>
#include <iostream>

void drain_entropy(std::random_device& rd, std::size_t count = 1)
{
    while (count --> 0) {
        volatile const int discard = rd();
        (void) discard;
    }
}

int main()
{
    std::random_device rd;
    std::cout << "Entropy: " << rd.entropy() << '\n'; // Entropy: 32
    drain_entropy(rd, 1'000'000);
    std::cout << "Entropy: " << rd.entropy() << '\n'; // Entropy: 32
}

Live demo on Coliru (which runs under Linux, right?)

我预计从设备生成数字会消耗其熵。但事实并非如此。

发生了什么事?

【问题讨论】:

  • 仅仅因为 Linux 内核支持在其随机数生成器中查询剩余熵并不意味着 1) C++ 库使用内核的随机数生成器,和/或 2) C++ 库有意义地实现返回剩余的熵。
  • @Sam cppreference 声称 1) 和 2) 是正确的。
  • @YSC 有什么问题?我在这里看不到任何东西。
  • @DanM。我期待从设备生成的数字会消耗它的熵。它没有。 (Q 固定)
  • @YSC 为什么您认为读取 100 万个整数会以任何有意义的方式减少它?它的生成速度可能比这更快。在我的本地机器上,我必须开始耗尽 10^10 的字节,以使其以有意义的方式减少。

标签: c++ random g++ entropy


【解决方案1】:

库返回的熵值不会大于其结果类型的位数,在本例中为 32。

libstd code:

const int max = sizeof(result_type) * __CHAR_BIT__;
if (ent > max)
  ent = max;

您链接到的文档对此进行了解释:

获取随机数设备熵的估计值,它是一个介于 0 和 log 2(max()+1) 之间的浮点值(等于 std::numeric_limits::digits)。

【讨论】:

  • 我虽然 32 (std::numeric_limits&lt;unsigned int&gt;::digits) 是最大熵,而不是返回值的最大值:D
【解决方案2】:

你可以看到.entropy()是如何实现here的。

基本上,entropy() 调用ioctl(fd, RNDGETENTCNT, &amp;ent) 并返回ent(根据需要将其限制为目标类型中的最大位数之后)。

碰巧在您拨打drain_entropy 之后它并没有改变。

您可以手动实现此方法并查看其行为是否相同。 即使您移除钳位,熵也几乎不会受到影响(甚至可能会增加)。

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2020-03-09
    相关资源
    最近更新 更多