Можно ли сгенерировать действительно случайное число, используя ping для псевдослучайно выбранных IP-адресов? - PullRequest
55 голосов
/ 26 сентября 2008

Этот вопрос возник во время лекции по Comp Comp на втором курсе, в которой обсуждалась невозможность генерирования чисел в детерминированном вычислительном устройстве.

Это было единственное предложение, которое не зависело от оборудования не товарного класса.

Впоследствии никто не поставит под угрозу свою репутацию, чтобы окончательно утверждать за или против.

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

Ответы [ 23 ]

83 голосов
/ 26 сентября 2008

номер

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

Конечно, все еще остается вопрос о том, насколько детерминистична ваша локальная сеть, так что это может быть не так просто, как на практике. Но поскольку вы не получаете никакой выгоды от пингования случайных IP-адресов в Интернете, вы также можете извлечь энтропию из трафика Ethernet.

Получение энтропии с помощью устройств, подключенных к вашей машине, является хорошо изученным принципом, и плюсы и минусы различных видов устройств и методов измерения могут быть, например, украдено из реализации /dev/random.

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

В целях практической безопасности вы можете предположить, что никто не хочет получить ваш ключ PGP так сильно, и согласиться на компромисс между безопасностью и стоимостью. Но, изобретая алгоритмы и методы, вы должны дать им самые строгие гарантии безопасности, с которыми они когда-либо могли столкнуться. Поскольку я могу поверить, что кому-то где-то может понадобиться чей-то личный ключ достаточно сильно, чтобы создать этот набор средств, чтобы опровергнуть ваше предложение, я не могу принять его как опережение передовой практики. AFAIK / dev / random следует довольно близко к передовому опыту создания действительно случайных данных на дешевом домашнем ПК]

[ Другое редактирование : в комментариях было высказано предположение, что (1) верно для любого ТРНГ, что на физический процесс можно повлиять, и (2) что соображения безопасности здесь не применимы в любом случае.

Ответ на (1) заключается в том, что на любом реальном оборудовании можно сделать намного лучше, чем время отклика ping, и быстрее собрать больше энтропии, что это предложение не является решением. В терминах CS, очевидно, вы не можете генерировать случайные числа на детерминированной машине, что и вызвало вопрос. Но с точки зрения CS, машина с внешним входным потоком по определению недетерминирована, поэтому, если мы говорим о ping, то речь не идет о детерминированных машинах. Поэтому имеет смысл взглянуть на реальные входные данные, которые есть у реальных машин, и рассматривать их как источники случайности. Независимо от того, какая у вас машина, время необработанного пинга не стоит на первом месте в списке доступных источников, поэтому их можно исключить, прежде чем беспокоиться о том, что лучше, тем лучше. Предполагать, что сеть не является подрывной, - это гораздо большее (и ненужное) предположение, чем предполагать, что ваше собственное оборудование не подрывается.

Ответ на (2) философский. Если вы не возражаете против случайных чисел, обладающих тем свойством, что они могут быть выбраны по прихоти, а не случайно, тогда это предложение в порядке. Но это не то, что я понимаю под термином «случайный». То, что что-то противоречиво, не означает, что оно обязательно случайное.

Наконец, чтобы обратиться к деталям реализации предложения в соответствии с запросом: предполагая, что вы принимаете время пинга как случайное, вы все равно не можете использовать необработанное время пинга в качестве вывода RNG. Вы не знаете их распределения вероятностей, и они, конечно, не распределены равномерно (что обычно и требуется людям от ГСЧ).

Итак, вам нужно решить, на сколько бит энтропии на один пинг вы хотите положиться. Энтропия - это точно определенное математическое свойство случайной величины, которое можно разумно считать мерой того, насколько она «случайна». На практике вы находите нижнюю границу, которой вы довольны. Затем хэшируйте вместе несколько входов и преобразуйте их в число битов вывода, меньших или равных общей положительной энтропии входов. «Итого» не обязательно означает сумму: если входные данные статистически независимы, то это сумма, но вряд ли это относится к пингам, поэтому часть вашей оценки энтропии будет учитывать корреляцию. Сложная старшая сестра этой операции хеширования называется «сборщиком энтропии», и у всех хороших ОС есть один.

Если вы используете данные для заполнения PRNG, и PRNG может использовать произвольно большой начальный вход, то вам не нужно хешировать, потому что он сделает это за вас. Вы все еще должны оценить энтропию, если хотите знать, насколько «случайной» была ваша начальная стоимость - вы можете использовать лучший PRNG в мире, но его энтропия все еще ограничена энтропией семени.]

