Как сделать криптографически безопасным std ::iform_int_distribution? - PullRequest
1 голос
/ 01 ноября 2019

Как в C ++ сделать криптографически безопасным std ::iform_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];
  }
}

1 Ответ

1 голос
/ 01 ноября 2019

Ни один из случайных механизмов, предоставленных в стандарте C ++, не является "криптографически безопасным", и даже std::random_device указывается только для генерации "недетерминированных" случайных чисел (в лучшем случае), без необходимости навязывания каких-либо особых требований безопасности.

В частности, uniform_int_distribution (как и у всех других классов распространения C ++) имеет поведение, определяемое реализацией . Например, реализация стандартной библиотеки C ++ может реализовать uniform_int_distribution с использованием выборки отклонения или другой стратегии. Это означает, что uniform_int_distribution не гарантируется как «постоянное время» с точки зрения безопасности (в том смысле, что различия во времени выполнения не могут быть использованы при атаке безопасности; например, таким способом, который может восстановить случайноесемена).

...