在Linux(C / C ++代码)中创建安全随机数的最佳方式是什么,比一般rand()结果更随机,而不是伪造成OpenSSL BN_rand?
在Windows中,我发现CryptGenRandom()
是一个不错的选择。 Linux中有没有相应的东西?
提前谢谢。
答案 0 :(得分:16)
您可以从填充了熵池的/dev/random
中读取。维基百科网站上有一些很好的信息:http://en.wikipedia.org/wiki//dev/random
答案 1 :(得分:5)
要获得“真实”的随机数,您需要从外部进行干预。在各种程序中实现了一些解决方案(我记得有几个使用鼠标移动或大气噪声的解决方案)。
正如Martijin所指出的那样,Linux和OSX上也有/ dev / random。它使用设备驱动程序收集的噪音。
我刚刚找到了一个网络服务:http://www.random.org/clients/http/
答案 2 :(得分:2)
第一个CryptGenRandom
不是“真正的”随机设备,因为它们足够随机,可以加密安全。
在Linux(和大多数unix)下类似的是从/dev/urandom
读取。
如果你想获得真正的随机数,你可以阅读/dev/random
,但是如果熵池太小,你可能会被阻塞等待系统收集它们。
答案 3 :(得分:1)
修改:从Boost 1.47开始,它位于名称空间boost::random
中:boost::random::random_device
答案 4 :(得分:1)
#include "rands.h"
#include <sys/types.h> /* for open(2) */
#include <sys/stat.h> /* for open(2) */
#include <fcntl.h> /* for open(2) */
#include <unistd.h> /* for read(2), close(2) */
#define DEVURANDOM "/dev/urandom"
typedef uint8_t TYPE;
TYPE getRandU8()
{
TYPE rnum = 0;
int fd = open(DEVURANDOM, O_RDONLY);
if (fd != -1)
{
(void) read(fd, (void *)&rnum, sizeof(TYPE));
(void) close(fd);
}
return rnum;
}
您可以根据需要将TYPE更改为int8_t,uint16_t,int16_t,uint32_t,int32_t,uint64_t和int64_t(并相应地更改函数的名称)。您还可以使用(有符号/无符号)char,short,int,long,long long等.rands.h文件(在同一目录中)只有用于链接的函数原型。
答案 5 :(得分:0)
/ dev / urandom根据您执行的操作(移动鼠标,键入等等)生成一些随机数字。
答案 6 :(得分:0)
您可以使用量子随机数生成器,例如Quantis:http://www.idquantique.com/true-random-number-generator/products-overview.html
它利用单个光子通过或从半透明镜像反射的量子力学概率,并生成高达4Mbit / s真随机位的随机位。