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

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

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

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

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

Ответ 1

Я поставлю свою репутацию на линии (по крайней мере, 2 очка за каждую понижающую оценку).

Нет.

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

Или внешнее влияние/манипуляция.

Ответ 3

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

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

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

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

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

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

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

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

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

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

Больше чтения

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

Ответ 4

Нет.

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

Выполните атаку Denial-Of-Service на машине, на которой выполняется ping, и вы также получите прогнозируемые результаты (значение таймаута пинга)

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Подробнее о случайности см. Random.org.

Здесь попытка реализации:

@ips  : list = getIpAddresses();
@rnd         = PseudorandomNumberGenerator(0 to (ips.count - 1));

@getTrueRandomNumber() { ping(ips[rnd.nextNumber()]).averageTime }

Ответ 10

Подход к измерению чего-то для генерации случайного семени кажется довольно хорошим. Книга O'Reilly Практическая Unix и Internet Security дает несколько аналогичных дополнительных методов определения случайного семени, например, просить пользователя набрать несколько нажатий клавиш, а затем измерение времени между нажатиями клавиш. (В книге отмечается, что этот метод используется PGP как источник его случайности.)

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

Однако, вероятно, вряд ли внутренний датчик ЦП мог бы точно измерить температуру процессора до достаточного количества знаков после запятой, чтобы сделать значение действительно жизнеспособным как случайное число семян; по крайней мере, не с "оборудованием товарного класса", как указано в вопросе!

Ответ 11

Я бы скорее использовал что-то вроде ISAAC как более сильный PRNG, прежде чем доверять кругосветным звонкам как энтропию. Как говорили другие, для кого-то было бы слишком легко не только угадать ваши цифры, но и, возможно, контролировать их в разной степени.

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

Я отправился в 9 раундов, пытаясь придумать сильный (и быстрый) PRNG для механизма клиент/сервер RPC, который я писал. Обе стороны имели идентичный ключ, состоящий из 1024 строк из 32 символьных шифров. Клиент отправит AUTH xx, сервер вернет AUTH yy.., и обе стороны знали, какие две строки ключа использовать для создания секретной дуги (+ соль). Затем сервер отправил SHA-256 дайджест всего ключа (зашифрованный), клиент знал, что он разговаривает с чем-то, у которого был правильный ключ.. сеанс продолжался. Да, очень слабая защита для человека посередине, но публичный ключ не может быть и речи о том, как используется устройство.

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

Итак, я должен спросить о вашей идее... насколько это практично?

Ответ 12

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

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

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

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

Ответ 13

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

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

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

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

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

Ответ 14

Вы можете использовать метод XKCD:

Random Number Generator

Ответ 15

На YouTube показано устройство в действии: http://www.youtube.com/watch?v=7n8LNxGbZbs

Случайно, если никто не может предсказать следующее состояние.

Ответ 16

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

Я думаю, что измерение пингов принесло бы качественные случайные биты, но при недостаточной скорости, чтобы быть очень полезными (если вы не захотели сделать какой-то серьезный DDOSing).

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

(править). С практической точки зрения, этот подход открывает вам возможность того, что кто-то из вашей сети манипулирует вашим генератором "случайных" чисел.

Ответ 17

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

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

Кроме того, даже если вы сделаете визуальный график из 100 000 результатов и рассчитаете, что нет никаких корреляций между числами, это не означает, что он действительно случайный. Как объясняется dilbert:)

Ответ 18

Это не кажется мне хорошим источником случайности.

Какую метрику вы бы использовали - очевидным является время отклика, но диапазон значений, который вы можете разумно ожидать, невелико: от нескольких десятков миллисекунд до нескольких тысяч. Время ответа само по себе будет следовать кривизне звонка, а не быть случайным образом распределенным через любой интервал (как бы вы выбрали интервал?), Поэтому вам придется попробовать и выбрать несколько "случайных" битов из чисел.

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

Вероятно, есть намного лучшие "интересные" способы получения случайных бит - возможно, Google для случайного слова, возьмите первую страницу и выберите N-й бит со страницы.

Ответ 19

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

    I MADE U A RANDOM NUMBER
           BUT I EATED IT

Ответ 20

Случайность не является бинарным свойством - это значение от 0 до 1, которое описывает, как трудно предсказать следующее значение в потоке.

Запрашивая: "Насколько случайны могут быть мои значения, если я основываю их на пингах?" на самом деле спрашивает: "Насколько случайны пинг?". Вы можете оценить это, собрав достаточно большой набор данных (например, 1 млн пингов) и сопоставив их кривую распределения и поведение во времени. Если распределение является плоским и поведение трудно предсказать, данные кажутся более случайными. Более ухабистое распределение или предсказуемое поведение предполагают более низкую случайность.

Вы также должны рассмотреть разрешение выборки. Я мог представить, что результаты округляются каким-то образом до milisecond, поэтому с помощью pings вы можете иметь целочисленные значения от 0 до 500. Это не так много разрешения.

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

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

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

Ответ 21

У меня есть код, который создает случайные числа с traceroute. У меня также есть программа, которая делает это с помощью ping. Я сделал это год назад для класса. Все, что он делает, - это запустить traceroute on и address, и он принимает наименьшую цифру sig в ​​миллисекундах. Он работает очень хорошо при получении случайных чисел, но я действительно не знаю, насколько близко это к истинному случайному.

Вот список из 8 чисел, которые я получил, когда я его запустил.

455298558263758292242406192

506117668905625112192115962

805206848215780261837105742

095116658289968138760389050

465024754117025737211084163

995116659108459780006127281

814216734206691405380713492

124216749135482109975241865

#include <iostream>
#include <string>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
system("traceroute -w 5 www.google.com >> trace.txt");

string fname = "trace.txt";
ifstream in;
string temp;

vector<string> tracer;
vector<string> numbers;

in.open(fname.c_str());
while(in>>temp)
tracer.push_back(temp);

system("rm trace.txt");

unsigned index = 0;

string a = "ms";
while(index<tracer.size())
{
if(tracer[index]== a)
numbers.push_back(tracer[index-1]);
++index;
}


std::string rand;

for(unsigned i = 0 ; i < numbers.size() ; ++i)
{
std::string temp = numbers[i];
int index = temp.size();
rand += temp[index - 1];
}

cout<<rand<<endl;

return 0;

}

Ответ 22

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

Идея веб-камеры звучит (слегка) разумно. Пользователи Linux часто рекомендуют просто использовать случайный шум со звуковой карты, которая не имеет микрофона.

Ответ 23

вот мое предложение:

1 выберите выбор сайтов, которые находятся как можно дальше от вашего местоположения. например если вы находитесь в США, попробуйте несколько сайтов, на которых есть IP-адреса их серверов в малазии, Китае, России, Индии. серверы с высоким трафиком лучше.

2- во время высокого интернет-трафика в вашей стране (в моей стране это похоже на 7 - 11 вечера) много раз пинговать эти сайты, брать каждый результат ping (использовать только целочисленное значение) и вычислять модуль 2 (т.е. из каждой операции ping вы получаете один бит: либо 0, либо 1).

3- повторите процесс в течение нескольких дней, записывая результаты.

4- собрать все биты, которые вы получили от всех своих пингов (возможно, вы получите сотни тысяч бит) и выберите из них свои бит. (возможно, вы хотите выбрать свои биты, используя некоторые данные из того же метода, упомянутого выше:))

БУДЬТЕ ОСТОРОЖНЫ: в вашем коде вы должны проверить время ожидания..etc