众所周知,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/urandom
vs的/dev/random
争论愈演愈烈。
但是,虽然标准库提供了很好的 PRNG 集合,但它似乎没有提供任何 CSPRNG。我更喜欢坚持使用标准库而不是使用 POSIX、仅限 Linux 的标头等。可以操纵 Mersenne Twister 以使其具有加密安全性吗?