13.5. “Подводные камни” использования RSA
257
assert
2048
≤
k
≤
8192
Сгенерируем простые числа.
p
←
GenerateRSAPrime
(
b
k/
2
c
)
q
←
GenerateRSAPrime
(
b
k/
2
c
)
Небольшая проверка на случай, если генератор испорчен. . .
assert
p
6
=
q
Вычислим
t
как НОК
(
p
−
1
, q
−
1)
.
t
←
(
p
−
1)(
q
−
1)
/
GCD
(
p
−
1
, q
−
1)
Вычислим секретные показатели степеней. Для этого найдем обрат-
ное число по модулю с помощью расширенного алгоритма Евклида.
g,
(
u, v
)
←
ExtendedGCD
(3
, t
)
Проверим правильность НОД. В противном случае обратного числа не
существует.
assert
g
= 1
Возьмем
u
по модулю
t
, потому что
u
может быть отрицательным,
а
d
3
должно быть положительным.
d
3
←
u
mod
t
Повторим описанные выше действия для
d
5
.
g,
(
u, v
)
←
ExtendedGCD
(5
, t
)
assert
g
= 1
d
5
←
u
mod
t
return
p,
q
, pq, d
3
, d
5
Обратите внимание, что в качестве открытых показателей степеней при-
меняются фиксированные значения и что мы сгенерировали ключ, который
может применяться как для подписывания (
e
= 3)
, так и для шифрования
(
e
= 5)
.
13.5
“Подводные камни” использования RSA
Использовать алгоритм RSA описанным выше
способом очень опасно.
Проблема заключается в том, что RSA имеет четкую математическую струк-
туру. Например, если пользователь А подпишет цифровой подписью два со-
общения —
m
1
и
m
2
, пользователь Б сможет вычислить, какой должна быть
подпись пользователя А для сообщения
m
3
:=
m
1
m
2
mod
n
. Действительно,
подписывая сообщения, пользователь А вычислил значения
m
1
/e
1
и
m
1
/e
2
, а
пользователь Б может перемножить эти значения, чтобы получить
(
m
1
m
2
)
1
/e
.
Еще одна
проблема возникает тогда, когда пользователь Б зашифровыва-
ет с помощью открытого ключа пользователя А сообщение небольшого раз-
мера. Если
e
= 5
и
m <
5
√
n
, тогда
m
e
=
m
5
< n
, поэтому взятия числа по