gpt4 book ai didi

c++ - 如何使用 boost::random_device 生成密码安全的 64 位整数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:06 26 4
gpt4 key购买 nike

我想做这样的事情:

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 是非确定性随机的并且它用于播种梅森扭曲器(如上所示),这是否也使梅森扭曲器在密码学上是安全的(即使它本身不是)?

我在这个领域有点新手,所以任何建议都将不胜感激。

那么,我如何生成可以存储在 uint64_t 中的加密安全 64 位数字?

谢谢,

本。

最佳答案

分析您的问题比看起来更难:

您使用 rd() 为 mersenne twister 播种,它返回一个 unsigned int,因此(在大多数平台上)最多包含 32 个随机位。

梅森扭曲器从这一点开始所做的一切都由这 32 位决定。

这意味着 value 只能取 2**32 个不同的值,如果存在任何攻击媒介,无论您用暴力破解这个数字做什么,这都可能是个问题。事实上,mersenne twister 的播种例程甚至可能会减少第一个结果的可能值的数量,因为它将 32 个随机位分布在其完整状态上(以确保不是这种情况,您必须分析种子例程 boost用途)。

梅森扭曲函数 (its state can be derived after seeing 624 numbers) 的主要弱点在这种情况下甚至没有意义,因为您生成的序列非常短(1 个值)。

生成 64 个加密安全位

假设 unsigned int 等同于您平台上的 uint32_t,您可以使用 boost::random_device 轻松生成 64 个加密安全随机位>:

boost::random_device rd;
std::uint64_t value = rd();
value = (value << 32) | rd();

这是相当安全的,因为 linux 和 windows 的实现 use the operating system's own cryptographically secure randomness sources .

生成具有任意分布的加密安全值

虽然之前的解决方案运行良好,但您可能希望获得更灵活的解决方案。这很容易实现,因为您意识到您实际上也可以使用 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] 中的数字,这也可以提供更稳健的解决方案,但这在实践中不是问题。)

绑定(bind)分发到生成器

为了 boost 可用性,您经常会发现使用 boost::bind 将分发和生成器绑定(bind)在一起。由于 boost::bind 复制了它的参数,并且为 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();

关于c++ - 如何使用 boost::random_device 生成密码安全的 64 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23372245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com