/dev/random
В комментариях мне вопрос задали — откуда в компьютере взяться случайным числам. Казалось бы — там же всё детерминированно. С одной стороны — да, с другой стороны…
Помню, в «Спектруме» (это компьютер, на котором я работал больше всего в детстве), в Бейсике, был оператор RANDOMIZE — инициализация генератора случайных чисел. Если вызвать его
bolk@Bolk /$ php -r 'mt_srand(1); echo mt_rand();'
1244335972
bolk@Bolk /$ php -r 'mt_srand(1); echo mt_rand();'
1244335972Если же вызывать RANDOMIZE без параметров, то его значение инициализируется текущим временем. Это уже лучше, потому что в данном случае элемент случайности вносит сам пользователь — как просчитать когда он запустит программу? Какое будет время на часах? На «Спектруме» отследить запуск программы не получится, а без этого нельзя ответить на вопрос какое значение выдаст генератор случайных чисел.
Но на компьютерах посложнее, например, на том, с которого вы сейчас это читаете, отследить запуск проще простого, посмотреть в этот момент на часы — ещё проще. Что делать? Значит надо собирать больше «шумов» окружающего мира.
Какие «шумы» может собирать компьютер вокруг себя?
Как уже было сказано, сильную сумятицу в стройность машинной логики вносит пользователь, грех не пользоваться: нажатия клавиш, движения мышкой, запуск программ, управление ими. Ещё можно, например, снимать значения с загрузки процессора, со списка процессов, занимаемой процессами память и расходуемого время (при условии, что на машине работает сейчас пользователь), вполне источник случайных данных. Ведь эти значения зависят от действий пользователя.
Что делать, когда пользователь пошёл налить себе кофе? Вполне можно использовать шумы внешнего мира. Шумы в прямом смысле, с микрофона послушать что там снаружи происходит — окружающие звуки или просто шумы аудиотракта в отсутствие микрофона. Можно глянуть, что там бегает по сети — широковещательную активность других пользователей. Что ещё? Мало ли у компьютера датчиков? Например, можно смотреть что у нас там на с температурой на процессоре, которая зависит и от температуры в комнате, и от собственных шумов схемотехники датчиков.
Вот как выглядят показания температурных датчиков на моём ноуте, снимаемые каждую секунду:

Если присмотреться внимательно, можно увидеть колебания в градус, не очень много, но температурных датчиков у меня 13 штук.
Если время от времени снимать этот цифровой хаос, скапливать
Под занавес, наверное нужно прояснить — для чего нужны такие «суперслучайные» числа. Ну, казалось бы, инициализируем временем и все дела, для чего использовать
Ведь сертификаты для защиты генерируются вполне определённым образом на основании случайных чисел. Стоит ввести в тот же алгоритм те же числа и получим тот же сертификат.
Комментарии 26
В андроиде, когда кончаются случайные числа, начинаются лаги. Случайные числа используются там для прорисовки элементов интерфейса. На XDA есть приложение, которое вместо случайных чисел подставляет псевдослучайные, устраняя тем самым задержки интерфейса.
По моим собственным наблюдениям сильно ничего не изменилось. Лаги изредка появляются.
Более того, Интел это извращение вставлял одно время как стандартную функцию чипсета. Потом вроде, отказались.
Однако Интел не отказывается, и вряд ли в этой вселенной откажется когда либо -- http://spectrum.ieee.org/computing/hardwar … enerator/0
Но я видел продающиеся генераторы аппаратного шума. Для меня это все несколько не укладывается в картину «не отказывается и вряд ли откажется»
У вас есть ссылки на библиотеки и даташиты?
Комментарий для Евгения Степанищева:
Ох. А зачем для прорисовки интерефейса нужны (высокоэнтропийные) случайные числа?..
Поговаривают, что работа этой проги в фоне просто держит процессор на максимальной частоте, вот и лагов меньше.
P.S.
Комментарий для kalvado.livejournal.com:
Хорошее начало для песни:-D
Да, практически ранний «Аквариум»
Я бы в таком случае назвал извращенцами тех, кто не использует,
Комментарий для Сергей:
Считая что шумогенераторы появились в 440 чипсетах дляП-2… Движнья нет,сказал я-не брадатый!
(раз уж начал говорить стихами, да)
А вот rand (что в PHP, что в C/C++) лучше не использовать вообще. Никогда.
Комментарий для kalvado.livejournal.com:
Всё проще. RDRAND использовали (и Linux, и FreeBSD), но отказалисьиз-за заложенного Интелом (и VIA) бэкдора.
Там суть в том, что Intel заявил, что RDRAND соответствует Dual_EC_DRBG — ГСЧ с бэкдором NSA. Потом, Intel, конечно, начал говорить, что не соответствует всё же, но осадочек остался.
А, и из существующих библиотек RDRAND используется в OpenSSL (не по дефолту).