代码之家  ›  专栏  ›  技术社区  ›  rkellerm

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

  •  4
  • rkellerm  · 技术社区  · 15 年前

    什么是(最好)的方法来创建一个安全的随机数在Linux(C/C++代码),比一般的RAND()结果更随机,而不是伪作为OpenSSL BNYRAND?

    在我发现的窗户里 CryptGenRandom() 是个不错的选择。Linux中有没有类似的版本?

    提前谢谢你。

    7 回复  |  直到 15 年前
        1
  •  16
  •   Martijn    15 年前

    你可以从 /dev/random 它由一个熵池填充。维基百科网站上有一些很好的信息: http://en.wikipedia.org/wiki//dev/random

        2
  •  5
  •   Marc Demierre    15 年前

    要得到一个“真”随机数,你需要外界的干预。有一些解决方案在不同的程序中实现(我记得一些使用鼠标移动或大气噪声的程序)。

    我还发现了一个web服务: http://www.random.org/clients/http/

        3
  •  2
  •   Artyom    15 年前

    第一 CryptGenRandom

    在Linux(和大多数unix)下也一样 /dev/urandom .

    /dev/random 但如果熵池太小,等待系统收集它们时可能会被阻塞。

        4
  •  1
  •   pr1268    15 年前

    我今天早些时候写的。在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;
    }
    

        5
  •  1
  •   usta    13 年前

    看一看 boost::random_device

    编辑: 它位于命名空间中 boost::random 从Boost 1.47开始: boost::random::random_device

        6
  •  0
  •   Stefan George    15 年前

    /dev/urandom根据您执行的操作(移动鼠标、键入等)生成一些随机数

        7
  •  0
  •   Rubi Sharmax    14 年前

    可以使用量子随机数生成器,例如Quantis: http://www.idquantique.com/true-random-number-generator/products-overview.html

    它利用单光子通过或被半透明镜反射的量子力学概率,产生高达4Mbit/s的真随机比特。

    推荐文章