/dev/random

В комментариях мне вопрос задали — откуда в компьютере взяться случайным числам. Казалось бы — там же всё детерминированно. С одной стороны — да, с другой стороны…

Помню, в «Спектруме» (это компьютер, на котором я работал больше всего в детстве), в Бейсике, был оператор RANDOMIZE — инициализация генератора случайных чисел. Если вызвать его с каким-то фиксированным параметром, то генератор (его значения выдавала функция RND) возвращал всегда одну и ту же цепочку чисел. Так у многих языков устроено:

bolk@Bolk /$ php -r 'mt_srand(1); echo mt_rand();'
1244335972
bolk@Bolk /$ php -r 'mt_srand(1); echo mt_rand();'
1244335972

Если же вызывать RANDOMIZE без параметров, то его значение инициализируется текущим временем. Это уже лучше, потому что в данном случае элемент случайности вносит сам пользователь — как просчитать когда он запустит программу? Какое будет время на часах? На «Спектруме» отследить запуск программы не получится, а без этого нельзя ответить на вопрос какое значение выдаст генератор случайных чисел.

Но на компьютерах посложнее, например, на том, с которого вы сейчас это читаете, отследить запуск проще простого, посмотреть в этот момент на часы — ещё проще. Что делать? Значит надо собирать больше «шумов» окружающего мира.

Какие «шумы» может собирать компьютер вокруг себя?

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

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

Вот как выглядят показания температурных датчиков на моём ноуте, снимаемые каждую секунду:

Температурные датчики на «Маке» (12.60КиБ)

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

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

В юникс-подобных системах есть специальный файл, лежащий в каталоге «/dev» — «random», обращение к нему как раз возвращает данные из этого буфера. А что будет, если данные в буфере кончаются? Посмотреть мне сейчас негде, я в машине, в пробке это всё пишу, а мобильный интернет какой-то медленный сегодня, но насколько я помню, процесс, читающий из «/dev/random» будет просто ждать появления данных. На случай, если вам ждать не хочется, есть другое устройство — «/dev/urandom», которое будет отдавать менее случайные числа, если кончились случайные, такой вот недостаток.

Под занавес, наверное нужно прояснить — для чего нужны такие «суперслучайные» числа. Ну, казалось бы, инициализируем временем и все дела, для чего использовать какие-то датчики, устраивать весь этот джаз? Нужно это всё для криптографии. Если случайные числа на вашем компьютере можно будет предугадывать, то можно будет просматривать и вносить изменения в зашифрованное соединение с сайтом вашего банка, вашей почты и так далее. Потеряют надёжность сгенерированные вами сертификаты и тому подобное.

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

26 комментариев

Интернетизация Татарстана

Слушаю прямой эфир c Коллегии Мининформсвязи РТ по итогам 2012г. и задачам на 2013г. Интересную цифру услышал: 2,6 миллиона человек в нашей республике имеют доступ к интернету. При этом население у нас 3,8 миллиона. Это неплохой показатель, мне кажется.

8 комментариев