繁体   English   中英

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

[英]C++ - Extracting random numbers from /dev/urandom

我需要许多加密安全的数字,因此我正在考虑从/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();

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

编辑-使用C ++ 11的random接口

根据评论的建议,我尝试对整数使用均匀分布,并将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);
}

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

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

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

除此之外, size的类型是signed short而应该是size_t

为了读取一个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;
}

有趣的部分是它实际上是用urandom.read(reinterpret_cast<char*>(&random_value), size);读取的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) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM