[英]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();
是否有意义? 以及如何将我得到的转换为我想要的类型?
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.