Опубликован: 19.11.2003 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 7:

Криптография с открытым ключом

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

Алгоритм RSA

Диффи и Хеллман определили новый подход к шифрованию, что вызвало к жизни разработку алгоритмов шифрования, удовлетворяющих требованиям систем с открытым ключом. Одним из первых результатов был алгоритм, разработанный в 1977 году Роном Ривестом, Ади Шамиром и Леном Адлеманом и опубликованный в 1978 году. С тех пор алгоритм Rivest-Shamir-Adleman ( RSA ) широко применяется практически во всех приложениях, использующих криптографию с открытым ключом.

Алгоритм основан на использовании того факта, что задача факторизации является трудной, т.е. легко перемножить два числа, в то время как не существует полиномиального алгоритма нахождения простых сомножителей большого числа.

Алгоритм RSA представляет собой блочный алгоритм шифрования, где зашифрованные и незашифрованные данные являются целыми между 0 и n -1 для некоторого n .

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

Алгоритм, разработанный Ривестом, Шамиром и Адлеманом, использует выражения с экспонентами. Данные шифруются блоками, каждый блок рассматривается как число, меньшее некоторого числа n. Шифрование и дешифрование имеют следующий вид для некоторого незашифрованного блока М и зашифрованного блока С.

С = Ме (mod n)
M = Cd (mod n) = (Me)d (mod n) = Med (mod n)

Как отправитель, так и получатель должны знать значение n. Отправитель знает значение е, получатель знает значение d. Таким образом, открытый ключ есть KU = {e, n} и закрытый ключ есть KR = {d, n}. При этом должны выполняться следующие условия:

  1. Возможность найти значения е, d и n такие, что Med = M mod n для всех М < n.
  2. Относительная легкость вычисления Ме и Сd для всех значений М < n.
  3. Невозможность определить d, зная е и n.

Сначала рассмотрим первое условие. Нам необходимо выполнение равенства:

Med = М (mod n)

Рассмотрим некоторые математические понятия, свойства и теоремы, которые позволят нам определить e, d и n.

  1. Если (а \times b) \equiv  (a x c) mod n, то b \equiv  c mod n, если а и n взаимнопростые, т.е gcd (a, n) = 1.
  2. Обозначим Zp - все числа, взаимнопростые с p и меньшие p. Если p - простое, то Zp - это все остатки. Обозначим w-1 такое число, что w x w^{-1} \equiv  1 mod p.

    Тогда \forall w \in  Z_{p} \exists z: w x z \equiv  1 mod p

    Доказательство этого следует из того, что т.к. w и p взаимнопростые, то при умножении всех элементов Zp на w остатками будут все элементы Zp, возможно, переставленные. Таким образом, хотя бы один остаток будет равен 1.

  3. Определим функцию Эйлера следующим образом: \Phi (n) - число положительных чисел, меньших n и взаимнопростых с n. Если p - простое, то \Phi (р) = p-1.

    Если p и q - простые, то \Phi (p \times q) = (p-1)  \times (q-1).

    В этом случае Zp x q ={0, 1, ј, (p x q - 1)}.

    Перечислим остатки, которые не являются взаимнопростыми с p x q:

    {p, 2 x p, ј, (q-1)  x p}
    {q, 2 x q, ј, (p-1)  x q}
    0

    Таким образом \Phi (p \times q) = p \times q - [(q-1) + (p-1) + 1] = p \times q - (p+q) + 1 = (p-1)  \times (q-1).

  4. Теорема Ферма.

    a^{n-1} \equiv  1 mod n, если n - простое.

    Если все элементы Zn умножить на а по модулю n, то в результате получим все элементы Zn, быть может, в другом порядке. Рассмотрим следующие числа:

    {a mod n, 2 x a mod n, ј, (n-1) x a mod n} являются числами {1, 2, ј, (n-1)}, быть может, в некотором другом порядке. Теперь перемножим по модулю n числа из этих двух множеств.

    [(a mod n) \times (2a mod n) \times ... \times (n-1)a mod n] mod n \equiv  (n-1)! mod n(n-1)! a^{n-1} \equiv  (n-1)! mod n

    n и (n-1)! являются взаимнопростыми, если n - простое, следовательно, a^{n-1} \equiv  1 mod n.

  5. Теорема Эйлера.

    a^{\Phi (n)} \equiv  1 mod n для всех взаимнопростых a и n.

    Это верно, если n - простое, т.к. в этом случае \Phi (n) = n-1. Рассмотрим множество R = {x_{1}, x_{2}, ј, x\Phi (n)}. Теперь умножим по модулю n каждый элемент этого множества на a. Получим множество S = {a \times x_{1} mod n, a \times x_{2}mod n, ј, a \times x_{\Phi (n)} mod n}. Это множество является перестановкой множества R по следующим причинам.

    Так как а является взаимнопростым с n и xi являются взаимнопростыми с n, то a x xi также являются взаимнопростыми с n. Таким образом, S - это множество целых, меньших n и взаимнопростых с n.

    В S нет дублей, т.к. если a x xi mod n = a x xj mod n => xi = xj.

    Следовательно, перемножив элементы множеств S и R, получим:

    \Phi (n)                \Phi (n)
 \prod  (a \times x_{i} mod n) \equiv   \prod   x_{i} mod n
