我使用以下代码生成用于加密目的的伪随机数序列,但是随后我在某处读到它可能不是很安全。有人可以给我C实现更好的生成器的方法吗-主要目标是使这种方法更快。例如,我做了一些研究,遇到了Blum Blum Shub方法,该方法通过执行pow(N)计算会完全破坏性能。
PS。并且请不要引用没有C/C++代码的Wikipedia文章。我正在寻找下面显示的C或C++代码示例。
#define ROL(v, shift) ((((v) >> ((sizeof(v) * 8) - (shift))) | ((v) << (shift))))
ULONGLONG uiPSN = doSeed(); //64-bit unsigned integer
for(int i = 0; i < sizeOfArray; i++)
{
uiPSN = uiPSN * 214013L + 2531011L;
uiPSN = ROL(uiPSN, 16);
//Apply 'uiPSN'
}
最佳答案
ISAAC(http://www.burtleburtle.net/bob/rand/isaacafa.html)可能是最快的加密安全PRNG(站点代码)之一。另一种方法是在计数器模式下使用分组密码。诸如TwoFish之类的东西,它相当快且可以免费获得,将是有效的。
如果您不需要大量数字,则所有现代操作系统都具有适合加密用途的内置RNG,尽管它们通常无法产生大量数字,因为它们依赖于从输入时间等来源累积熵。类似Unix的系统(Linux,OSX)具有/dev/random,Windows具有CryptGenRandom。即使这些不适合您的需求,您也可能应该使用它们来播种最终使用的PRNG。