27 голосов
/ 26 сентября 2008

Случайные числа слишком важны, чтобы оставлять их на волю случая.

Или внешнее воздействие / манипуляция.

22 голосов
/ 04 октября 2008

Краткий ответ

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

Более длинная версия

Насколько случайны времена пинга?

Сами по себе временные данные сетевых операций (таких как ping) не будут распределяться равномерно. (А идея выбора случайных хостов нецелесообразна - многие не будут отвечать вообще, и различия между хостами могут быть огромными, с промежутками между диапазонами времени отклика - подумайте спутниковые соединения).

Однако, хотя временные рамки не будут распределены должным образом, в данных будет некоторый уровень случайности. Или, другими словами, уровень информационной энтропии присутствует. Это хорошая идея, чтобы подать данные синхронизации в генератор случайных чисел, чтобы заполнить их. Так какой уровень энтропии присутствует?

Для данных синхронизации сети, скажем, около 50 мс, измеренных с точностью до 0,1 мс, с разбросом значений 2 мс, у вас есть около 20 значений. При округлении до ближайшей степени 2 (16 = 2 ^ 4) у вас есть 4 бита энтропии на значение времени. Если бы это было для какого-либо безопасного приложения (например, для генерации криптографических ключей), тогда я был бы консервативен и сказал бы, что это было только 2 или 3 бита энтропии на чтение. (Обратите внимание, что я сделал очень приблизительную оценку и проигнорировал возможность атаки).

Как генерировать действительно случайные данные

Для истинных случайных чисел вам нужно отправить данные во что-то, спроектированное по линиям / dev / random , которое будет собирать энтропию, распределяя их в хранилище данных (используя какое-то * 1025) * хэш-функция , обычно защищенная ). В то же время оценка энтропии увеличивается. Таким образом, для 128-битного ключа AES потребуется 64 пинга, прежде чем энтропийный пул будет достаточно энтропийным.

Чтобы быть более надежным, вы можете добавить данные о времени использования клавиатуры и мыши, время отклика жесткого диска, данные датчика материнской платы (например, температуру) и т. Д. Это увеличивает скорость сбора энтропии и усложняет для атакующего контролировать все источники энтропии. И действительно, это то, что делается с современными системами. Полный список источников энтропии MS Windows приведен во втором комментарии к этому посту .

Подробнее

Для обсуждения атак (компьютерной безопасности) на генераторы случайных чисел и разработки криптографически безопасного генератора случайных чисел вы могли бы сделать хуже, чем читать yarrow paper от Брюса Шнайера и Джон Келси. (Yarrow используется системами BSD и Mac OS X).

13 голосов
/ 09 марта 2009

номер

Отключите сетевой кабель (или /etc/init.d/networking stop), и энтропия в основном упадет до нуля.

Выполните атаку типа «отказ в обслуживании» на проверяемый компьютер, и вы также получите предсказуемые результаты (значение времени ожидания ping)

10 голосов
/ 26 сентября 2008

Я думаю, вы могли бы. Пара вещей, на которые стоит обратить внимание:

  • Даже при пинге случайных IP-адресов первые несколько переходов (от вас до первого реального маршрутизатора L3 в сети ISP) будут одинаковыми для каждого пакета. Это устанавливает нижнюю границу времени прохождения туда-обратно, даже если вы что-то пропингуете в центре обработки данных в этой первой точке присутствия. Таким образом, вы должны быть осторожны с нормализацией сроков, есть нижняя граница в оба конца.
  • Вы также должны быть осторожны с формированием трафика в сети. Типичная реализация протекающего сегмента в маршрутизаторе высвобождает N байтов каждые M микросекунд, что эффективно изменяет ваши временные интервалы в определенные временные интервалы, а не в непрерывный диапазон времени. Поэтому вам, возможно, придется отбросить младшие биты вашей временной метки.

