
Лабораторная работа
Алгоритм RSA
Цель: Написать программу позволяющую шифровать/дешифровать данные с использованием алгоритма RSA.
Краткие теоретические сведения
Схема RSA представляет собой блочный шифр, в котором и открытый текст, и шифрованный текст представляются целыми числами из диапазона от 0 до п-1 для некоторого n. Схема, разработанная Rivest R., Shamir A., Adiman L. (RSA) основана на выражениях со степенями [1]. Открытый текст шифруется блоками, каждый из которых содержит двоичное значение, меньшее некоторого заданного числа п. Это значит, что длина блока должна быть меньше или равна log2(n). На практике длина блока выбирается равной 2k битам, где 2k < n < 2k+1. Шифрование и дешифрование для блока открытого текста М и блока шифрованного текста С можно представить в виде следующих формул [1]:
С = M emod n, (1)
М = С d mod n = (M e)d mod n = M ed mod n. (2)
Как отправитель, так и получатель должны знать значение п. Отправитель знает значение e, и только получателю известно значение d. Таким образом, данная схема является алгоритмом шифрования с открытым ключом KU = {е, п} и личным ключом KR={d, n}. Чтобы этот алгоритм мог использоваться для шифрования с открытым ключом, должны быть выполнены следующие требования:
1. Должны существовать такие значения е, d и п, что Med mod n =M для всех М < n;
2. Должны относительно легко вычисляться Мe и Сd для всех значений М < п; 3. Должно быть практически невозможно определить d по имеющимся e и n.
Пока что мы сфокусируем внимание на первом требовании, а остальные рассмотрим позже.
Необходимо найти соотношение вида
M ed =M mod n.
Для этого воспользуемся результатами теоремы Эйлера и следствием этой теоремы:
Теорема Эйлера. Для любых взаимно простых чисел a и n выполняется тождество:
. (3)
Следствие теоремы Эйлера. Для любых двух простых чисел p, q и любых двух целых чисел n, т, что n=pq, 0<m<n, и произвольного целого числа k выполняются следующие соотношения:
, (4)
где φ(n) является функцией Эйлера, значение которой равно числу положительных чисел, меньших n и взаимно простых с n. В случае простых p и q имеем φ (pq)=(p-1)(q-1).
Поэтому требуемое отношение получается при условии
ed = kφ(n) +1.
Это эквивалентно следующим соотношениям:
ed ≡ 1 mod φ(п),
d ≡ e–1 mod φ(п),
т.е. e и d являются взаимно обратными по модулю φ(n). В соответствии с правилами арифметики в классах вычетов это может иметь место только тогда, когда d (a следовательно, и e) является взаимно простым с φ (n). В эквивалентной записи НОД(φ (n), d)=1, где НОД это функция поиска наибольшего общего делителя для двух целых чисел.
Чтобы алгоритм был криптостойким, числа p и q должны выбираться из широкого диапазона положительных целых чисел (это позволяет исключить возможность перебора всех значений), но так как они должны быть простыми, то необходимо производить проверку данных чисел на простоту. Эту проверку можно осуществить, используя теорему Ферма [2]:
Если p является простым и a является положительным целым числом, которое не делится на p, то:
(5)
Неплохо знать, как много чисел, окажутся отброшенными прежде, чем обнаружится простое число. Одна из теорем теории чисел, известная под названием теоремы о простых числах, утверждает[3]:
Простые числа около N распределяются в среднем по одному на каждые ln(N) целых чисел.
Таким образом, в среднем придется протестировать порядка ln(N) целых чисел прежде, чем найдется простое число. В действительности из-за того, что все четные целые числа можно отбросить сразу же, истинный порядок задается числом ln(N)/2. Например, если искать простые числа в области величин порядка 2200, для нахождения простого числа потребуется около ln(2200)/2 = 70 попыток.
Теперь у нас есть все, чтобы представить схему RSA. Компонентами схемы являются:
p и q — два простых числа (секретные, выбираются)
n= pq (открытое, вычисляется)
=(p-1)(q-1) (открытое,
вычисляется)
такое e, что НОД( , e) = 1, 1 < e < (открытое, выбирается)
d ≡ e–1 mod (секретное, вычисляется).
Для вычисления d можно использовать расширенный алгоритм Евклида.
Личный ключ складывается из {d, n}, а открытый — из {e, n}. Предположим, что пользователь A опубликовал свой открытый ключ и пользователь B собирается переслать ему сообщение M. Тогда пользователь B запрашивает у А его открытый ключ, по формуле (1) вычисляет C = Me(mod n) и пересылает шифрованный текст (С) пользователю А. Получив этот текст(С), пользователь A дешифрует его, вычисляя по формуле (2) М=Cd(mod n).
Имеет смысл привести здесь обоснование этого алгоритма. Мы выбрали e и d такие, что
d ≡ e–1 mod φ(n).
Таким образом,
ed ≡ 1 mod φ(n).
Значит, ed имеет вид kφ(n) + 1. Но по следствию теоремы Эйлера (см. выше) можно записать соотношение:
.
Теперь мы имеем
С = Мe mod n, М = Сd mod n ≡ (Мe)d mod n ≡ Мed mod n ≡ М mod n.