【问题标题】:How can we make std::uniform_int_distribution cryptographically secure?我们如何使 std::uniform_int_distribution 加密安全?
【发布时间】:2019-11-01 14:44:34
【问题描述】:

在 C++ 中,我们如何使 std::uniform_int_distribution 加密安全? 例如,以下代码是否生成加密安全的统一随机数? 如果不是,我们该如何纠正?

#include <iostream>
#include <random>

int main(void){
  std::default_random_engine generator;
  std::uniform_int_distribution<int> distribution(0,9);
  int p[10]={};

  for (int i=0; i<10; ++i) {
    int number = distribution(generator);
    ++p[number];
  }
}

【问题讨论】:

  • 这对InformationSecurity.SE 来说可能是一个更好的问题如果您决定在那里发帖,请在此处删除问题。
  • 谷歌 NIST SP 800-22
  • 为什么你想要一个来自 CSPRNG 的统一 int?尤其是在那个范围内! CSPRNG 并非旨在产生均匀分布的输出,它们的目标是难以预测的输出。如果您关心统计属性,请使用为其设计的 RNG

标签: c++ random cryptography


【解决方案1】:

C++ 标准中提供的随机引擎都不是“加密安全的”,甚至std::random_device 也仅被指定为生成“不确定的”随机数(充其量),而不必强加任何特定的安全要求。

特别是uniform_int_distribution(与所有其他 C++ 分发类一样)has implementation-defined behavior。例如,C++ 标准库的实现可以使用拒绝采样或其他策略来实现uniform_int_distribution。这意味着从安全的角度来看,uniform_int_distribution 不能保证是“恒定时间”(从某种意义上说,运行时间的差异不能在安全攻击中被利用;例如,以一种可以恢复随机种子)。

【讨论】:

  • 感谢您的友好回答!什么决定了执行?编译器?
  • C++ 标准库实现决定了std::uniform_int_distribution(与其他 C++ 分发类一样)如何实现。
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多