C ++-从/ dev / urandom中提取随机数

min*_*mic 1 c++ random

我需要许多加密安全的数字,因此我正在考虑从中提取随机性/dev/urandom,然后将其“转换”为(例如)unsigned long long int。我想它应该非常有效,而且似乎在密码上是安全的,但是我将来会对此进行更多研究。
现在的问题是:我该怎么办?

我发现此代码:

char * block;
short size = 1;
ifstream urandom("/dev/urandom", ios::in|ios::binary);
urandom.read(block,size);
urandom.close();
Run Code Online (Sandbox Code Playgroud)

是否有意义?以及如何将我得到的转换为我想要的类型?

编辑-使用randomC ++ 11的接口

根据评论的建议,我尝试对整数使用均匀分布并将其random_device初始化为/dev/urandom。这是代码:

std::uniform_int_distribution<unsigned int> dist(0, modulus-1);
std::random_device urandom("/dev/urandom");
for(unsigned int i = start ; i < end ; ++i)
{
    vector[i] = dist(urandom);
}
Run Code Online (Sandbox Code Playgroud)

问题在于此代码比以前(我使用的是xorshift128 +生成器)慢了大约1000倍:5毫秒vs. 5秒钟。这正常吗?老实说,我认为从中传输字节/dev/urandom并将其转换为字节的unsigned int速度会更快...我是否缺少某些内容?

Sim*_*mer 6

因此,您的第一个示例是不正确的,并且会导致不确定的行为。

char*块未指向任何已分配的数据,因此ifstream::read实际上将写入未分配的内存。

除此之外,它的类型应该sizesigned shortwhile size_t

为了读取a,unsigned long long int您可以像这样使用`ifstream':

#include <iostream>
#include <fstream>

int main()
{
    using namespace std;
    unsigned long long int random_value = 0; //Declare value to store data into
    size_t size = sizeof(random_value); //Declare size of data
    ifstream urandom("/dev/urandom", ios::in|ios::binary); //Open stream
    if(urandom) //Check if stream is open
    {
        urandom.read(reinterpret_cast<char*>(&random_value), size); //Read from urandom
        if(urandom) //Check if stream is ok, read succeeded
        {
            std::cout << "Read random value: " << random_value << std::endl;
        }
        else //Read failed
        {
            std::cerr << "Failed to read from /dev/urandom" << std::endl;
        }
        urandom.close(); //close stream
    }
    else //Open failed
    {
        std::cerr << "Failed to open /dev/urandom" << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有趣的部分将是这实际上与 urandom.read(reinterpret_cast<char*>(&random_value), size);

size应该是清楚的。通过使用sizeof我们获得要存储随机值的数据的实际大小(以字节为单位)。这很有用,因为此值在不同的体系结构(例如32位和64位)上可能有所不同。
请注意,如果您在此处传递的数据类型是指针。sizeof将仅返回指针的大小,而不返回其指向的数据的大小。

random_value是类型unsigned long long int&random_value合适的指针的类型也是如此unsigned long long int*。但是我们想读取字节(char),因此需要将值从/更改/转换unsigned long long int*char*reinterpret_cast<char*>(&random_value))。