Перейти к содержанию

Атака Винера

Материал из Мегавики — свободной энциклопедии

Атака Винера, названная в честь криптолога Майкла Дж. Винера, является типом криптографической атаки против алгоритма RSA. Атака использует метод непрерывной дроби, чтобы взломать систему при малом значении закрытой экспоненты d.

Кратко о RSA[править]

Прежде чем начать описание того, как работает атака Винера, стоит ввести некоторые понятия, которые используются в RSA[1]. Более подробную информацию см. в основной статье о RSA.

Для шифрования сообщений по схеме RSA используется открытый ключ - пара чисел (e,N), для расшифрования - закрытый ключ (d,N). Числа e,d называются открытой и закрытой экспонентой соответственно, число N - модулем. Mодуль N=pq, где p и q - два простых числа. Связь между закрытой, открытой экспонентой и модулем задаётся, как ed=1modφ(N), где φ(N)=(p1)(q1) функция Эйлера.

Если по открытому ключу (e,N) за короткое время можно восстановить d, то ключ уязвим: получив информацию о закрытом ключе (d,N), у злоумышленников появляется возможность расшифровать сообщение.

История алгоритма[править]

Криптосистема RSA был изобретена Рональдом Ривестом, Ади Шамир и Леонардом Адлеманом и впервые опубликован в 1977 году[1]. С момента публикации статьи криптосистема RSA была исследована на уязвимости многими исследователями.[2] Большая часть таких атак используют потенциально опасные реализации алгоритма и пользуются явными условиями на какой-либо недочёт в алгоритме: общий модуль, малый открытый ключ, малый закрытый ключ[3]. Так алгоритм атаки крипотографической атаки на алгоритм RSA с малым закрытым ключом был предложен криптологом Майклом Дж. Винером в статье, впервые опубликованной в 1990 году.[4] Теорема Винера утверждает о том, что если выполняется условие малости ключа, то закрытый ключ может быть найден за линейное время.

Малый закрытый ключ[править]

В криптосистеме RSA Боб может использовать меньшее значение d, а не большое случайное число, чтобы улучшить производительность расшифровки RSA. Однако атака Винера показывает, что выбор небольшого значения для d приведет к небезопасному шифрованию, в котором злоумышленник может восстановить всю секретную информацию, то есть взломать систему RSA. Этот взлом основан на теореме Винера, которая справедлива при малых значениях d. Винер доказал, что злоумышленник может эффективно найти d, когда d<13N14.

Винер также представил некоторые контрмеры против его атаки. Два метода описаны ниже:[5]

1. Выбор большого открытого ключа :

Заменить e на e, где e=e+kφ(N) для некоторого большого k. Когда e достаточно велик, то есть e>N32, то атака Винера неприменима независимо от того, насколько мал d.

2. Используя китайскую теорему об остатках:

Выбрать d так, чтобы и dp=dmod(p1), и dq=dmod(q1) были малы, но сам d нет, то быстрое дешифрование сообщения C может быть выполнено следующим образом:
  1. Сначала вычисляется Mp=Cdpmodp и Mq=Cdqmodq
  2. Используя китайскую теорему об остатках, чтобы вычислить уникальное значение MZ, которое удовлетворяет M=Mpmodp и M=Mqmodq. Результат Mудовлетворяет M=CdmodN как и требовалось. Дело в том, что атака Винера здесь неприменима, потому что значение dmodφ(N) может быть большим.

Встречается также вариант написания: RSA#Использование китайской теоремы об остатках для ускорения расшифрования.

Как работает атака Винера[править]

Поскольку

ed=1(modlcm(p1,q1))),

то существует целое K такое, что:

ed=K×lcm(p1,q1)+1.

Стоит определить G=gcd(p1,q1) и подставить в предыдущее уравнение:

ed=KG(p1)(q1)+1.

Если обозначить k=Kgcd(K,G) и g=Ggcd(K,G), то подстановка в предыдущее уравнение даст:

ed=kg(p1)(q1)+1.

Разделив обе части уравнения на dpq, выходит что:

epq=kdg(1δ), где δ=p+q1gkpq.

В итоге, epq немного меньше, чем kdg, причём первая дробь состоит целиком из публичной информации. Тем не менее, метод проверки такого предположения всё ещё необходим. Принимая во внимание, что ed>pq последнее уравнение может быть записано как:

edg=k(p1)(q1)+g.

Используя простые алгебраические операции и тождества, можно установить точность такого предположения.[6]

Теорема Винера[править]

Пусть N=pq, где q<p<2q. Пусть d<13N14.

Имея N,e, где ed=1modφ(N), взломщик может восстановить d.[7]

Доказательство теоремы Винера[править]

Доказательство построено на приближениях с использованием непрерывных дробей.[8]

Поскольку ed=1modφ(N), то существует k при котором edkφ(N)=1. Следовательно:

|eφ(N)kd|=1dφ(N).

Значит, kd - это приближение eφ(N). Несмотря на то что взломщик не знает φ(N), он может использовать N чтобы его приблизить. Действительно, поскольку:

φ(N)=Npq+1 and p+q1<3N, мы имеем: |p+q1|<3N и |N+1φ(N)1|<3N

Используя N вместо φ(N), получим:

|eNkd|=|edknNd|=|edkφ(N)kN+kφ(N)Nd|
=|1k(Nφ(N))Nd||3kNNd|=3kNNNd=3kdN

Теперь, kφ(N)=ed1<ed, значит kφ(N)<ed. Поскольку e<φ(N), значит kφ(N)<ed<φ(N)d, и в итоге получается:

kφ(N)<φ(N)d
где k<d

Так как k<d и d<13N14, следовательно:

(1)|eNkd|<1dN14

Поскольку d<13N14,2d<3d, то 2d<3d<N14, и исходя из этого 2d<N14, значит:

(2)12d>1N14

Из (1) и (2), можно заключить, что:

|eNkd|<3kdN<1d2d=12d2

Смысл теоремы заключается в том, что если условие выше удовлетворено, то kd появляется среди подходящих дробей для непрерывной дроби числа eN.

Следовательно, алгоритм в итоге найдёт такое kd[9].

Описание алгоритма[править]

Рассматривается открытый RSA ключ (e,N), по которому необходимо определить закрытую экспоненту d. Если известно, что d<13N14, то это возможно сделать по следующему алгоритму [10]:

1. Разложить дробь eN в непрерывную дробь [a1,a2...].
2. Для непрерывной дроби [a1,a2...] найти множество всех возможных подходящих дробей kndn.
3. Исследовать подходящую дробь kndn:
3.1. Определить возможное значение φ(N), вычислив fn=edn1kn.
3.2. Решив уравнение x2((Nfn)+1)x+N=0, получить пару корней (pn,qn).
4. Если для пары корней (pn,qn) выполняется равенство N=pnqn, то закрытая экспонента найдена d=dn.
Если условие не выполняется или не удалось найти пару корней (pn,qn), то необходимо исследовать следующую подходящую дробь kn+1dn+1, вернувшись к шагу 3.

Пример работы алгоритма[править]

Два данных примера [10] наглядно демонстрируют нахождение закрытой экспоненты d, если известен открытый ключ RSA (e,N).

Для открытого ключа RSA (e,N)=(1073780833,1220275921):

Таблица: нахождение закрытой экспоненты d
e/N = [0, 1, 7, 3, 31, 5, 2, 12, 1, 28, 13, 2, 1, 2, 3]
n kn / dn phin pn qn pn qn
0 0/1 - - - -
1 1/1 1073780832 - - -
2 7/8 1227178094 - - -
3 22/25 1220205492 30763 39667 1220275921

Получается, что d=25. В этом примере можно заметить, что условие малости выполняется d<13N1462.30074....

Для открытого ключа RSA (e,N)=(1779399043,2796304957):

Таблица: нахождение закрытой экспоненты d
e/N = [0, 1, 1, 1, 2, 1, 340, 2, 1, 1, 3, 2, 3, 1, 21, 188]
n kn / dn fn pn qn pn qn
0 0/1 - - - -
1 1/1 1779399042 - - -
2 1/2 3558798085 - - -
3 2/3 2669098564 - - -
4 5/8 2847038468 - - -
5 7/11 2796198496 47129 59333 2796304957

Получается, что d=11. В этом примере так же можно заметить, что условие малости выполняется d<13N1476.65224....

Сложность алгоритма[править]

Сложность алгоритма определяется количеством подходящих дробей для непрерывной дроби числа eN, что есть величина порядка O(log(n)). То есть число d восстанавливается за линейное время[11] от длины ключа.

Ссылки[править]

  1. 1,0 1,1 Rivest, 1978.
  2. Boneh, 1999, Introduction, p. 1.
  3. Coppersmith, 1996.
  4. Wiener, 1990.
  5. Wiener, 1990, Combatting the Continued Fraction Attack on RSA., p. 557.
  6. Render, 2007.
  7. Boneh, 1999.
  8. Khaled, 2006.
  9. Герман, 2012, Об уязвимости системы RSA. Малый секретный ключ., pp. 283-284.
  10. 10,0 10,1 Kedmi, 2016.
  11. Герман, 2012, Об уязвимости системы RSA. Малый секретный ключ., p. 284: «Количество же этих дробей есть величина порядка O(ln(n)), то есть число d восстанавливается за линейное время».

Литература[править]