如何在Linux中生成真正的随机数(非伪)

时间:2010-10-31 08:35:28

标签: c++ linux security random

在Linux(C / C ++代码)中创建安全随机数的最佳方式是什么,比一般rand()结果更随机,而不是伪造成OpenSSL BN_rand?

在Windows中,我发现CryptGenRandom()是一个不错的选择。 Linux中有没有相应的东西?

提前谢谢。

7 个答案:

答案 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::random_device

修改:从Boost 1.47开始,它位于名称空间boost::random中:boost::random::random_device

答案 4 :(得分:1)

我今天早些时候写过这篇文章。使用Linux上的GNU编译器在C和C ++中编译。

#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真随机位的随机位。