ТЕМА 6. НЕСИММЕТРИЧНЫЕ СИСТЕМЫ ШИФРОВАНИЯ И ИХ ПОСТРОЕНИЕ

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
ТЕМА 6. НЕСИММЕТРИЧНЫЕ СИСТЕМЫ ШИФРОВАНИЯ И
ИХ ПОСТРОЕНИЕ
Цели и задачи изучения темы:
 сформировать
представление
о
принципе
открытого
распределения ключей с помощью алгоритма Диффи-Хеллмана;
 изучить алгоритм шифрования с асимметричным ключом RSA;
 научиться выбирать и рассчитывать параметры алгоритма RSA
для шифрования и расшифрования сообщений;
 приобрести практические навыки шифрования и расшифрования
сообщений с применением алгоритма RSA.
Оглавление:
6.1. Алгоритм Диффи-Хеллмана .......................................................................................................1
6.2. Алгоритм шифрования с несимметричным ключом (RSA) ....................................................4
6.3. Шифрование и расшифрование сообщений с применением алгоритма RSA........................5
6.1. Алгоритм Диффи-Хеллмана
Алгоритм Диффи-Хелмана (1976) использует функцию дискретного
возведения в степень и используется для открытого распределения
ключей по открытому каналу связи.
Первая публикация данного алгоритма открытого ключа появилась
в статье Диффи и Хеллмана, в которой вводились основные понятия
криптографии с открытым ключом и в общих чертах упоминался алгоритм
обмена ключа Диффи-Хеллмана.
Цель алгоритма состоит в том, чтобы два участника могли
безопасно обменяться ключом, который в дальнейшем может
использоваться в каком-либо алгоритме симметричного шифрования.
Сам алгоритм Диффи-Хеллмана может применяться только для обмена
ключами.
Алгоритм основан на трудности вычислений дискретных
логарифмов. Дискретный логарифм определяется следующим образом.
Вводится понятие примитивного корня простого числа Q как числа, чьи
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
степени создают все целые от 1 до Q – 1. Это означает, что если А
является примитивным корнем простого числа Q, тогда числа
A mod Q, A2 mod,..., AQ 1 mod Q
являются различными и состоят из целых от 1 до Q – 1 с некоторыми
перестановками. В этом случае для любого целого B < Q и примитивного
корня A простого числа Q можно найти единственную экспоненту Х,
такую, что
Y  A X mod Q ,где 0  X  (Q  1) .
Экспонента X называется дискретным логарифмом, или индексом
Y, по основанию A mod Q. Это обозначается как
ind A,Q (Y ).
Теперь опишем алгоритм обмена ключей Диффи-Хеллмана.
Общеизвестные элементы
Q
Простое число
A
A < Q и A является примитивным корнем Q
Создание пары ключей пользователем I
Выбор случайного числа X i (закрытый ключ)
Xi  Q
Вычисление числа Yi (открытый ключ)
Yi  A X i mod Q
Создание открытого ключа пользователем J
Выбор случайного числа X j (закрытый ключ)
Xj Q
Вычисление случайного числа Y j (открытый ключ)
Yj  A
Создание общего секретного ключа пользователем I
K  (Yi ) X i mod Q
Создание общего секретного ключа пользователем J
Xj
mod Q
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
K  (Y j )
Xj
mod Q
Предполагается, что существуют два известных всем числа:
простое число Q и целое A, которое является примитивным корнем Q.
Теперь предположим, что пользователи I и J хотят обменяться ключом
для алгоритма симметричного шифрования. Пользователь I выбирает
X
случайное число X i  Q и вычисляет Yi  A i mod Q . Аналогично
пользователь J независимо выбирает случайное целое число X j  Q и
вычисляет Y j  A mod Q . Каждая сторона держит значение Х в
секрете и делает значение Y доступным для другой стороны. Теперь
пользователь I вычисляет ключ как K  (Yi ) X mod Q , и пользователь J
Xj
i
вычисляет ключ как K  (Y j ) j mod Q . В результате по правилам
модульной арифметики оба получат одно и то же значение:
X
K  Y j  i mod Q  ( A
X
( A X i mod Q)
Xj
Xj
mod Q) X i mod Q  ( A j ) X i mod Q  A
mod Q  (Yi )
X
Xj
X j Xi
mod Q  ( A X i )
Xj
mod Q 
mod Q.
Таким образом, две стороны обменялись секретным ключом. Так
как X i и X j являются закрытыми, противник может получить только
следующие значения: Q, A, Yi и Y j . Для вычисления ключа атакующий
должен взломать дискретный логарифм, т. е. вычислить
X j  ind a , q (Y j ) .
Безопасность обмена ключа в алгоритме Диффи-Хеллмана
вытекает из того факта, что, хотя относительно легко вычислить
экспоненты по модулю простого числа, очень трудно вычислить
дискретные логарифмы. Для больших простых чисел задача считается
неразрешимой.
Следует заметить, что данный алгоритм уязвим для атак типа
«man-in-the-middle». Если противник может осуществить активную атаку,
т.е. имеет возможность не только перехватывать сообщения, но и
заменять их другими, он может перехватить открытые ключи участников
Yi и Y j , создать свою пару открытого и закрытого ключа ( X ÎÏ , YÎÏ ) и
послать каждому из участников свой открытый ключ. После этого каждый
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
участник вычислит ключ, который будет общим с противником, а не с
другим участником. Если нет контроля целостности, то участники не
смогут обнаружить подобную подмену.
6.2. Алгоритм шифрования с несимметричным ключом (RSA)
Алгоритм RSA стоит у истоков асимметричной криптографии. Он был
предложен тремя исседователями-математиками Рональдом Ривестом (R.
Rivest), Ади Шамиром (A. Shamir) и Леонардом Адлеманом (L. Adleman).
Эта асимметричная криптосистема в настоящее время является широко
распространенной во всем мире. В основе алгоритма RSA лежат идеи
алгоритма Диффи-Хеллмана.
Первым этапом любого асимметричного алгоритма шифрования
является создание пары ключей: открытого и закрытого (с последующим
свободным распространением открытого ключа).
Для алгоритма RSA этап создания ключей состоит из следующих
операций:
 Выбираются два простых числа p и q;
 Вычисляется их произведение n = p*q;
 Выбирается
