Случайный длинный длинный генератор Переполнение стека

Что такое решение для генерации случайных long long с криптографической стойкостью С ++? (буст разрешен)

-1

Решение

<random> заголовок обеспечивает портативный доступ к средствам случайных чисел, включая, потенциально, криптографический pRNG.

#include <random>     // random_device, uniform_int_distribution
#include <algorithm>  // generate_n
#include <iterator>   // ostream_iterator
#include <iostream>   // cout
#include <functional> // bind, ref

int main() {
std::random_device r;
std::uniform_int_distribution<long long> dist;

std::generate_n(std::ostream_iterator<long long>(std::cout, "\n"), 10,
std::bind(dist,std::ref(r)));
}

std::random_device может не быть криптографическим pRNG во всех реализациях, поэтому вам придется проверить документацию по реализации. В частности, VC ++ до 2012 года не обеспечивает недетерминированную реализацию. VC ++ 2012 и более поздние версии реализуют это с помощью служб криптографии Windows.

Реализации в других операционных системах, таких как Linux или Mac OS X, могут обычно использовать «/ dev / urandom» или «/ dev / random» или любое другое случайное устройство, открываемое через файловую систему. Например. libc ++ использует «/ dev / urandom» по умолчанию, который в OS X использует алгоритм Ярроу.

Я знаю, что вы исключили повышение, но boost::random_device имеет реализацию для Windows, которая использует криптографические сервисы этой платформы.

6

Другие решения

Под Linux вы можете прочитать из /dev/random или же /dev/urandom

Они оба обеспечивают криптографическую энтропию.

Разница между ними заключается в: /dev/random блокирует, если энтропия исчерпана, поэтому она может быть медленнее, чем /dev/urandom но «сильнее»

Таким образом, с помощью потоков это будет выглядеть так

long long n;
std::ifstream rstream ("/dev/random");
rstream >> n;
3

По вопросам рекламы [email protected]