i=1                 i=1
    \Phi (n)         \Phi (n)
( \prod  a \times x_{i}  \equiv   \prod  x_{i} ) mod n
 i=1          i=1
    \Phi (n)     \Phi (n)
( a^{\Phi (n)}  \times  \prod  x_{i}  \equiv   \prod  x_{i} ) mod n
          i=1      i=1
    ( a^{\Phi (n)} \equiv  1) mod n

Теперь рассмотрим сам алгоритм RSA. Пусть p и q - простые.

n = p x q.

Надо доказать, что \forall M < n: M^{\Phi (n)} = M^{(p-1) x (q-1)} \equiv  1 mod n

Если gcd (M, n) = 1, то соотношение выполняется. Теперь предположим, что gcd (M, n) \ne  1, т.е. gcd (M, p x q) \ne  1. Пусть gcd (M, p) \ne  1, т.е. M = c x p => gcd (M, q) = 1, так как в противном случае M = c x p и M = l x q, но по условию M < p x q.

Следовательно,

M^{\Phi (q)} \equiv  1 mod q
(M^{\Phi (q)})(p) \equiv  1 mod q
M^{\Phi (n)} \equiv  1 mod q

По определению модуля это означает, что M^{\Phi (n)} = 1 + k \times q. Умножим обе части равенства на M = c x p. Получим

M^{\Phi (n)+1} = c \times p + k \times q \times c \times p.
M^{\Phi (n)} \equiv  1 mod n

Или

M^{\Phi (n)+1} \equiv  M mod n

Таким образом, следует выбрать e и d такие, что е \times d \equiv  1 mod (n)

Или e \equiv  d^{-1} mod \Phi (n)

e и d являются взаимнообратными по умножению по модулю \Phi (n). Заметим, что в соответствии с правилами модульной арифметики, это верно только в том случае, если d (и следовательно, е ) являются взаимнопростыми с \Phi (n). Таким образом, gcd (\Phi (n), d) = 1.

Теперь рассмотрим все элементы алгоритма RSA.

p, q - два простых целых числа  - открыто, вычисляемо.
n = p x q  - закрыто, вычисляемо.
d, gcd (\Phi (n), d) = 1;  - открыто, выбираемо.
1 < d < \Phi (n)
е \equiv  d^{-1} mod \Phi (n)  - закрыты, выбираемы.

Закрытый ключ состоит из {d, n}, открытый ключ состоит из {e, n}. Предположим, что пользователь А опубликовал свой открытый ключ, и что пользователь В хочет послать пользователю А сообщение М. Тогда В вычисляет С = Ме (mod n) и передает С. При получении этого зашифрованного текста пользователь А дешифрует вычислением М = С d (mod n).

Суммируем алгоритм RSA:

Создание ключей

Выбрать простые р и q
Вычислить n = p x q
Выбрать d   gcd (\Phi (n), d) = 1; 1 < d < \Phi (n)
Вычислить е   е = d^{-1} mod \Phi (n)
Открытый ключ KU = {e, n}
Закрытый ключ KR = {d, n}

Шифрование

Незашифрованный текст: М < n
Зашифрованный текст: С = М е (mod n)

Дешифрование

Зашифрованный текст: С
Незашифрованный текст: М = Сd (mod n)

Рассмотрим конкретный пример:

Выбрать два простых числа: р = 7, q = 17.
Вычислить n = p x q = 7 x 17 = 119.
Вычислить \Phi (n) = (p - 1) \times (q - 1) = 96.
Выбрать е так, чтобы е было взаимнопростым с \Phi (n) = 96 и меньше, чем \Phi (n): е = 5.
Определить d так, чтобы d \times e \equiv  1 mod 96 и d < 96.
d = 77, так как 77 x 5 = 385 = 4 x 96 + 1.
Результирующие ключи открытый KU = {5, 119} и закрытый KR = {77, 119}.
Например, требуется зашифровать сообщение М = 19.
195 = 66 (mod 119); С = 66.
Для дешифрования вычисляется 6677 (mod 119) = 19.

Вычислительные аспекты

Рассмотрим сложность вычислений в алгоритме RSA при создании ключей и при шифровании/дешифровании.

Шифрование/дешифрование

Как шифрование, так и дешифрование включают возведение целого числа в целую степень по модулю n. При этом промежуточные значения будут громадными. Для того, чтобы частично этого избежать, используется следующее свойство модульной арифметики:

[(a mod n) x (b mod n)] mod n = (a x b) mod n

Другая оптимизация состоит в эффективном использовании показателя степени, так как в случае RSA показатели степени очень большие. Предположим, что необходимо вычислить х16. Прямой подход требует 15 умножений. Однако можно добиться того же конечного результата с помощью только четырех умножений, если использовать квадрат каждого промежуточного результата: х2, х4, х8, х16.

Создание ключей

Создание ключей включает следующие задачи:

  1. Определить два простых числа р и q.
  2. Выбрать е и вычислить d.

