众所周知,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
和/dev/random
的争论仍在持续。
但是,虽然标准库提供了很好的伪随机数生成器集合,但似乎没有提供任何CSPRNG。我更喜欢坚持使用标准库而不是使用POSIX、仅限于Linux的头文件等。是否可以操纵Mersenne Twister使其具有加密安全性?
mt
调用和哈希序列,我都可以离线预先计算出每个可能种子的序列。然后,我可以观察您的RNG输出,将其与我的表进行比较,并找出您正在使用的种子。之后,我可以预测您的RNG未来的输出。换句话说,对可预测序列应用确定性函数会产生可预测序列。 - Igor Tandetnik