Альтернативные источники энтропии - PullRequest
12 голосов
/ 19 ноября 2008

Хорошо, я полагаю, что это совершенно субъективно, но я думал об источниках энтропии для генераторов случайных чисел. Получается, что большинство генераторов посеяно с текущим временем, верно? Что ж, мне было любопытно, какие другие источники могут быть использованы для генерации совершенно правильных, случайных чисел (свободного определения).

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

Извините, если подобные вещи не разрешены, но мне любопытно, что за теория стоит за источниками.

Ответы [ 15 ]

17 голосов
/ 19 ноября 2008

В статье Википедии о Аппаратном генераторе случайных чисел перечислены несколько интересных источников случайных чисел, использующих физические свойства.

Мои любимые:

  • Источник радиационного распада, обнаруженный счетчиком Гейгера, подключенным к ПК.
  • Фотоны, проходящие через полупрозрачное зеркало. Взаимоисключающие события (отражение - передача) обнаруживаются и ассоциируются с битовыми значениями «0» или «1» соответственно.
  • Тепловой шум от резистора, усиленного для обеспечения случайного источника напряжения.
  • Лавинный шум, генерируемый лавинным диодом. (Насколько это круто?)
  • Атмосферный шум, обнаруженный радиоприемником, подключенным к ПК

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

8 голосов
/ 19 ноября 2008

SGI однажды использовала фотографии лавовой лампы в различных «сферических фазах» в качестве источника энтропии, которая в конечном итоге превратилась в генератор случайных чисел с открытым исходным кодом под названием LavaRnd .

5 голосов
/ 19 ноября 2008

Я использую Random.ORG , они предоставляют бесплатные случайные данные из атмосферного шума, которые я использую для периодического повторного посева RNG Мерсена-Твистера. Это почти так же случайно, как вы можете получить без аппаратных зависимостей.

4 голосов
/ 19 ноября 2008

Не беспокойтесь о «хорошем» семени для генератора случайных чисел. Статистические свойства последовательности не зависят от того, как посеян генератор. Однако есть и другие вещи. беспокоиться о. См. Подводные камни при генерации случайных чисел .

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

3 голосов
/ 19 ноября 2008

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

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

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

3 голосов
/ 19 ноября 2008

Ядро Linux использует время прерывания устройства (мышь, клавиатура, жесткие диски) для генерации энтропии. Есть хорошая статья в Википедии об энтропии.

2 голосов
/ 19 ноября 2008

Некоторые «микросхемы» TPM (Trusted Platform Module) имеют аппаратный RNG. К сожалению, TPM (Broadcom) в моем ноутбуке Dell не имеет этой функции, но многие компьютеры, продаваемые сегодня, поставляются с аппаратным RNG, который использует действительно непредсказуемые квантово-механические процессы. Intel внедрила разнообразие тепловых шумов.

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

A аналогичный вопрос может быть полезным для вас.

2 голосов
/ 19 ноября 2008

Я нашел HotBits несколько лет назад - числа генерируются в результате радиоактивного распада, действительно случайных чисел.

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

2 голосов
/ 19 ноября 2008

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

1 голос
/ 18 апреля 2012

Извините, я опоздал на эту дискуссию (сколько ей сейчас 3 с половиной года?), Но у меня вновь возник интерес к генерации PRN и альтернативным источникам энтропии. Разработчик ядра Linux Расти Рассел недавно обсуждал в своем блоге альтернативные источники энтропии (кроме /dev/urandom).

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

Я баловался с Mersenne Twister (на моем компьютере с Linux), который был засеян по следующему алгоритму. Я прошу любые комментарии / отзывы, если кто-то хочет и заинтересован:

  1. Создать буфер массива из 64 бит + 256 бит * число файлов /proc ниже.
  2. Поместить значение счетчика меток времени (TSC) в первые 64 бита этого буфера.
  3. Для каждого из следующих файлов /proc рассчитайте сумму SHA256:

    • /proc/meminfo
    • /proc/self/maps
    • /proc/self/smaps
    • /proc/interrupts
    • /proc/diskstats
    • /proc/self/stat

      Поместите каждое 256-битное значение хеш-функции в собственную область массива, созданного в (1).

  4. Создайте хэш SHA256 для всего этого буфера. ПРИМЕЧАНИЕ: Я мог (и, вероятно, должен) использовать другую хеш-функцию, полностью независимую от SHA-функций - этот метод был предложен в качестве «защиты» от слабых хеш-функций.

Теперь у меня есть 256 бит НАДЕЖДА случайных (достаточно) энтропийных данных, чтобы заполнить мой тварь Мерсенна. Я использую вышеупомянутое, чтобы заполнить начало массива MT (624 32-разрядных целых числа), а затем инициализировать остаток этого массива с кодом автора MT. Кроме того, я мог бы использовать другую хеш-функцию (например, SHA384, SHA512), но мне понадобился бы буфер массива другого размера (очевидно).

Оригинальный код Mersenne Twister требовал одного 32-битного начального числа, но я чувствую, что это ужасно неадекватно. Запуск «просто» 2 ^ 32-1 разных МТ в поисках взлома криптографии не выходит за рамки практической возможности в наше время.

Я бы с удовольствием прочитал чей-либо отзыв об этом. Критика приветствуется. Я буду защищать свое использование файлов /proc, как указано выше, потому что они постоянно меняются (особенно файлы /proc/self/*, а TSC всегда выдает другое значение (разрешение наносекунды [или лучше], IIRC). Diehard тестирует на этом (к мелодии в несколько сотен миллиардов битов), и кажется, что это проходит с летающими цветами. Но это, вероятно, больше свидетельствует о надежности Mersenne Twister как ГНЕЗД, чем то, как я его сею.

Конечно, они не полностью невосприимчивы к тому, что кто-то их взламывает, но я просто не вижу, чтобы все они (и SHA *) были взломаны и взломаны моя жизнь.

...