При проверке ЭЦП необходимо вычислить величину v = (h(M1))q-2 (mod q). Это можно сделать, по крайней мере, двумя способами:

возведением в степень и вычислением обратного с помощью расширенного алгоритма Евклида. Действительно, в теории чисел известна малая теорема Ферма, которая ут­верждает, что если р — простое число, а — целое число, не делящееся на р, то ар-1 ≡ 1 (mod p).

Отсюда следует, что

ар-2 ≡ a-1 (mod p).

При этом а-1 есть такое целое число, что aЧa-1 ≡ 1(mod p). Это число называ­ется мультипликативным обратным а по модулю р.

С другой стороны, поскольку а и р взаимно простые, то существуют такие целые числа х и у, что ах+ру = 1. Если перейти к сравнениям mod p, то мы получим  ах ≡ 1 (mod p).

Откуда

х ≡ a-1 (mod p)

и значит

х ≡ ар-2 (mod p).

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

Алгоритм 1.19. Расширенный алгоритм Евклида, вычисления d = НОД(а,b) и х и у, что ax + by = d

1.       если b = 0, то d := а; х := 1; у := 0;

2.       х2 := 1; х, := 0; у2 := 0; у1 := 1; а1:=а; b1:=b;

3.       пока b > 0 выполнить 4-5;

4.       q := |a1/b1|; r := а1 — qb1; х := х2 – qx1; у := у2 – qy1;

5.       a1:= b,; b1:= г; х2 := x1; x1 := х; у2 := y1; y1 := у;

6.       d:= a1;x:=x2;y :=у2;

7.       конец.

Программную реализацию функции вычисления мультипликативного об­ратного с использованием расширенного алгоритма Евклида оставим в качестве упражнения. Скажем только, что с его помощью можно достичь довольно немалого ус­корения. Остался небольшой «грешок» при реализации операции Монтгомери. Была обещана функция, вычисляющая параметр z = -Р0-1 (mod b). Малая теоре­ма Ферма нам не подходит, поскольку модуль в данном случае не простой (на­помним, b = 2m). Но можно воспользоваться ее обобщением, теоремой Эйлера:

если а и с — взаимно простые целые числа, то

аф(с) = 1 (mod с).

(ф — функция Эйлера).

Таким образом, аф(с)-1 = a-1 (mod с).

В данном случае модулем является число b =2m. Поэтому ф(b) = 2m-1 и ф(b)-1 = 2m-1-1 — число, двоичная запись которого состоит из m-1 единичного разря­да: 11…112. Воспользуемся би­нарным алгоритмом для вычисления значения a-1 mod b. Заметим при этом, что a-1 mod b существует только при а взаимно простом с числом и, т.е. при нечет­ном а.

Алгоритм 1.20. Алгоритм вычисления z = -a-1 (mod 2m)

1.       если а четно, то z=0; конец;

2.       d := a;

3.       повторить m-2 раза шаги 4-5;

4.       d := d2 (mod 2m):

5.       d := d Ч a (mod 2m);

6.    конец.

Здесь предполагаем, что m — длина машинного слова и приве­дение к модулю 2m выполняется при умножении автоматически. Если это не так, необходимо выполнить эту редукцию перед возвратом результата.