Is there a C++11 CSPRNG?

Is there a C++11 CSPRNG?

本文关键字:CSPRNG C++11 there Is      更新时间:2023-10-16

众所周知,Mersenne Twister并不是加密安全的:

Mersenne Twister不是加密安全的。(MT是基于线性递归。生成的任意伪随机数序列线性递归是不安全的,因为没有足够长的子序列在输出中,可以预测其余的输出)

但是很多来源,比如Stephan T. Lavavej,甚至这个网站。建议几乎总是(逐字逐句)像这样使用梅森绕口令:

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

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

即使std::random_device并不总是可靠的:

std::random_device可以用an来实现实现定义的伪随机数引擎不确定源(如硬件设备)不可用实现。在这种情况下,每个std::random_device对象都可以生成相同的数字序列

/dev/urandom/dev/random的争论还在继续。

但是,虽然标准库提供了一个很好的prng集合,但它似乎没有提供任何csprng。我更喜欢坚持使用标准库,而不是使用POSIX、仅限linux的头文件等。梅森扭扭器能被操纵以使其加密安全吗?

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在密码学上下文中。