有C++ 11 CSPRNG吗?

use*_*986 9 c++ random mersenne-twister c++11

众所周知,Mersenne Twister 不具有密码学安全性:

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

但很多消息来源,如Stephan T. Lavavej甚至这个网站.建议几乎总是(逐字)使用Mersenne Twister,如下所示:

auto engine = mt19937{random_device{}()};
Run Code Online (Sandbox Code Playgroud)

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

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

std::random_device如果非确定性源(例如,硬件设备)对于实现不可用,则可以根据实现定义的伪随机数引擎来实现.在这种情况下,每个std::random_device对象可以生成相同的数字序列.

/dev/urandomVS /dev/random辩论十分激烈.

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

use*_*083 5

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.