【发布时间】:2014-06-15 20:07:37
【问题描述】:
我想做这样的事情:
boost::random_device rd;
boost::random::mt19937_64 gen(rd());
boost::random::uniform_int_distribution<unsigned long long> dis;
uint64_t value = dis(gen);
但我听说梅森捻线机在密码学上并不安全。但是,我还读到 random_device 可能是,如果它从 /dev/urandom 中提取数据,这可能在 linux 平台(我的主要平台)上。因此,如果 random_device 是非确定性随机的,并且它用于播种 mersenne twister(如上所示),那是否也使 mersenne twister 在密码学上安全(即使它本身不是)?
我在这个领域有点新手,所以任何建议都值得赞赏。
那么,如何生成可以存储在 uint64_t 中的加密安全 64 位数字?
谢谢,
本。
【问题讨论】:
-
免责声明 - 不是专家。 Mersenne twister 永远不可能是加密安全的,无论你如何播种它,因为攻击者一旦了解了它的内部状态,就可以很容易地确定下一个结果。要生成 64 位数字,您可以调用
random_device两次(假设是 32 位int),然后附加结果。此外,您可能不想使用默认的/dev/urandom源,而是将参数"/dev/random"传递给random_device构造函数。与前者不同,后者将在熵池中没有更多可用的随机位时阻塞。 -
感谢您对 Paetorian 的评论——似乎与 gha.st 的回答相似!干杯。
-
@Praetorian 我推荐
/dev/urandom而不是/dev/random。一旦充分播种(例如 200 位熵),无论您阅读多少,PRNG 都不会耗尽熵。所以/dev/random做了很多不必要的阻塞。/dev/urandom的唯一问题是它可能还没有充分播种,这主要与嵌入式设备启动过程的早期有关。
标签: c++ boost random cryptography mersenne-twister