16.2. Быстрое умножение
309
фикации подписи. Последний выполняется относительно быстро и с большой
долей вероятности позволяет перехватить арифметические ошибки. Каждая
процедура вычисления подписи RSA должна верифицировать результат, про-
веряя только что сгенерированную подпись. Исключений из этого прави-
ла нет.
16.1.5
Заключение
Попытаемся немного прояснить ситуацию. Проверки, о которых шла речь
в предыдущих разделах, должны выполняться
в дополнение
к обычному те-
стированию библиотек арифметических операций над большими числами.
Они ни в коей мере не заменяют обычного тестирования, которому должен
подвергнуться любой элемент программного обеспечения, особенно если речь
идет о системе обеспечения безопасности.
Если хотя бы одна из перечисленных выше проверок окончится неудачей,
это означает, что программное обеспечение содержит ошибку. Возможных
вариантов действия здесь немного. Продолжать работу небезопасно; мы ведь
не знаем, что именно привело к возникновению ошибки. Пожалуй, единствен-
ное, что стоит сделать в подобной ситуации, — это записать ошибку в журнал
и аварийно завершить работу программы.
16.2
Быстрое умножение
Существует множество
способов ускорить умножение по модулю таким
образом, чтобы системе не приходилось выполнять полное умножение и по-
следующее деление “в столбик”. В протоколах с большим количеством умно-
жений широко используется
метод Монтгомери [67]. К сожалению, статья
самого Монтгомери слишком трудна для понимания. Более понятное описа-
ние этого
метода содержится в [25].
В основе
метода Монтгомери лежит способ вычисления
(
x
mod
n
)
, где
число
x
намного больше
n
. Классический
метод деления “в столбик” подра-
зумевает вычитание из числа
x
подходящих чисел, кратных
n
. Идея Монтго-
мери гораздо проще: многократное деление
x
на 2. Если число
x
четное, мы
делим
x
на 2, сдвигая его двоичное представление на один бит вправо. Если
же
x
нечетное, мы вначале прибавляем к нему
n
(что, разумеется, не изме-
няет значения
x
по модулю
n
), а затем делим полученный четный результат
на 2. (Данный
метод работает только для нечетных
n
. Напомним, что в на-
ших системах всегда применяются нечетные
n
. Впрочем, данный
метод легко
обобщить и на четные значения
n
.) Если длина
n
равна
k
бит, а значение
x
не превышает
(
n
−
1)
2
, мы выполним
k
делений на 2. Полученный резуль-