Хорошо, я думаю, это полностью субъективно и еще много чего, но я думал об источниках энтропии для генераторов случайных чисел. Считается, что в большинстве генераторов установлено текущее время, верно? Что ж, мне было любопытно, какие другие источники можно использовать для генерации совершенно правильных, случайных (неопределенное определение) чисел.
Будет ли использование нескольких источников (таких как время + текущее время поиска на жестком диске [мы здесь фантастические]) вместе создать «более случайное» число, чем один источник? Каковы логические пределы количества источников? Сколько на самом деле достаточно? Время выбрано просто потому, что оно удобно?
Извините, если подобное запрещено, но мне любопытна теория, лежащая в основе источников.





Не беспокойтесь о «хорошем» начальном значении для генератора случайных чисел. Статистические свойства последовательности не зависят от того, как засевается генератор. Но есть и другие вещи. беспокоиться о. См. Подводные камни при генерации случайных чисел.
Что касается аппаратных генераторов случайных чисел, эти физические источники должны быть измерены, и процесс измерения имеет систематические ошибки. Вы можете обнаружить, что «псевдослучайные» числа имеют более высокое качество, чем «реальные» случайные числа.
Некоторые используют ввод с клавиатуры (таймауты между нажатиями клавиш), я слышал о том, что я думаю в романе, что можно использовать статический радиоприем, но, конечно, для этого требуется другое оборудование и программное обеспечение ...
Статья в Википедии о Аппаратный генератор случайных чисел перечисляет несколько интересных источников случайных чисел с использованием физических свойств.
Мои любимые:
раздел проблем в статье Википедии также описывает хрупкость многих из этих источников / датчиков. Датчики почти всегда производят все меньше случайных чисел по мере их старения / деградации. Эти физические источники должны постоянно проверяться статистическими тестами, которые могут анализировать сгенерированные данные, гарантируя, что инструменты не сломаются бесшумно.
Идея проекта: USB-колесо для хомяка
лавинный шум - это не так круто, как вы думаете. Это относится к свободным электронам, накапливающимся в непроводящих материалах: en.wikipedia.org/wiki/Avalanche_breakdown
SGI однажды использовала фотографии лавовой лампы в различных «фазах шара» в качестве источника энтропии, которая в конечном итоге превратилась в генератор случайных чисел с открытым исходным кодом под названием LavaRnd.
Я использую Random.ORG, они предоставляют бесплатные случайные данные из атмосферного шума, которые я использую для периодического повторного заполнения ГСЧ Мерсена-Твистера. Он настолько случайный, насколько это возможно, без каких-либо аппаратных зависимостей.
Ядро Linux использует время прерывания устройства (мышь, клавиатура, жесткие диски) для генерации энтропии. В Википедии есть хороший статья по энтропии.
Я использовал программу шифрования, которая использовала движения мыши пользователя для генерации случайных чисел. Единственная проблема заключалась в том, что программе приходилось делать паузу и просить пользователя случайным образом перемещать мышь в течение нескольких секунд для правильной работы, что не всегда было практичным.
Я нашел HotBits несколько лет назад - числа получены в результате радиоактивного распада, на самом деле числа случайный.
Существуют ограничения на количество номеров, которые вы можете загрузить в день, но меня всегда забавляло использовать их как действительно, действительно случайные начальные числа для ГСЧ.
Современные ГСЧ проверяются на корреляции в соседних семенах и запускаются через несколько сотен итераций после посева. Итак, к сожалению, скучный, но верный ответ заключается в том, что на самом деле это не имеет большого значения.
Вообще говоря, использование случайных физических процессов должно быть проверено, чтобы они соответствовали однородному распределению, и в противном случае они не имеют тенденций.
На мой взгляд, часто лучше использовать хорошо изученный генератор псевдослучайных чисел.
Некоторые «микросхемы» TPM (Trusted Platform Module) имеют аппаратный ГСЧ. К сожалению, TPM (Broadcom) в моем ноутбуке Dell лишен этой функции, но многие компьютеры, продаваемые сегодня, поставляются с аппаратным ГСЧ, который использует действительно непредсказуемые квантово-механические процессы. Intel реализовала разновидность теплового шума.
Кроме того, не используйте только текущее время для заполнения ГСЧ в криптографических целях или в любом приложении, где важна непредсказуемость. Использование нескольких младших битов того времени в сочетании с несколькими другими источниками, вероятно, нормально.
аналогичный вопрос может быть вам полезен.
Шум в верхней части спектра космического микроволнового фона. Конечно, вы должны сначала удалить некоторую анизотропию, объекты переднего плана, коррелированный шум детектора, галактические и локальные групповые скорости, поляризации и т. д. Многие ловушки остаются.
Don't worry about a "good" seed for a random number generator. The statistical properties of the sequence do not depend on how the generator is seeded.
Я не согласен с Совет Джона Д. Кука. Если вы запустите Mersenne Twister со всеми битами, установленными в ноль, кроме единицы, он изначально будет генерировать числа, которые не являются случайными. Генератору требуется много времени, чтобы преобразовать это состояние во что-либо, что могло бы пройти статистические тесты. Простая установка первых 32 бита генератора в начальное число будет иметь аналогичный эффект. Кроме того, если все состояние установлено на ноль, генератор будет производить бесконечные нули.
Правильно написанный код ГСЧ будет иметь правильно написанный алгоритм заполнения, который принимает, скажем, 64-битное значение и заполняет генератор, чтобы он выдавал приличные случайные числа для каждого возможного ввода. Так что, если вы используете надежную библиотеку, подойдет любое семя. Но если вы собираете свою собственную реализацию, вам нужно быть осторожным.
Источник семян не так уж и важен. Более важным является алгоритм генератора псевдо-чисел. Однако некоторое время назад я слышал о генерации семян для некоторых банковских операций. Они объединили множество факторов:
Даже если некоторые из этих параметров не сильно меняются со временем, вы можете поместить их в какую-нибудь хорошую функцию хеширования.
Как сгенерировать хорошее случайное число?
Может быть, учесть бесконечное количество вселенных? Если это правда, что все время создаются новые параллельные вселенные, мы можем сделать что-то вроде этого:
int Random() {
return Universe.object_id % MAX_INT;
}
В любой момент мы должны быть на другой ветви параллельных вселенных, поэтому у нас должны быть разные id. Проблема только в том, как получить объект Universe :)
Как насчет того, чтобы отделить поток, который будет манипулировать некоторой переменной в жестком цикле в течение фиксированного промежутка времени, прежде чем он будет уничтожен. То, что вы получите, будет зависеть от скорости процессора, загрузки системы и т.д ... Очень странно, но лучше, чем просто srand (time (NULL)) ...
Извините, что опаздываю на это обсуждение (сколько сейчас 3,5 года?), Но у меня возродился интерес к генерации PRN и альтернативным источникам энтропии. Разработчик ядра Linux Расти Рассел недавно обсудил свой блог об альтернативных источниках энтропии (кроме /dev/urandom).
Но я не очень впечатлен его выбором; MAC-адрес сетевого адаптера никогда не меняется (хотя он уникален от всех остальных), а PID кажется слишком маленьким для возможного размера выборки.
Я пробовал Мерсенн Твистер (на моем Linux-боксе), который засевается следующим алгоритмом. Прошу комментариев / отзывов, если кто-то желает и заинтересован:
/proc ниже.Для каждого из следующих файлов /proc вычислите сумму SHA256:
/proc/meminfo/proc/self/maps/proc/self/smaps/proc/interrupts/proc/diskstats/proc/self/stat
Поместите каждое 256-битное хеш-значение в отдельную область массива, созданного в (1).
Теперь у меня есть 256 бит случайных (достаточных) данных энтропии С НАДЕЖДОЙ для засева моего Mersenne Twister. Я использую приведенное выше, чтобы заполнить начало массива MT (624 32-битных целых числа), а затем инициализировать оставшуюся часть этого массива кодом автора MT. Кроме того, я мог использую другую хеш-функцию (например, SHA384, SHA512), но мне понадобится буфер массива другого размера (очевидно).
Исходный код Mersenne Twister требовал одного 32-битного начального числа, но я считаю, что этого недостаточно. Запуск «всего лишь» 2 ^ 32-1 различных МТ в поисках взлома криптовалюты не выходит за рамки практической возможности в наши дни.
Я хотел бы прочитать чьи-либо отзывы по этому поводу. Критика более чем приветствуется. Я буду защищать свое использование файлов /proc, как указано выше, потому что они постоянно меняются (особенно файлы /proc/self/*, и TSC всегда дает другое значение (наносекундное [или лучшее] разрешение, IIRC). Я запускал Несгибаемые испытания для этого ( на мелодию из нескольких сотен бит миллиард), и, похоже, он проходит успешно.Но это, вероятно, больше свидетельствует о надежности Mersenne Twister как ГПСЧ, чем о том, как я его засеваю.
Конечно, они не защищены от взлома полностью, но я просто не вижу, чтобы все они (и SHA *) были взломаны на и за всю мою жизнь.
Я знаю, что опаздываю на ваш ответ на 6 лет, но я думаю, что ваш подход слишком сложен. Если вы не хотите использовать / dev / urandom для заполнения вашего PRNG (что вам ВСЕГДА следует), вы можете просто прочитать / proc / sys / kernel / random / uuid три раза, хешировать три результата с помощью SHA-256, и используйте это как свое семя. Каждый из них представляет собой UUID типа 4, который обеспечивает 122-битную энтропию. Таким образом, два UUID предоставляют только 244 бита, поэтому вы должны собрать три и хэшировать с помощью SHA-256. Это лучший подход, потому что / proc / sys / kernel / random / uuid генерируется с помощью / dev / urandom, что является криптографически безопасным.