11

众所周知,Mersenne Twister在密码学上并不安全

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

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

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

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

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

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

/dev/urandomvs的/dev/random争论愈演愈烈

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

4

1 回答 1

6

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。

于 2015-10-08T09:05:42.860 回答