分析您的问题比看起来更难:
您使用 为 mersenne twister 播种rd()
,它返回一个unsigned int
,因此(在大多数平台上)最多包含 32 个随机位。
从这一点开始,mersenne twister 所做的一切都是由这 32 位决定的。
这意味着value
只能采用 2**32 个不同的值,如果存在任何攻击向量,通过蛮力攻击你对这个数字所做的任何事情,这可能是一个问题。事实上,mersenne twister 的播种例程甚至可以减少第一个结果的可能值的数量,因为它在其完整状态中分配了 32 个随机位(为确保不是这种情况,您必须分析种子例程提升用途)。
然而,在这种情况下,梅森捻线器的主要弱点(它的状态可以在看到 624 个数字后得出)甚至不感兴趣,因为您生成的序列非常短(1 个值)。
生成 64 个加密安全位
假设这unsigned int
相当于uint32_t
在您的平台上,您可以使用以下命令轻松生成 64 个加密安全随机位boost::random_device
:
boost::random_device rd;
std::uint64_t value = rd();
value = (value << 32) | rd();
这是相当安全的,因为 linux 和 windows 的实现都使用操作系统自己的加密安全随机源。
生成具有任意分布的加密安全值
虽然前面的工作足够好,但您可能希望有一个更灵活的解决方案。通过意识到您实际上也可以使用 boost 提供的随机分布,这很容易做到random_device
。一个简单的例子是像这样重写以前的解决方案:
boost::random_device rd;
boost::random::uniform_int_distribution<std::uint64_t> dis;
std::uint64_t value = dis(rd);
(虽然如果前一个实际上在 [0, 2**32 中不包含数字,这在理论上也可以提供更稳健的解决方案),但在实践中这不是问题。)
将分发绑定到生成器
为了提高可用性,您经常会发现使用boost::bind
将分发和生成器绑定在一起。由于boost::bind
复制了它的参数,并且复制 ctor 被删除boost::random_device
,你需要使用一个小技巧:
boost::random_device rd;
boost::random::uniform_int_distribution<std::uint64_t> dis;
boost::function<std::uint64_t()> gen = boost::bind(dis, boost::ref(rd));
std::uint64_t value = gen();