Опубликован: 03.06.2019 | Доступ: свободный | Студентов: 401 / 45 | Длительность: 09:11:00
Лекция 12:

Криптосистема 1SА

< Лекция 11 || Лекция 12 || Лекция 13 >

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

Решение проблемы возможно при использовании открытого ключа шифрования. Открытый ключ криптосистемы позволяет каждому зашифровать сообщение, но только тот, кому предназначено сообщение, способен расшифровать его. Представьте себе, что Боб, владелец интернет магазина, желает получить номера кредитных карт своих покупателей, при этом они должны оставаться секретными и недоступными никому кроме Боба. Для этого Боб генерирует два ключа: открытый ключ, который необходим для шифрования, и секретный ключ, необходимый для дешифрования зашифрованного сообщения. Открытый ключ известен каждому, обычно он встроен в Web страницу магазина Боба. Алиса, клиент магазина, использует открытый ключ Боба для шифрования номера своей кредитной карты. Зашифрованный номер она посылает Бобу, чтобы оплатить сделанные ею покупки. Обычно шифрование вьшолняется браузером Алисы, которому известно, как прочесть открытый ключ Боба с его страницы. Браузер запрограммирован на выполнение алгоритма шифрования.

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

Одна из первых криптосистем с открытым ключом была предложена в 1974 году Ривестом (Rivest), Шамиром (Shamir), Адлеманом (Adleman). Эта система, известная как RSА (по первым буквам фамилий авторов) основана на факторизации целых - разложения целого числа на множители. Если взять два больших целых числа р и q, то достаточно просто получить их произведение N = рq Однако, если нам дано N и сказано, что оно является произведением двух простых чисел, то найти сомножители - вычислительно трудная задача. Открытый ключ в RSA криптосистеме - это пара целых, N и k, где k - целое со свойством НОД(k, (р - 1) (q - 1)) = 1. Например, можно выбрать k как простое число в интервале: mах(р -1, q -1)<k<(р-1)(q-1).

Секретным ключом являются числа: р, q, s, где s вычисляется как:

s=k^{-1}mod(p-1)(q-1)

Как мы позже покажем, любые оцифрованные данные могут быть представлены последовательностью остатков по модулю N: m_1, m_2, \dots. Алиса каждый остаток m, представляющий простой текст, шифрует, получая остаток с, представляющий зашифрованный текст, используя следующую формулу:

c=m^k \;mod\; N

Зашифрованный текст, в виде последовательности c_1, c_2, \dots, Алиса посылает Бобу

Для расшифровки послания Боб вычислит с^s \; mod \; N. Давайте проверим, что в этом случае Боб получит блок т, представляющий простой текст.

В самом деле, так как ks = 1 mod (р-1)(q-1), то ks = 1+r(р-1)(q-1) для некоторого целого r. Затем, вычисляя по модулю N, получим:

c^s=(m^k)^s=m^{ks}=m^{1+r(p-1)(q-1)}\\
=m^1*(m^{(p-1)(q-1)})^r=m*1^r=m\; mod\; N

При доказательстве использовался аналог малой теоремы Ферма об остатках по модулю N = pq:

m^{(p-1)(q-1)}=1\; mod\; pq

Можно показать, что последняя формула справедлива только тогда, когда НОД(m, pq)= 1. На практике мы исходим из того факта, что для больших простых чисел р, q вероятность того, что указанное равенство не выполняется, настолько мала, что его можно просто игнорировать. Фактически, найти не нулевой остаток m такой, что НОД(m, рq) \ne 1 означает выполнить факторизацию рq, поскольку остаток равен либо р, либо q. Так как мы исходим из того, что практически выполнить факторизацию невозможно за разумное время, мы можем также предполагать, что случайная ошибка в схеме шифрования не встретится.

Если кто-то сумеет факторизовать N и найти р и q, тогда он сумеет вычислить произведение (р - 1) (q - 1) и секретный ключ

s=k^{-1} mod\; (p-1)(q-1)

Утверждение. Пусть N - произведение двух неизвестных простых чисел: N = рq. Пусть Z_N^*- мультипликативная группа обратимых остатков по модулю N. Знание значения порядка М = (р - 1)(q - 1) этой группы позволяет эффективно факторизовать N.

Доказательство. Прежде всего заметим, что М = (р - 1)(q - 1) = N - р - q + 1, так что если мы знаем N и М, то мы также знаем значение S =р+q=N-М+ 1.

Давайте сконструируем квадратное уравнение, корнями которого являются числа р и q:

(X-p)(X-q)=X^2-(p+q)X=pq=X^2-SX+N

Хотя мы не знаем корней, но мы знаем значения коэффициентов квадратичного полинома с нужными нам корнями. Применяя стандартные формулы для корней квадратного уравнения:

X^2-SX+N=0

найдем значения множителей N - р и q.

Давайте обсудим детали реализации криптосистемы RSА. Прежде всего, как преобразовать произвольные данные в последовательность остатков? Любые оцифрованные данные хранятся в памяти компьютера в виде файла, который можно рассматривать как строку, состоящую из нулей и единиц. Все, что нам нужно сделать, это рассмотреть, как длинные бинарные строки преобразовать в последовательность остатков по модулю N.

Выберем n, такое что 2^n< N - 1 < 2^{n+1} Возьмем теперь нашу длинную бинарную строку и нарежем ее на блоки длины n. Каждый блок теперь может рассматриваться как двоичное число в интервале от 0 до 2^n - 1. Добавим 2 к этому числу, так что результат будет между 2 и 2^n +1, так что его можно интерпретировать как остаток по модулю N. Двойку мы добавляем для того, чтобы избежать остатков 0 и 1.

Еще одна техническая проблема, заслуживающая исследования - это сложность вычисления с^s \; mod\; N. Значение s сравнимо с N, так что может быть очень большим. Давайте зададимся вопросом, как много умножений необходимо выполнить, чтобы вычислить, например, с^{2018} mod\;  N. С первого взгляда - 2017, но фактически это можно сделать намного эффективнее. Давайте представим 2018 в виде разложения по степеням числа 2:

2018 = 1024+512+256+128+64+32+2 = 2^{10}+2^9+2^8+2^7+2^6+2^5+2^1.

Для возведения числа в квадрат требуется одно умножение. Повторяя возведение в квадрат, можно вычислить: с^2, (с^2)^2 = с^4,\; (с^4)^2 = с^{2^3}, \dots , (с^{2^9})^2 = с^{2^{10}}. Вычисления потребуют 10 умножений. Затем мы используем разложение числа 2018, чтобы выразить:

с^{2018} =c^{2^{10}} * c^{2^9} * c^{2^8} * c^{2^7} * c^{2^6} * c^{2^5} * c^2.

Таким образом потребовалось всего 16 умножений для вычисления с^{2018}. В общем случае требуется не более 2\1og_2s умножений для вычисления с^s.

Еще один возможный источник трудностей - это размер чисел, участвующих в вычислениях. Для больших s число с^s огромное. К счастью нам необходимо вычислить с^s mod\; N. Если после каждого умножения будем брать остаток по модулю N, то нам не придется иметь дело с целыми, превосходящими N^2.

< Лекция 11 || Лекция 12 || Лекция 13 >