1.1Алгоритм rsa
Алгоритм RSA стоит у истоков асимметричной криптографии. Он был предложен тремя исседователями-математиками Рональдом Ривестом (R.Rivest), Ади Шамиром (A.Shamir) и Леонардом Адльманом (L.Adleman) в 1977-1978 годах. [7]
Безопасность RSA основана на трудности разложения на множители больших чисел. Открытый и закрытый ключи являются функциями двух больших (100-200 разрядов) простых чисел. Предполагается, что восстановление открытого текста по шифртексту и открытому ключу эквивалентно разложению на множители двух больших чисел.
Первым этапом любого асимметричного алгоритма является создание пары ключей: открытого и закрытого и распространение открытого ключа «по всему миру».
Для генерации двух ключей используются два больших случайных простых числа p и q. Для максимальной безопасности выбирайте p и q равной длины. Рассчитывается произведение n = p*q
Затем случайным образом выбирается ключ шифрования е такой, что е и (p-1)(q-1) являются взаимно простыми числами.
Наконец расширенный алгоритм Эвклида используется для вычисления ключа дешифрования d, такого что
e*d (mod (p-1)(q-1)) = 1.
Другими словами
d = e-1mod (p-1)(q-1).
Заметим, что d и n также взаимно простые числа. Числа е и n – это открытый ключ, а число d – закрытый. Два простых числа p и q больше не нужны. Они должны быть отброшены, но не должны быть раскрыты.
Как же производится собственно шифрование с помощью этих чисел?
Отправитель разбивает свое сообщение на блоки, меньшие n (для двоичных данных выбирается самая большая степень числа 2, меньшая n).
Формула шифрования выглядит так
ci=((mi)e)mod n.
Блоки ci и есть зашифрованное сообщение Их можно спокойно передавать по открытому каналу, поскольку операция возведения в степень по модулю простого числа, является необратимой математической задачей. Обратная ей задача носит название «логарифмирование в конечном поле» и является на несколько порядков более сложной задачей. То есть даже если злоумышленник знает числа e и n, то по ci прочесть исходные сообщения mi он не может никак, кроме как полным перебором mi.
А вот на приемной стороне процесс дешифрования все же возможен, и поможет нам в этом хранимое в секрете число d.
Для расшифровки сообщения возьмите каждый зашифрованный блок ci и вычислите
mi = ((ci)d)mod n.
Достаточно давно была доказана теорема Эйлера, частный случай которой утверждает, что если число n представимо в виде двух простых чисел p и q, то для любого x имеет место равенство (x(p-1)(q-1))mod n = 1, следовательно
(ci)d = (mie)d = mied = mi mi k(p-1)(q-1) = mi*1 = mi все (mod n), то формула восстанавливает сообщение.
На самом деле операции возведения в степень больших чисел достаточно трудоемки для современных процессоров, даже если они производятся по оптимизированным по времени алгоритмам. Поэтому обычно весь текст сообщения кодируется обычным блочным шифром (намного более быстрым), но с использованием ключа сеанса, а вот сам ключ сеанса шифруется как раз асимметричным алгоритмом с помощью открытого ключа получателя и помещается в начало файла.
Пример Зашифруем сообщение “ШИФР”. Для простоты будем использовать маленькие числа (на практике применяются гораздо большие).
Выберем p=3 и q=17.
Определим n=3*17=51
Найдем (p-1)(q-1)=2*16=32.
Выберем числа е и d из уравнения e*d (mod(p-1)(q-1)) = 1. Это означает, что d*e = 1 + k(p-1)*(q-1). При k=1 числами e и d могут быть 11 и 3. Действительно, 11*3 = 1+32.
Представим шифруемое сообщение как последовательность целых чисел с помощью отображения: Ш25, И9, Ф21, Р17. Тогда сообщение принимает вид (25, 9, 17).
Зашифруем сообщение с помощью ключа {3, 51}.
ШТ1 = (253) (mod 51) = 15625 (mod 51) = 19,
ШТ2 = (93) (mod 51) = 729 (mod 51) = 15,
ШТ3 = (213) (mod 51) = 9261 (mod 51) = 30,
ШТ4 = (173) (mod 51) = 4913 (mod 51) = 17.
Расшифруем полученное зашифрованное сообщение (19, 15, 30, 17) на основе закрытого ключа {11, 51}:
ИТ1 = (1911) (mod 51) = 116490258898219 (mod 51) = 25,
ИТ2 = (1511) (mod 51) = 8649755859375 (mod 51) = 9,
ИТ3 = (3011) (mod 51) = 17714700000000000 (mod 51) = 21,
ИТ4 = (1711) (mod 51) = 34271896307633 (mod 51) = 17.