10

我正在使用以下代码生成用于加密目的的伪随机数序列,但后来我在某处读到它可能不是很安全。有人能给我一个更好的生成器的 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'
}
4

4 回答 4

17

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

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

于 2013-08-20T00:07:24.543 回答
6

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

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

一些播种方法在重新启动后很快就会受到影响。您可以使用随机字节制作文件。使用文件和操作系统方法进行播种。定期使用随机数生成器编写新文件。

于 2013-08-20T01:20:32.590 回答
1

不要“滚动你自己的”密码学。请改用经过认证的库。

为了速度,请尝试使用可以在 GPU 上运行的库,它的计算能力要强得多。

于 2013-08-20T02:37:32.660 回答
-5

我会推荐我一次又一次使用的 Mersenne-Twister。

C 代码在这里

如果您使用 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);
}
于 2013-08-19T22:01:19.083 回答