用于C语言加密的快速伪随机数发生器

c00*_*0fd 10 c c++ random cryptography

我使用以下代码生成用于加密目的的伪随机数序列,但后来我在某处读到它可能不是很安全.有人可以给我一个更好的生成器的C实现 - 主要目标是这个方法快速.例如,我做了一些研究并遇到了Blum Blum Shub方法,它会通过执行pow(N)计算完全扼杀性能.

PS.请不要引用没有C/C++代码的维基百科文章.我正在寻找我在下面展示的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'
}
Run Code Online (Sandbox Code Playgroud)

Lee*_*ker 17

ISAAC(http://www.burtleburtle.net/bob/rand/isaacafa.html)可能是加密速度最快的PRNG之一(站点代码).另一种方法是在计数器模式下使用分组密码.像TwoFish这样合理快速且免费提供的东西会很有效.

如果你不需要一个批号的,所有现代操作系统都内置了适于密码使用随机数发生器,但他们通常是因为它们依赖于来自像输入定时源积累熵不能产生大量的数字.类Unix系统(Linux,OSX)有/ dev/random,Windows有CryptGenRandom.即使这些不适合您的需求,您也许应该使用它们为您最终使用的PRNG播种.


bri*_*ing 5

查看(或使用)OpenSSL库中的随机数生成器.

任何安全随机数发生器的困难部分是播种.如果您使用的是Windows,请考虑使用rand_s().在Linux上查看/ dev/urand.

一些播种方法在重启后很快就会变得非常随意.您可以使用随机字节创建文件.使用文件和OS方法进行种子设定.定期使用随机数生成器编写新文件.