我需要在c++11中生成加密安全的随机数据,我担心对于所有数据使用random_device会严重限制性能(参见Stephan T. Lavavej的 "rand() Considered Harmful" 第23页,他说在他的系统上测试时,random_device是1.93 MB/s,而mt19937是499 MB/s),因为此代码将在移动设备(Android通过JNI和iOS)上运行,这些设备可能比上述数字慢。
此外,我知道mt19937不是加密安全的,来自wikipedia:“观察足够数量的迭代(在MT19937的情况下为624,因为这是从中产生未来迭代的状态向量的大小)允许预测所有未来的迭代”。
考虑到上述所有信息,我是否可以通过每624次mt19937迭代从random_device生成新的随机种子来生成密码学安全的随机数据?或者更好的是,每X次迭代生成新的随机种子,其中X是从1到624之间的随机数(来自random_device或由random_device或mt19937生成的种子)?
此外,我知道mt19937不是加密安全的,来自wikipedia:“观察足够数量的迭代(在MT19937的情况下为624,因为这是从中产生未来迭代的状态向量的大小)允许预测所有未来的迭代”。
考虑到上述所有信息,我是否可以通过每624次mt19937迭代从random_device生成新的随机种子来生成密码学安全的随机数据?或者更好的是,每X次迭代生成新的随机种子,其中X是从1到624之间的随机数(来自random_device或由random_device或mt19937生成的种子)?
random_device
的来源适用于用作CSPRNG,那么这显然是一个合适的选择。但我仍然对您的mt19937
想法持谨慎态度。在加密方面,一个简单的规则应该是,除非您是该领域的专家,否则总是优先选择现有的经过验证的解决方案,而不是做一些看似聪明的事情。您搞砸的可能性比想出真正新颖的想法要大得多。您测试过自己的想法的吞吐量吗?mt19937
具有19937位状态,因此频繁重新生成种子可能并不比random_device
表现更好。 - Praetorian