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

时间:2013-08-19 21:52:27

标签: 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'
}

4 个答案:

答案 0 :(得分:17)

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

如果你不需要很多数字,所有现代操作系统都有内置的RNG,适合加密使用,虽然它们通常不能产生大量数字,因为它们依赖于从输入时序等来源积累熵。类Unix系统(Linux,OSX)有/ dev / random,Windows有CryptGenRandom。即使这些不适合您的需求,您也可以使用它们为您最终使用的PRNG播种。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

不要“自己动手”加密。请改用经过认证的图书馆。

为了提高速度,请尝试使用可在GPU上运行的库,它具有更强的计算能力。

答案 3 :(得分:-4)

我会推荐Mersenne-Twister,我一次又一次地使用它。

C代码为here

如果您使用C ++ 11,那么您可以使用mersenne twister作为库本身的一部分。 Mersenne Twister目前是最好的算法之一。

以下是我将如何在C ++ 11中实现的功能。这很简单。 mt19937是用C ++ 11中的Mersenne Twister构建的。

 std::vector<double> classname::mersennetwister(const int& My,const int& Mz,const int& Ny,const int& Nz)
{
int ysize = (My + 2*Ny + 1);
int zsize = (Mz + 2*Nz + 1);
int matsize = ysize*zsize;
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937_64 generator (seed);
std::uniform_real_distribution<double> distribution(0,1);
std::vector<double> randarray = f.array1dgen(matsize,0);
for (int i=0;i<matsize;++i)
{
   randarray[i] = distribution(generator);
}
return(randarray);
}