我需要在c++11中生成加密安全的随机数据,我担心对所有数据使用random_device会严重限制性能(参见StephanT.Lavavej的"rand() Considered Harmful“幻灯片23,他说(在他的系统上)测试时,random_device为1.93 MB/s,mt19937为499 MB/s,因为这段代码将在移动设备(通过JNI和iOS运行)上运行,这可能比上面的数字要慢。
此外,我还注意到,MT19937在密码上并不安全,因为wikipedia:“观察足够数量的迭代(在mt19937情况下为624次,因为这是生成未来迭代的状态向量的大小),因此可以预测所有未来的迭代”。
考虑到上述所有信息,我可以通过每624次random_device迭代生成一个新的随机种子来生成加密安全的随机数据吗?或者(可能)更好的是,每一次X迭代,其中X是一个随机数(来自random_device或mt19937,由random_device播种)在1到624之间?
发布于 2015-05-27 09:32:30
简单的回答是,不,你不能。对加密安全的RNG的要求是非常严格的,如果您必须在这里问这个问题,那么您就没有足够的意识到这些要求。正如曾傑瑞所说,如果你需要重复性,那么AES-CTR是一种选择.另一个不允许重复的选项是为您的系统寻找Yarrow或Fortuna的实现。一般来说,在库中找到CSRNG要比滚动自己的要好得多。库编写人员充分了解对良好CSRNG的要求。
https://stackoverflow.com/questions/30473376
复制相似问题