Как получить действительно случайные данные, а не случайные данные, подаваемые в семя ГПСЧ, как это делают CSRNG?

Насколько я понимаю, CSRNG, например RNGCryptoServiceProvider по-прежнему передает действительно случайные пользовательские данные, такие как движение мыши и т. д., через ГПСЧ, чтобы вроде как очистить вывод и обеспечить его равное распределение. Биты должны быть полностью независимыми.

(это для злоумышленника с теоретической бесконечной вычислительной мощностью). Если CSRNG берет 1 КБ истинных случайных данных и расширяет его до 1 МБ, все, что нужно сделать злоумышленнику, - это сгенерировать каждую комбинацию из 1 КБ данных, развернуть ее и посмотреть, какой 1 МБ данных генерирует одноразовый блокнот, который возвращает разумный вывод на английском языке. Я где-то читал, что если одноразовый блокнот имел ГПСЧ где-нибудь в ГСЧ, это просто прославленный потоковый шифр. Мне было интересно, были ли действительно случайные начальные данные в достаточно большом количестве, чтобы их можно было просто использовать вместо криптографического расширения. Мне нужен действительно случайный вывод для одноразового блокнота, а не просто криптографически безопасный ГСЧ. Или, возможно, если бы были другие способы каким-то образом получить действительно случайные данные, чтобы все биты были независимы друг от друга. Я думал о XOR с координатами мыши в течение нескольких секунд, затем, возможно, последних цифр Environment.TickCount, затем, возможно, получения ввода с микрофона (1, 2, 3, 4). Однако, как некоторые отмечают в stackoverflow, я должен просто позволить ОС справиться со всем этим. К сожалению, это невозможно, поскольку используется PSRNG. Я бы хотел избежать аппаратного решения, так как это должна быть простая в использовании программа, а также не использовать RDRAND, поскольку он ТАКЖЕ использует ГПСЧ (если RDRAND не может возвращать действительно случайные данные до того, как они пройдут через ГПСЧ ??) . Буду признателен за любые отзывы, если такое возможно; Я работал над этим несколько недель, и мне казалось, что RNGCryptoServiceProvider достаточно для одноразового блокнота. Спасибо.

(Примечание: некоторые говорят, что для большинства криптографических функций вам не нужна настоящая энтропия, а только непредсказуемость. Для одноразового блокнота он ДОЛЖЕН быть случайным, иначе это не одноразовый блокнот.)


person Matthew E    schedule 14.06.2020    source источник
comment
Вы слишком много думаете об этом. Насколько известно, RNGCryptoServiceProvider достаточно для одноразового блокнота. Ваши аргументы на самом деле показывают, что одноразовые прокладки - крайне неэффективная конструкция, поэтому они больше не используются. Вместо этого используйте хорошо изученные алгоритмы шифрования, такие как AES.   -  person President James K. Polk    schedule 15.06.2020
comment
RNGCryptoServiceProvider достаточно для большинства задач, но у него все еще есть PRNG, который использует случайные данные в качестве начального числа. В настоящее время моя реализация одноразового блокнота хороша, если вы доставляете ключевые файлы лично; он также включает HMAC для обеспечения подлинности. Однако для одноразового блокнота все биты должны быть независимыми, иначе это просто прославленный потоковый шифр. Я ищу реализацию, которая будет гарантированно защищена в течение следующего десятилетия, 50 лет или более. Никто не будет использовать это, но мне нравится создавать что-то, что НИКТО не может сломать в ЛЮБОЙ точке.   -  person Matthew E    schedule 15.06.2020
comment
Что ж, я совсем не хочу вас отговаривать, пожалуйста, продолжайте думать и пытаться. Безопасность сложна, и криптовалюта может потерпеть неудачу из-за скрытых причин. Например, вы говорите, что включены HMAC. Если вы не будете осторожны, HMAC может аннулировать идеальную гарантию безопасности, которую вы хотите получить с помощью одноразового блокнота.   -  person President James K. Polk    schedule 15.06.2020
comment
HMAC имеет функции, встроенные в C #, поэтому было несложно убедиться, что это было сделано правильно. Просто убедитесь, что ввод с клавиатуры выполнен правильно. Спасибо за поддержку!   -  person Matthew E    schedule 15.06.2020


Ответы (1)


Как вы знаете, истинная случайность означает, что каждый бит независим от всего остального, а также равномерно распределен. Однако достичь этого идеала на практике сложно, если вообще возможно. В общем, самый близкий способ получить действительно случайные данные на практике - собрать трудно угадываемые биты из недетерминированные источники, а затем сжать эти биты в случайный блок данных.

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

  1. Источники должны быть недетерминированными, то есть их выход не может определяться их входами. Примеры недетерминированных источников включают тайминги устройств ввода; тепловой шум; и шум, регистрируемый выходами микрофона и камеры.
  2. Выход источников должно быть трудно угадать. Это более формально известно как энтропия, например 32 бита энтропии на 64 бита вывода. Однако измерение энтропии далеко не тривиально. Если вам нужен 1 МБ (8 миллионов бит) действительно случайных данных, вам нужно иметь данные с не менее 8 миллионами бит энтропии (что на практике будет во много раз больше, чем 1 МБ в зависимости от источников), затем сконденсируйте данные каким-то образом в 1 МБ данных, сохраняя эту энтропию.
  3. Источники должны быть независимыми друг от друга.
  4. Должно быть два или более независимых источника. Это потому, что невозможно извлечь полную случайность только из одного источника (см. McInnes and Pinkas 1990). С другой стороны, извлечение случайности из трех или более независимых источников относительно тривиально, но все еще остается вопрос выбора подходящего экстрактора случайности, и обзор экстракторов случайности выходит за рамки этого ответа.

В общем, для целей генерации случайных чисел чем больше источников доступно, тем лучше.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА:

  • Макиннес, Дж. Л., и Пинкас, Б. (1990, август). О невозможности криптографии с закрытым ключом со слабо случайными ключами. На конференции по теории и применению криптографии (стр. 421-435).
person Peter O.    schedule 14.06.2020
comment
Будет ли объединение нескольких источников, таких как данные о местоположении мыши, задержка нажатия клавиатуры, тепловая информация и т. Д., Удовлетворять требованиям для одноразовой клавиатуры? То есть все байты действительно не связаны друг с другом? - person Matthew E; 14.06.2020