произвольное
число
e
(e<n),
такое,
что
НОД (e, ( p  1)( q  1))  1 , т. е. должно быть взаимно простым с числом
( p  1)( q  1) ;
 методом Евклида решается в целых числах уравнение
e  d  ( p  1)( q  1)  y  1 . Здесь неизвестными являются переменные d и
y – метод Евклида как раз и находит множество пар (d, y), каждая из
которых является решением уравнения в целых числах;
 два числа (e, n) – публикуются как открытый ключ;
 число d хранится в строжайшем секрете – это и есть закрытый ключ,
который позволит читать все послания, зашифрованные с помощью
пары чисел (e, n).
Собственно шифрование с помощью этих чисел производится
следующим образом:
 отправитель разбивает свое сообщение на блоки, равные k  [log 2 (n)]
бит, где квадратные скобки обозначают взятие целой части от
дробного числа. Подобный блок может быть интерпретирован как
число из диапазона (0;2 k  1) ;
 для каждого такого числа (назовем его mi ) вычисляется выражение
ci  (( mi )e ) mod n .
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
6.3. Шифрование и расшифрование сообщений с применением
алгоритма RSA
Блоки ci и есть зашифрованное сообщение Их можно спокойно
передавать по открытому каналу, поскольку операция возведения в
степень по модулю простого числа является необратимой математической
задачей. Обратная ей задача носит название «логарифмирование в
конечном поле» и является на несколько порядков более сложной
задачей. То есть, даже если злоумышленник знает числа e и n, то по
значению ci прочесть исходные сообщения mi он не может выполнить
иначе, как полным перебором mi .
А вот на приемной стороне процесс дешифрования все же возможен,
и поможет нам в этом хранимое в секрете число d. Достаточно давно была
доказана теорема Эйлера, частный случай которой утвержает, что если
число n представимо в виде двух простых чисел p и q, то для любого x
имеет место равенство
( X ( p 1)( q 1) ) mod n  1
Для дешифрования RSA-сообщений воспользуемся этой формулой.
Возведем обе ее части в степень (-y):
( X (  y )( p 1)( q 1) ) mod n  1(  y )  1
Теперь умножим обе ее части на x : (x(-y)(p-1)(q-1)+1)mod n = 1*x = x. С
помощью алгоритма Евклида (см. ниже) можно рассчитать секретный ключ
d (целое число), для которого e*d+(p-1)(q-1)*y=1, то есть e*d=(-y)(p-1)(q1)+1. Следовательно, в последнем выражении предыдущего абзаца можно
заменить показатель степени на число (e*d). Получаем (xe*d)mod n = x. То
есть, для того чтобы прочесть сообщение ci=((mi)e)mod n, достаточно
возвести его в степень d по модулю m: ((ci)d)mod n = ((mi)e*d)mod n = mi.
Операции возведения в степень больших чисел достаточно
трудоемки для современных процессоров, даже если они производятся по
оптимизированным по времени алгоритмам. Поэтому обычно весь текст
сообщения кодируется обычным блочным шифром (намного более
быстрым), но с использованием ключа сеанса секретной связи, а ключ
сеанса шифруется асимметричным алгоритмом с помощью открытого
ключа получателя и обычно помещается в начало передаваемого файла.
Для работы каждый абонент должен выработать секретный и
открытый ключи. Предварительно должны быть выработаны большие
простые числа p и q и вычислено их произведение n=pq. Затем
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
выбирается число e – такое, что 1  e   .(n) и НОД (e,  (n))  1 , где
 .(n)  ( p  1)( q  1) ) – функция Эйлера от n.
