有没有 C++11 的 CSPRNG?

12

众所周知,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使其具有加密安全性?


12
梅森旋转算法能否被修改以使其具有加密安全性?不行。 - David Hammen
1
@dandan78 好的。我甚至加入了协议无关的URL以确保完整性。 - user5287986
1
@DavidHammen 我所使用的链接中提到:“为了使其更安全,你需要使用一些带有 MT 的安全哈希算法。例如,你可以收集输出的每八个单词,并将它们压缩成一个单词(因此输出序列的长度是原始序列的 1/8)。” 你能详细说明或提出反驳吗? - user5287986
1
无论您选择使用哪个mt调用和哈希序列,我都可以离线预先计算出每个可能种子的序列。然后,我可以观察您的RNG输出,将其与我的表进行比较,并找出您正在使用的种子。之后,我可以预测您的RNG未来的输出。换句话说,对可预测序列应用确定性函数会产生可预测序列。 - Igor Tandetnik
2
@owacoder,“自己实现”几乎与“具有加密安全性”背道而驰。 - Panagiotis Kanavos
显示剩余8条评论
1个回答

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接