Прежде всего, рассмотрим проблемы, связанные с выбором р и q. Так как значение n = p x q будет известно любому потенциальному противнику, для предотвращения раскрытия р и q эти простые числа должны быть выбраны из достаточно большого множества, т.е. р и q должны быть большими числами. С другой стороны, метод, используемый для поиска большого простого числа, должен быть достаточно эффективным.

В настоящее время неизвестны алгоритмы, которые создают произвольно большие простые числа. Процедура, которая используется для этого, выбирает случайное нечетное число из требуемого диапазона и проверяет, является ли оно простым. Если число не является простым, то опять выбирается случайное число до тех пор, пока не будет найдено простое.

Были разработаны различные тесты для определения того, является ли число простым. Это тесты вероятностные, то есть тест показывает, что данное число вероятно является простым. Несмотря на это они могут выполняться таким образом, что сделают вероятность близкой к 1. Если n "проваливает" тест, то оно не является простым. Если n "пропускает" тест, то n может как быть, так и не быть простым. Если n пропускает много таких тестов, то можно с высокой степенью достоверности сказать, что n является простым. Это достаточно долгая процедура, но она выполняется относительно редко: только при создании новой пары (KU, KR).

На сложность вычислений также влияет то, какое количество чисел будет отвергнуто перед тем, как будет найдено простое число. Результат из теории чисел, известный как теорема простого числа, говорит, что простых чисел, расположенных около n в среднем одно на каждые ln (n) чисел. Таким образом, в среднем требуется проверить последовательность из ln (n) целых, прежде чем будет найдено простое число. Так как все четные числа могут быть отвергнуты без проверки, то требуется выполнить приблизительно ln (n)/2 проверок. Например, если простое число ищется в диапазоне величин 2200, то необходимо выполнить около ln (2200) / 2 = 70 проверок.

Выбрав простые числа р и q, далее следует выбрать значение е так, чтобы gcd(\Phi (n), e) = 1 и вычислить значение d, d = e^{-1} mod \Phi (n). Cуществует единственный алгоритм, называемый расширенным алгоритмом Евклида, который за фиксированное время вычисляет наибольший общий делитель двух целых и если этот общий делитель равен единице, определяет инверсное значение одного по модулю другого. Таким образом, процедура состоит в генерации серии случайных чисел и проверке каждого относительно \Phi (n) до тех пор, пока не будет найдено число, взаимнопростое с \Phi (n). Возникает вопрос, как много случайных чисел придется проверить до тех пор, пока не найдется нужное число, которое будет взаимнопростым с \Phi (n). Результаты показывают, что вероятность того, что два случайных числа являются взаимнопростыми, равна 0.6.

Обсуждение криптоанализа

Можно определить четыре возможных подхода для криптоанализа алгоритма RSA:

  1. Лобовая атака: перебрать все возможные закрытые ключи.
  2. Разложить n на два простых сомножителя. Это даст возможность вычислить \Phi (n) = (p-1) x (q-1) и d = e^{-1} (mod \Phi (n)).
  3. Определить \Phi (n) непосредственно, без начального определения р и q. Это также даст возможность определить d = e^{-1} (mod \Phi (n)).
  4. Определить d непосредственно, без начального определения \Phi (n).

Защита от лобовой атаки для RSA и ему подобных алгоритмов состоит в использовании большой длины ключа. Таким образом, чем больше битов в е и d, тем лучше. Однако, так как вычисления необходимы как при создании ключей, так и при шифровании/дешифровании, чем больше размер ключа, тем медленнее работает система.

Большинство дискуссий о криптоанализе RSA фокусируется на задаче разложения n на два простых сомножителя. В настоящее время неизвестны алгоритмы, с помощью которых можно было бы разложить число на два простых множителя для очень больших чисел (т.е. несколько сотен десятичных цифр). Лучший из известных алгоритмов дает результат, пропорциональный:

L (n) = esqrt (ln n * ln (ln n))

Пока не разработаны лучшие алгоритмы разложения числа на простые множители, можно считать, что величина n от 100 до 200 цифр в настоящее время является достаточно безопасной. На современном этапе считается, что число из 100 цифр может быть разложено на множители за время порядка двух недель. Для дорогих конфигураций (т.е. порядка $10 млн) число из 150 цифр может быть разложено приблизительно за год. Разложение числа из 200 цифр находится за пределами вычислительных возможностей. Например, даже если вычислительный уровень в 1012 операций в секунду достижим, что выше возможностей современных технологий, то потребуется свыше 10 лет для разложения на множители числа из 200 цифр с использованием существующих алгоритмов.

Для известных в настоящее время алгоритмов задача определения \Phi  (n) по данным е и n, по крайней мере, сопоставима по времени с задачей разложения числа на множители.

Для того чтобы избежать выбора значения n, которое могло бы легко раскладываться на сомножители, на р и q должно быть наложено много дополнительных ограничений: р и q должны друг от друга отличаться по длине только несколькими цифрами. Таким образом, оба значения р и q должны быть от 1075 до 10100.

Оба числа (р - 1) и (q - 1) должны содержать большой простой сомножитель.

gcd (p -1, q - 1) должен быть маленьким.

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????