我需要许多加密安全数字,所以我考虑从 /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
接口(interface)
根据评论的建议,我尝试使用整数的均匀分布和初始化为 /dev/urandom
的 random_device
。这是代码:
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);
}
问题是这段代码比以前慢了大约 1000 倍(我使用的是 xorshift128+ 生成器):5 毫秒对将近 5 秒。这是正常的吗?老实说,我认为从 /dev/urandom
流式传输字节并将它们转换为 unsigned int
会更快......我错过了什么吗?
最佳答案
所以你的第一个例子是不正确的,会导致未定义的行为。
char*
block 没有指向任何分配的数据,所以 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);
读取的地方
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)
)。
关于C++ - 从/dev/urandom 中提取随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726331/