Однако я бы не согласился с тем, что в товарном оборудовании нет хороших источников энтропии. Многие чипсеты x86 за последние несколько лет включают генераторы случайных чисел. Те, с которыми я знаком, используют относительно чувствительные АЦП для измерения температуры в двух разных местах на матрице и вычитания их. Можно показать, что младшие разряды этого перепада температуры (посредством анализа хи-квадрат) строго случайны. По мере увеличения нагрузки на систему общая температура повышается, но разница между двумя областями матрицы остается некоррелированной и непредсказуемой.

10 голосов
/ 11 февраля 2009

Лучший источник случайности на товарном оборудовании, которое я видел, был парень, который удалил фильтр или что-то из своей веб-камеры, наложил непрозрачный клей на объектив, а затем смог легко обнаружить отдельные белые пиксели от ударов космических лучей ПЗС. Они настолько близки к случайным, насколько это возможно, и защищены от внешнего наблюдения квантовыми эффектами.

2 голосов
/ 26 сентября 2008

Часть хорошего генератора случайных чисел - это равные вероятности всех чисел при n -> бесконечность.

Так что, если вы планируете генерировать случайные байты, то при достаточном количестве данных из хорошего rng ​​каждый байт должен иметь равную вероятность возврата. Кроме того, не должно быть никакой картины или предсказуемости (скачков вероятности в течение определенных периодов времени) определенных чисел, которые будут возвращены.

Я не слишком уверен, используя ping, что вы будете измерять, чтобы получить случайную переменную, это время отклика? Если это так, вы можете быть уверены, что некоторые времена отклика или диапазоны времени отклика будут более частыми, чем другие, и, следовательно, могут привести к созданию небезопасного генератора случайных чисел.

2 голосов
/ 15 ноября 2009

Если вам нужно стандартное оборудование, ваша звуковая карта должна это делать. Просто увеличьте громкость на аналоговом входе, и вы получите дешевый источник белого шума. Дешевая случайность без необходимости в сети.

1 голос
/ 09 марта 2009

Да, это возможно, но ... в деталях дьявол.

Если вы собираетесь сгенерировать 32-разрядное целое число, вам нужно собрать> 32 бита энтропии (и использовать достаточную функцию микширования, чтобы распространить эту энтропию, но это известно и выполнимо). Большой вопрос:

сколько энтропии имеет время пинга?

Ответ на этот вопрос зависит от всевозможных предположений о сети и вашей модели атаки, и есть разные ответы в разных обстоятельствах.

Если злоумышленники могут полностью контролировать время пинга, вы получаете 0 бит энтропии на один пинг, и вы никогда не сможете получить 32 бита энтропии, независимо от того, сколько вы смешиваете. Если они имеют не совсем идеальный контроль над временем пинга, вы получите некоторую энтропию и (если вы не переоцените количество энтропии, которую вы собираете) получат совершенно случайные 32-битные числа.

1 голос
/ 09 марта 2009

Никакие математические вычисления не могут привести к случайному результату, но в "реальном мире" компьютеры не просто вычисляют числа ... При небольшом творческом подходе должна быть возможность получить случайные результаты, которых нет известный способ воспроизведения или прогнозирования точных результатов.

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

Другие идеи включают тепловой шум и низкоуровневую синхронизацию строк кэша. На многих современных ПК с чипами TPM уже есть встроенные аппаратные генераторы случайных чисел с качеством шифрования.

Моя реакция колена на пинг (особенно при использовании ICMP) заключается в том, что вы слишком откровенно обманываете. В этот момент вы можете также снять счетчик гигантов и использовать фоновое излучение в качестве случайного источника.

...