Глава 10. Генерация случайных чисел
разберется с другими источниками, события которых имеют больший размер.
Большинству реализаций понадобится также сериализовать вызовы функции
AddRandomEvent
с помощью мьютекса (mutex object), чтобы гарантиро-
вать, что в один и тот же момент времени к аккумулятору будет добавлено
только одно событие
5
.
У некоторых источников энтропии может совсем не оказаться времени на
вызов функции
AddRandomEvent
. В этом случае события можно сохра-
нять в буфере и реализовать отдельный процесс, который будет извлекать
события из буфера и передавать их аккумулятору.
В качестве альтернативной архитектуры можно предложить, чтобы ис-
точники энтропии просто передавали события процессу аккумулятора, а все
вычисления хэш-кодов выполнялись отдельным потоком аккумулятора. Эта
структура более сложна, но имеет значительные преимущества для источни-
ков энтропии. Выбор той или иной архитектуры во многом зависит от кон-
кретной ситуации.
10.6
Управление файлом начального числа
Наш ГПСЧ умеет собирать энтропию и генерировать случайные данные
после первого обновления случайного числа. Тем не менее, если мы перезагру-
зим компьютер, придется подождать, пока источники энтропии сгенерируют
достаточно случайных событий для выполнения первого обновления. Кроме
того, у нас нет гарантий, что состояние генератора после первого обновления
не будет предсказуемым для злоумышленника.
Для решения этой проблемы можно использовать файл начального числа.
Он представляет собой отдельный файл, содержащий достаточное количество
энтропии и не доступный никому, кроме ГПСЧ. После перезагрузки компью-
тера ГПСЧ считывает файл начального числа и использует его содержимое
в качестве энтропии для перевода генератора в состояние, не предсказуемое
для злоумышленника. Конечно же, сразу после этого содержимое файла на-
чального числа должно быть заменено новыми данными.
В следующих разделах главы описывается управление файлом началь-
ного числа. Вначале будем исходить из предположения, что операционная
система поддерживает атомарные операции, а затем обсудим проблемы, свя-
занные с управлением файлом начального числа в реальных системах.
5
В многопоточном окружении необходимо всегда тщательно следить за тем, чтобы раз-
ные потоки не пересекались друг с другом.
10.6. Управление файлом начального числа
201
10.6.1
Запись в файл начального числа
Вначале необходимо сгенерировать файл начального числа. Это делается
с помощью простой функции.
функция
WriteSeedFile
вход:
R
Состояние ГПСЧ; изменяется этой функцией.
f
Файл, в который нужно записать энтропию.
write
(
f,
RandomData
(
R,
64))
Эта функция просто генерирует 64 байт случайных данных и записывает
их в файл. Вообще-то нам никогда не понадобится так много данных, но
экономить здесь совершенно нет смысла.
10.6.2
Обновление файла начального числа
Очевидно, нам нужна функция и для считывания файла начального чис-
ла. По причинам, которые мы объясняли выше, после считывания файла
начального числа будет сразу же выполняться его обновление.
функция
UpdateSeedFile
вход:
R
Состояние ГПСЧ; изменяется этой функцией.
f
Файл, который нужно обновить.
s
←
read
(
f
)
assert
length
(
s
) = 64
Reseed
(
G
, s
)
write
(
f,
RandomData
(
R
,
64))
Эта функция считывает файл начального числа, проверяет его длину
и выполняет обновление состояния генератора. Затем содержимое файла на-
чального числа заменяется новыми случайными данными.
Функция
UpdateSeedFile
должна следить за тем, чтобы никто не смог
использовать ГПСЧ в промежутке между обновлением состояния генерато-
ра и записью в файл начального числа новых данных. Проблема состоит
в том, что после перезагрузки компьютера файл начального числа считыва-
ется функцией
UpdateSeedFile
, которая применяет содержимое файла для
обновления состояния генератора. Предположим, злоумышленник запраши-
вает у генератора случайные данные до того, как функция
UpdateSeedFile
успеет перезаписать файл начального числа. Получив от генератора затребо-
ванные случайные данные, злоумышленник тут же перезагружает компью-
тер, так и не дав функции
UpdateSeedFile
перезаписать файл. В резуль-
тате при следующей перезагрузке компьютера функция считает из файла
начального числа те же самые данные, что и в прошлый раз, и обновит с их
202
Достарыңызбен бөлісу: |