Как найти "истинную" энтропию std:: random_device?

Я хочу проверить, выполняется ли моя реализация std::random_device имеет ненулевую энтропию (т.е. недетерминированна), используя функцию std::random_device::entropy(). Однако, согласно на cppreference.com

"Эта функция не полностью реализована в некоторых стандартных библиотеках. Например, gcc и clang всегда возвращают ноль, даже если устройство не является детерминированным. Для сравнения, Visual С++ всегда возвращает 32, и boost.random возвращает 10.

Есть ли способ найти реальную энтропию? В частности, компьютеры (MacBook Pro/iMac и т.д.) имеют недетерминированный источник или случайность, например, например, используя мониторы тепловыделения?

Ответ 1

Я рекомендую вам лекцию этой статьи.

Мифы о /dev/urandom

§ 26.5.6

Случайный случайный генератор случайных чисел генерирует недетерминированные случайные числа.

Если ограничения реализации предотвращают создание недетерминированных случайных чисел, реализация может использовать механизм случайных чисел.

Таким образом, в основном он попытается использовать генератор случайных чисел внутренней системы "истинный", в linux/dev/{u} random o windows RltGenRandom.

Другая точка заключается в том, что вы не доверяете этим источникам случайности, потому что они зависят от внутреннего шума или близки к реализации.

Кроме того, как вы оцениваете качество энтропии, как вы знаете, это одна из самых больших проблем, связанных с поиском хороших генераторов rng.

Одна оценка может быть очень хорошей, а другая оценка может сообщать не очень хорошую энтропию.

Оценка энтропии

В различных областях науки/техники, таких как независимые анализ компонентов, анализ изображений, генетический анализ, речь распознавание, многообразное обучение и оценка временной задержки полезно оценить дифференциальную энтропию системы или процесса, учитывая некоторые наблюдения.

Как и все, вы должны полагаться на окончательные наблюдения, и это может быть неправильно.

Я думаю, что внутренний rng недостаточно хорош, вы всегда можете попытаться купить аппаратные устройства для этой цели. В этом списке на wikipedia есть список поставщиков, вы можете проверить отзывы о них в Интернете.

Производительность

Один момент, который вы должны учитывать, - это производительность в вашем приложении с использованием реальных генераторов случайных чисел. Одной из распространенных методик является использование в качестве семян в mersenne twister числа, полученного с использованием /dev/random.

Если пользователь не может физически получить доступ к вашей системе, вам нужно будет сбалансировать надежность с доступностью, система с дырами в безопасности так же плоха, как одна не работает, в конце вы должны зашифровать важные данные.

Изменить 1: Как предложение, я переместил статью в верхней части моего комментария, это хорошо прочитано. Спасибо за подсказку: -).

Ответ 2

Все стандартное дает вам то, что вы уже видели. Вам нужно будет что-то узнать о том, как данная стандартная библиотека реализует random_device, чтобы ответить на этот вопрос. Например, в Visual Studio 2013 Update 4, random_device перейдет в rand_s, который перейдет в RtlGenRandom, который может быть (всегда?) криптографически защищенным генератором псевдослучайных чисел в зависимости от вашей версии Windows и доступного оборудования.

Если вы не доверяете платформе, чтобы обеспечить хороший источник энтропии, тогда вы должны использовать свой собственный криптографически безопасный PRNG, например, один на основе AES. Тем не менее, поставщики платформ имеют сильные стимулы для того, чтобы их случайные числа фактически были случайными, а внедрение PRNG в ваше приложение означает, что PRNG не может быть обновлен так же легко, если окажется, что он небезопасен. Только вы можете решить этот компромисс для себя:)

Ответ 3

Энтропия - это всего лишь один показатель качества RNG (и истинной, точной энтропии невозможно измерить). Для практического и разумного измерения качества случайного числа std::random_device рассмотрите возможность использования стандартного набора тестов случайности, такого как TestU01, diehard или его преемник dieharder. Они запускают батарею статистических тестов, направленных на то, чтобы подчеркнуть ваш RNG, гарантируя, что он производит статистически случайные данные.

Обратите внимание, что статистическая случайность сама по себе не подтверждает, что RNG подходит для криптографических приложений.


Многие современные компьютеры имеют легкодоступные источники аппаратной случайности, а именно аналого-цифровые преобразователи, обнаруженные в аудиовходе, камере и различных датчиках. Они демонстрируют низкоуровневые тепловые или электрические шумы, которые могут быть использованы для получения высококачественных случайных данных. Тем не менее, ни одна ОС, которую я знаю, фактически не использует эти датчики для подачи своих системных источников случайных чисел (например, /dev/[u]random), поскольку битрейт таких источников физического случайного числа имеет тенденцию быть очень низким.

Вместо этого источники данных случайного числа, предоставленные OS, обычно засеваются аппаратными счетчиками и событиями, такими как ошибки страницы, события драйвера устройства и другие источники непредсказуемости. Теоретически эти события могут быть полностью предсказуемыми с учетом точного состояния аппаратного обеспечения (поскольку они не основаны, например, на квантовых или тепловых шумах), но на практике они достаточно непредсказуемы, что они создают хорошие случайные данные.

Ответ 4

Энтропия как научный термин используется неправильно при описании случайных чисел. Сложность может быть лучшим термином. Энтропия в физике определяется как логарифм количества доступных квантовых состояний (не полезен в RNG), а энтропия в теории информации определяется энтропией Шеннона, но она ориентирована на другую крайность - как помещать столько информации в шумный поток битов, а не как минимизировать информацию.

Например, цифры Pi выглядят случайными, но фактическая энтропия цифр равна нулю, как только вы знаете, что они происходят из Pi. Увеличение "энтропии" в RNG в основном связано с тем, что источник чисел как можно более неясен.