Из уравнения ed  1(mod .(n)) посредством расширенного алгоритма
Евклида находится число d. Полученные числа e,n – открытый ключ
пользователя, а d – секретный ключ.
Использование алгоритма Евклида для расчета секретного
ключа d. Для расчета секретного ключа шифрования d требуется решить
сравнение вида: e*d  1 mod  (n), где  (n) – функция Эйлера от числа n,
e – открытый ключ шифрования, d – секретный ключ шифрования.
Вычисление секретного ключа d основано на общеизвестной
алгебраической формуле для деления целых десятичных чисел:
a = b*q + r, где 1 <= r < b.
Требуется вычислить частное q и остаток r от деления числа a на
число b. Применительно к поставленной задаче q - это функция Эйлера 
(n), а число b – открытый ключ шифрования e. Деление следует
выполнять до тех пор, пока остаток от деления r не станет равен 1. Если
остаток от деления r оказался большим 1, то пара чисел (a, b) заменяется
парой чисел (b, r) (общее правило: предыдущий делитель становится
делимым на данном шаге, а предыдущий остаток - делителем) и деление
продолжается дальше.
Расчет секретного ключа d выполняется по следующей формуле:
V(i) = V(i-2) + q(i)*V(i-1), где q(i) – текущее частное от деления.
Начальные условия при расчете секретного ключа d:
V(-1) = 0; V(0) = 1.
Окончательно, d = (-1)**к*V(к) (mod  (n)), где к – номер шага
алгоритма, на котором остаток от деления r(k) оказался равным 1.
Абонент B зашифровывает и посылает A сообщение m, которое тот
затем расшифровывает.
Зашифрование. Абонент B должен сделать следующее:
 получить открытый ключ абонента А – пару чисел (e, n);
 представить сообщение в виде числа m из интервала [0, n-1];
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
 вычислить c  m e mod n ;
 послать шифртекст с абоненту A;
Расшифрование. Для получения открытого текста абонент A,
используя секретный ключ d, вычисляет m  c d mod n ; если, ed  1(mod .(n)) ,
(e,  .(n))  1, (m, n)  1 , то (m e ) d mod n  m . Поскольку ed  1(mod  .(n)) , то ed  1  k .(n) ,
где k – некоторое целое положительное число. Из теоремы Эйлера
следует, что
m ( n )  1(mod n) при (m, n)=1.
Поэтому (m e ) d (mod n)  (m1k ( n) )(mod n)  m(m ( n) ) k (mod n)  m
Криптостойкость алгоритма RSA основывается на проблеме
факторизации
больших
простых
чисел.
Действительно,
если
злоумышленнику удастся разложить число n на простые множители p и q,
то для него не составит труда вычислить ( n), а затем и определить
секретный ключ пользователя. Однако нахождение секретного ключа
RSA не эквивалентно проблеме факторизации. Это означает, что
T(RSA)<=T(факторизации), где T(RSA) – трудоемкость определения
секретного ключа RSA, а T(факторизации) – трудоемкость факторизации
числа n. То есть, могут быть найдены эффективные алгоритмы
определения секретного ключа алгоритма RSA, причем проблема
факторизации при этом не будет разрешена.
Если сообщение невелико, то злоумышленник может попытаться
подобрать открытый текст путем перебора всех возможных вариантов и
шифрования их на открытом ключе абонента e до тех пор, пока не будет
получен перехваченный шифртекст c.
Схема шифрования RSA несостоятельна при использовании
абонентами общих модулей n. Допустим, что имеются 2 абонета A и В с
открытыми ключами (e1,n) и (e2,n). Центр (например, общий сервер)
желает послать обоим абонетам одно и то же сообщение m. Он получает
me1=c1(mod n) и me2=c2(mod n) и посылает c1 и c2 абонентам А и В
соответственно. Положим, что противник перехватывает эти сообщения.
Затем, если (e1,e2)=1, то с помощью расширенного алгоритма Евклида
можно найти такие k1 и k2, для которых e1k1+e2k2=1. И, соответственно,
me1k1me2k2=m. Найдя такие k1 и k2 (это можно сделать, ведь открытые ключи
противнику известны), противник вычислит собщение: (c1)k1(c2)k2 = m.
В настоящее время рекомендуется выбирать n размером 1024
и 2048 бит.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Если число e выбирается случайным образом, то одним из способов
ускорения вычислений (т. е. уменьшения числа возведений в степень)
является следующий алгоритм быстрого возведения (на примере):
a 25  (a 2 a) 2 ) 2 ) 2 a
Таким образом, вместо 25 умножений выполняется всего 6 (т. е. 4
возведения в квадрат и 2 умножения на a).
На практике, как правило, используется e = 3. В этом случае
необходимо, чтобы ни p-1, ни q-1 не делились на 3. При таком
открытом ключе операция зашифрования выполняется очень быстро
и требует одного возведения в квадрат и одного модульного
умножения (или 2-модульных умножений – в зависимости от
реализации).
Download