Что такое решение для генерации случайных long long
с криптографической стойкостью С ++? (буст разрешен)
<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, которая использует криптографические сервисы этой платформы.
Под Linux вы можете прочитать из /dev/random
или же /dev/urandom
Они оба обеспечивают криптографическую энтропию.
Разница между ними заключается в: /dev/random
блокирует, если энтропия исчерпана, поэтому она может быть медленнее, чем /dev/urandom
но «сильнее»
Таким образом, с помощью потоков это будет выглядеть так
long long n;
std::ifstream rstream ("/dev/random");
rstream >> n;