C中用于密码学的快速伪随机数生成器
Fast pseudorandom number generator for cryptography in C
我使用以下代码生成用于加密目的的伪随机数序列,但后来我在某个地方读到它可能不太安全。有人能给我一个更好的生成器的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'
}
ISAAC(http://www.burtleburtle.net/bob/rand/isaacafa.html)可能是最快的加密安全PRNG(现场代码)之一。另一种方法是在计数器模式下使用分组密码。像TwoFish这样的东西,速度相当快,可以免费获得,会很有效。
如果你不需要很多数字,所有现代操作系统都有适合加密使用的内置RNG,尽管它们通常不能产生很多数字,因为它们依赖于从输入时序等来源积累熵。类Unix系统(Linux、OSX)有/dev/random,Windows有CryptGenRandom。即使这些不适合你的需求,你也可能应该用它们来播种你最终使用的PRNG。
查看(或使用)OpenSSL库中的随机数生成器。
任何安全随机数生成器的难点都是种子。如果您使用的是Windows,请考虑使用rand_s()。在Linux上,查看/dev/urand。
一些种子设定方法在重新启动后不久就变得不太随机。你可以制作一个带有随机字节的文件。使用文件和操作系统方法进行种子设定。定期使用随机数生成器来编写新文件。
不要"使用自己的"加密技术。请改用经过认证的库。
为了提高速度,可以尝试使用一个可以在GPU上运行的库,GPU的计算能力要高得多。
我推荐Mersenne Twister,我已经用了一次又一次了。
C代码在这里。
如果您使用C++11,那么Mersene-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);
}
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 制作具有平均值的随机数生成器
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 尝试在 c++ 中创建随机数生成器并收到错误
- 存储并重新加载随机数生成器状态
- 作为随机数生成器的争用条件
- 播种随机数生成器以使用分叉的好方法是什么?
- 随机数生成器的性能因平台而异
- 随机数生成器的种子和状态有什么区别?
- RcppShark 随机森林示例引发有关随机数生成器的异常
- C++多个实例的随机数生成器组种子中增强
- C++随机数生成器仅生成 0 - C++ 11
- GSL+OMP:C++中的线程安全随机数生成器
- 贪吃蛇游戏 - 食物瓷砖的随机数生成器
- 随机数生成器在 C++ 用于 skipList.
- RSA 加密和解密期间的随机数生成器要求
- 用于高斯过程的准随机数生成器
- C中用于密码学的快速伪随机数生成器
- 将boost用于长二重的(伪)随机数生成器
- 伪随机数生成器,用于c++应用程序