В. Р. Гинзбург Перевод с английского



Pdf көрінісі
бет96/203
Дата26.09.2024
өлшемі2,74 Mb.
#145829
1   ...   92   93   94   95   96   97   98   99   ...   203
Байланысты:
практическая криптография


Глава 10. Генерация случайных чисел
пользователей случайных данных. И это вполне справедливо — ведь случай-
ные данные нужны именно пользователям, которые ради такой цели могут
и подождать. В конце концов, большинство генераторов событий ничего не
выигрывают от производства случайных данных, в котором участвуют.
Чтобы обновление начального числа выполнялось непосредственно перед
обработкой запроса на получение случайных данных, необходимо инкапсули-
ровать генератор. Другими словами, генератор будет скрыт, чтобы его нельзя
было вызвать напрямую. Для этого в аккумулятор будет включена функция
RandomData
с таким же интерфейсом, как и у
PseudoRandomData
. Это
защитит систему от пользователей, пытающихся вызвать генератор напря-
мую и тем самым пропустить процесс обновления, над реализацией которого
мы так долго трудились. Разумеется, пользователи все еще могут создавать
собственные экземпляры генератора для каких-то своих целей.
Типичная функция хэширования наподобие SHA
d
-256 обрабатывает вхо-
дящие сообщения, разбивая их на блоки фиксированного размера. Если мы
будем обрабатывать строку пула по мере накопления в буфере каждого сле-
дующего блока, обработка события ограничится не более чем хэшировани-
ем одного блока. К сожалению, данный подход имеет свои недостатки. Для
повышения эффективности работы процессоров в современных компьюте-
рах применяется система кэшей. Одна из особенностей кэширования состоит
в том, что скорость работы процессора повышается, когда он на протяжении
некоторого времени работает с одними и теми же данными. Если обрабаты-
вать блоки случайных данных по одному, процессору придется каждый раз
извлекать из памяти предыдущий промежуточный хэш-код строки и переме-
щать его в наиболее быстрый кэш. Если же обрабатывать несколько блоков
сразу, перемещение хэш-кода в наиболее быстрый кэш будет выполняться
только для первого блока строки. Остальные блоки будут обрабатываться
намного быстрее из-за того, что хэш-код уже находится в кэше процессора.
В целом производительность современных процессоров значительно повыша-
ется, если процессор работает в рамках небольшого цикла, а не тогда, когда
он вынужден постоянно переключаться между различными частями кода.
Учитывая сказанное выше, для повышения эффективности работы можно
увеличить размер буфера пула. В этом случае перед применением операции
хэширования в буфере будет накапливаться больше данных. Это позволит
сократить общее количество необходимого процессорного времени, но вме-
сте с тем увеличит максимальное время добавления нового события к пулу.
К сожалению, мы не можем предложить вам какого-либо разумного компро-
мисса для решения этой проблемы. Все зависит от специфики конкретного
окружения.


10.5. Аккумулятор
197
10.5.4
Инициализация
Процедура инициализации, как всегда, очень проста. До сих пор речь
шла только о генераторе и аккумуляторе, но функции, которые мы собира-
емся определять ниже, являются частью внешнего интерфейса всего ГПСЧ
Fortuna. Слово
PRNG
в именах этих функций означает, что они применимы ко
всему проекту в целом.
функция
InitializePRNG
выход:
R
Состояние ГПСЧ
Поместим в каждый из 32 пулов пустую строку.
for
i
= 0
, . . . ,
31
do
P
i

²
od
Установим значение счетчика обновлений равным 0.
ReseedCNT

0
Затем инициализируем генератор.
G ←
InitializeGenerator()
Упакуем состояние.
R ←
(
G
,
ReseedCNT
, P
0
, . . . , P
31
)
return
R
10.5.5
Получение случайных данных
Как уже отмечалось, функция
RandomData
представляет собой оболоч-
ку для компонента-генератора. Структура этой функции будет не слишком
простой, так как последняя должна обрабатывать обновление начального
числа генератора.
функция
RandomData
вход:
R
Состояние ГПСЧ; изменяется этой функцией.
n
Количество байт случайных данных, которое необходимо
сгенерировать.
выход:
r
Псевдослучайная строка байтов.
if
length
(
P
0
)

MinPoolSize

последнее обновление
>
100
мс назад
then
Нам нужно выполнить обновление.
ReseedCNT

ReseedCNT
+ 1
Объединим в одну строку хэш-коды всех пулов, которые следует
использовать в этой операции обновления.
s

²


198

Достарыңызбен бөлісу:
1   ...   92   93   94   95   96   97   98   99   ...   203




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет