Русская Википедия:Атака Винера

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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

Кратко о RSA

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

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

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

История алгоритма

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

Малый закрытый ключ

В криптосистеме RSA Боб может использовать меньшее значение <math> d </math>, а не большое случайное число, чтобы улучшить производительность расшифровки RSA. Однако атака Винера показывает, что выбор небольшого значения для <math> d </math> приведет к небезопасному шифрованию, в котором злоумышленник может восстановить всю секретную информацию, то есть взломать систему RSA. Этот взлом основан на теореме Винера, которая справедлива при малых значениях <math> d </math>. Винер доказал, что злоумышленник может эффективно найти <math> d </math>, когда <math> d < \frac{1}{3}N^{\frac{1}{4}} </math>.

Винер также представил некоторые контрмеры против его атаки. Два метода описаны ниже:Шаблон:Sfn

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

Заменить <math> e </math> на <math> e' </math>, где <math> e' = e+k \cdot \varphi(N) </math> для некоторого большого <math> k </math>. Когда <math> e' </math> достаточно велик, то есть <math> e' > N^{ \frac{3}{2}} </math>, то атака Винера неприменима независимо от того, насколько мал <math> d </math>.

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

Выбрать <math> d </math> так, чтобы и <math> d_p = d \bmod (p-1) </math>, и <math> d_q = d \bmod (q-1) </math> были малы, но сам <math> d </math> нет, то быстрое дешифрование сообщения <math> C </math> может быть выполнено следующим образом:
  1. Сначала вычисляется <math> M_p = C^{d_p} \bmod p </math> и <math> M_q = C^{d_q} \bmod q </math>
  2. Используя китайскую теорему об остатках, чтобы вычислить уникальное значение <math> M \in \mathbb{Z_N} </math>, которое удовлетворяет <math> M = M_p \bmod p </math> и <math> M = M_q \bmod q </math>. Результат <math> M </math>удовлетворяет <math> M = C^{d} \bmod N </math> как и требовалось. Дело в том, что атака Винера здесь неприменима, потому что значение <math> d \bmod \varphi(N) </math> может быть большим.

Шаблон:См. также

Как работает атака Винера

Поскольку

<math> ed = 1 \pmod {\operatorname{lcm}(p-1, q-1))} </math>,

то существует целое <math> K </math> такое, что:

<math> ed = K \times \operatorname{lcm}(p-1, q-1) + 1 </math>.

Стоит определить <math> G = \gcd (p-1, q-1) </math> и подставить в предыдущее уравнение:

<math> ed = \frac {K}{G}(p-1)(q-1) + 1 </math>.

Если обозначить <math> k = \frac {K}{\gcd(K,G)} </math> и <math> g = \frac {G}{\gcd(K,G)} </math>, то подстановка в предыдущее уравнение даст:

<math> ed = \frac{k}{g}(p-1)(q-1) + 1 </math>.

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

<math> \frac{e}{pq} = \frac{k}{dg} (1 - \delta) </math>, где <math> \delta = \frac {p + q - 1 - \frac{g}{k}}{pq} </math>.

В итоге, <math> \frac {e}{pq} </math> немного меньше, чем <math> \frac {k}{dg} </math>, причём первая дробь состоит целиком из публичной информации. Тем не менее, метод проверки такого предположения всё ещё необходим. Принимая во внимание, что <math> ed > pq </math> последнее уравнение может быть записано как:

<math> edg = k(p-1)(q-1) + g </math>.

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

Теорема Винера

Пусть <math> N = pq </math>, где <math> q < p < 2q </math>. Пусть <math> d < \frac{1}{3} N^{\frac{1}{4}} </math>.

Имея <math> \left \langle N,e\right \rangle </math>, где <math> ed = 1 \bmod \varphi(N) </math>, взломщик может восстановить <math> d </math>.Шаблон:Sfn

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

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

Поскольку <math> ed = 1\bmod \varphi(N) </math>, то существует <math> \mathit {k} </math> при котором <math> ed - k \varphi(N) = 1 </math>. Следовательно:

<math> \left \vert \frac {e}{\varphi(N)}- \frac {k}{d} \right \vert = \frac{1}{d \varphi(N)} </math>.

Значит, <math> \frac {k}{d} </math> - это приближение <math> \frac{e}{\varphi(N)} </math>. Несмотря на то что взломщик не знает <math> \varphi(N) </math>, он может использовать <math> N </math> чтобы его приблизить. Действительно, поскольку:

<math> \varphi(N) = N - p - q + 1 </math> and <math> p + q - 1 < 3\sqrt{N} </math>, мы имеем: <math> \left \vert p+q-1 \right \vert < 3 \sqrt{N} </math> и <math> \left \vert N + 1 - \varphi(N) - 1 \right \vert < 3\sqrt{N} </math>

Используя <math> N </math> вместо <math> \varphi(N) </math>, получим:

<math> \left \vert \frac{e}{N}- \frac{k}{d} \right \vert = \left \vert \frac {ed - kn}{Nd} \right \vert = \left \vert \frac{ed-k \varphi(N)-kN+k \varphi(N)}{Nd} \right \vert </math>
<math> = \left \vert \frac{1-k(N- \varphi(N))}{Nd} \right \vert \le \left \vert \frac{3k \sqrt{N}}{Nd} \right \vert = \frac {3k \sqrt{N}}{\sqrt{N} \sqrt{N}d} = \frac {3k}{d \sqrt{N}} </math>

Теперь, <math> k\varphi(N) = ed - 1 < ed </math>, значит <math> k\varphi(N) < ed </math>. Поскольку <math> e < \varphi(N) </math>, значит <math> k \varphi(N)< ed < \varphi(N)d </math>, и в итоге получается:

<math> k\varphi(N) < \varphi(N)d </math>
где <math> k < d </math>

Так как <math> k < d </math> и <math> d < \frac{1}{3}N^{\frac{1}{4}} </math>, следовательно:

<math> (1) \left \vert \frac{e}{N} - \frac{k}{d} \right \vert < \frac{1}{dN^{\frac{1}{4}}} </math>

Поскольку <math> d < \frac{1}{3}N^{\frac{1}{4}}, 2d < 3d </math>, то <math> 2d < 3d < N^{\frac{1}{4}} </math>, и исходя из этого <math> 2d < N^{\frac{1}{4}} </math>, значит:

<math> (2) \frac{1}{2d} > \frac{1}{N^{\frac{1}{4}}} </math>

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

<math> \left \vert \frac{e}{N} - \frac{k}{d} \right \vert < \frac{3k}{d\sqrt{N}} < \frac{1}{d \cdot 2d}= \frac{1}{2d^2} </math>

Смысл теоремы заключается в том, что если условие выше удовлетворено, то <math> \frac{k}{d} </math> появляется среди подходящих дробей для непрерывной дроби числа <math> \frac{e}{N} </math>.

Следовательно, алгоритм в итоге найдёт такое <math> \frac{k}{d} </math>Шаблон:Sfn.

Описание алгоритма

Рассматривается открытый RSA ключ <math> (e, N) </math>, по которому необходимо определить закрытую экспоненту <math> d </math>. Если известно, что <math> d < \frac{1}{3} N^{\frac{1}{4}} </math>, то это возможно сделать по следующему алгоритму Шаблон:Sfn:

1. Разложить дробь <math> \frac{e}{N} </math> в непрерывную дробь <math> [a_1, a_2...] </math>.
2. Для непрерывной дроби <math> [a_1, a_2...] </math> найти множество всех возможных подходящих дробей <math> \frac{k_n}{d_n} </math>.
3. Исследовать подходящую дробь <math> \frac{k_n}{d_n} </math>:
3.1. Определить возможное значение <math> \varphi(N) </math>, вычислив <math> f_n = \frac{ed_n -1}{k_n} </math>.
3.2. Решив уравнение <math> x^2 - ((N - f_n) + 1)x + N = 0 </math>, получить пару корней <math> (p_n, q_n) </math>.
4. Если для пары корней <math> (p_n, q_n) </math> выполняется равенство <math> N = p_n \cdot q_n </math>, то закрытая экспонента найдена <math> d = d_n </math>.
Если условие не выполняется или не удалось найти пару корней <math> (p_n, q_n) </math>, то необходимо исследовать следующую подходящую дробь <math> \frac{k_{n+1}}{d_{n+1}} </math>, вернувшись к шагу 3.

Пример работы алгоритма

Два данных примера Шаблон:Sfn наглядно демонстрируют нахождение закрытой экспоненты <math> d </math>, если известен открытый ключ RSA <math> (e, N) </math>.

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

Таблица: нахождение закрытой экспоненты 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

Получается, что <math> d = 25 </math>. В этом примере можно заметить, что условие малости выполняется <math> d < \frac{1}{3} N^{\frac{1}{4}} \approx 62.30074... </math>.

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

Таблица: нахождение закрытой экспоненты 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

Получается, что <math> d = 11 </math>. В этом примере так же можно заметить, что условие малости выполняется <math> d < \frac{1}{3} N^{\frac{1}{4}} \approx 76.65224... </math>.

Сложность алгоритма

Сложность алгоритма определяется количеством подходящих дробей для непрерывной дроби числа <math> \frac{e}{N} </math>, что есть величина порядка <math> O(log(n)) </math>. То есть число <math> d </math> восстанавливается за линейное времяШаблон:Sfn от длины ключа.

Ссылки

Шаблон:Примечания

Литература