【问题标题】:Is there a C++11 CSPRNG?有 C++11 CSPRNG 吗?
【发布时间】:2015-11-26 13:14:09
【问题描述】:

我们知道,梅森捻线机is not crytographically secure

Mersenne Twister 不是加密安全的。 (MT基于一个 线性递归。由 a 生成的任何伪随机数序列 线性递归是不安全的,因为从足够长的子序列 的输出,人们可以预测其余的输出。)

但有很多来源,例如 Stephan T. Lavavej 甚至 this website。建议几乎总是(逐字)像这样使用 Mersenne Twister:

auto engine = mt19937{random_device{}()};

它们有不同的风格,例如使用std::seed_seq 或复杂的操作std::tm 的方法,但这是最简单的方法。

尽管std::random_device is not always reliable:

std::random_device 可以通过以下方式实现 实现定义的伪随机数引擎,如果 非确定性源(例如硬件设备)不可用于 实施。在这种情况下,每个 std::random_device 对象可能 生成相同的数列。

/dev/urandom/dev/random 辩论 rages on

虽然标准库提供了很好的 PRNG 集合,但它似乎没有提供任何 CSPRNG。我更喜欢坚持使用标准库,而不是使用 POSIX、仅限 Linux 的标头等。可以操纵 Mersenne Twister 以使其具有加密安全性吗?

【问题讨论】:

  • 是否可以操纵 Mersenne Twister 以使其具有加密安全性? 不能。
  • @dandan78 好的。我什至加入了无协议的 URL 以作为很好的衡量标准
  • 链接已损坏,因为它们中的大多数不适用于 https。现已修复
  • @DavidHammen 我使用的链接说:“为了使其安全,您需要使用一些带有 MT 的安全哈希算法。例如,您可以收集每八个字的输出,并将它们压缩成一个word(因此输出序列的长度是原始序列的 1/8)。”你能详细说明或反驳吗?
  • @owacoder “实现你自己的”几乎与“加密安全”相反

标签: c++ c++11 random mersenne-twister


【解决方案1】:

Visual Studio 保证 random_device 在密码学上是安全且不确定的: https://msdn.microsoft.com/en-us/library/bb982250.aspx

如果你想要更快或跨平台的东西,你可以使用 GnuTLS:http://gnutls.org/manual/html_node/Random-number-generation.html 它提供可调节质量的随机数。 GNUTLS_RND_RANDOM 是我想的你想要的。

正如一些人已经说过的,请忘记加密上下文中的 MT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2011-12-03
    • 2011-12-10
    相关资源
    最近更新 更多