【发布时间】:2016-03-01 15:04:19
【问题描述】:
我需要许多加密安全数字,因此我正在考虑从/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 接口
根据 cmets 的建议,我尝试在整数上使用均匀分布,并将 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);
}
问题是这段代码比以前慢了大约 1000 倍(我使用的是 xorshift128+ 生成器):5 毫秒对近 5 秒。这是正常的吗?老实说,我认为从/dev/urandom 流式传输字节并将它们转换为unsigned int 会更快......我错过了什么吗?
【问题讨论】:
-
如果你真的想要安全号码,你不应该使用
/dev/urandom... -
@SimonKraemer 我明白你的意思,但普遍认为
/dev/urandom的安全性是可以接受的,至少基于我在互联网上所做的研究。无论如何,我稍后会调查这一点。目前我只想让它工作...... -
有什么理由不信任already available 的随机数生成器?
-
为什么不使用 C++11
random接口? en.cppreference.com/w/cpp/numeric/random/random_device/… -
您有
arc4random()可用吗?它将返回一个uint32_t,您可以将两个调用或字节的结果组合起来:arc4random_buf()。