Министерство образования Российской Федерации
Пермский государственный технический университет
Кафедра ИТАС
Лабораторная работа №
по предмету «Методы и средства защиты информации»
Тема: «Шифр RSA»
Выполнил:
Габова Н.А.
гр. АСУ-02-1
Проверил:
Мосиенко А.Ю.
Пермь, 2006
Цель работы:
Получить практические навыки по использованию алгоритма шифрования RSA.
Алгоритм:
Алгоритм RSA стоит у истоков асимметричной криптографии.
Первым этапом любого асимметричного алгоритма является создание пары ключей : открытого и закрытого и распространение открытого ключа "по всему миру". Для алгоритма RSA этап создания ключей состоит из следующих операций :
-
Выбираются два простых (!) числа p и q
-
Вычисляется их произведение n(=p*q)
-
Выбирается произвольное число e (e<n), такое, что НОД(e,(p-1)(q-1))=1, то есть e должно быть взаимно простым с числом (p-1)(q-1).
-
Методом Евклида решается в целых числах (!) уравнение e*d+(p-1)(q-1)*y=1. Здесь неизвестными являются переменные d и y – метод Евклида как раз и находит множество пар (d,y), каждая из которых является решением уравнения в целых числах.
-
Два числа (e,n) – публикуются как открытый ключ.
-
Число d хранится в строжайшем секрете – это и есть закрытый ключ, который позволит читать все послания, зашифрованные с помощью пары чисел (e,n).
Шифрование производится с помощью этих чисел :
-
Отправитель разбивает свое сообщение на блоки, равные k=[log2(n)] бит, где квадратные скобки обозначают взятие целой части от дробного числа.
-
Подобный блок, как Вы знаете, может быть интерпретирован как число из диапазона (0;2k-1). Для каждого такого числа (назовем его mi) вычисляется выражение ci=((mi)e)mod n. Блоки ci и есть зашифрованное сообщение Их можно спокойно передавать по открытому каналу, поскольку операция возведения в степень по модулю простого числа, является необратимой математической задачей. Обратная ей задача носит название "логарифмирование в конечном поле" и является на несколько порядков более сложной задачей. То есть даже если злоумышленник знает числа e и n, то по ci прочесть исходные сообщения mi он не может никак, кроме как полным перебором mi.
Дешифрование производиться следующим образом:
По теореме Эйлера, частный случай которой утвержает, что если число n представимо в виде двух простых чисел p и q, то для любого x имеет место равенство (x(p-1)(q-1))mod n = 1. Возведем обе части равенства в степень (-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. Для того чтобы прочесть сообщение ci=((mi)e)mod n достаточно возвести его в степень d по модулю m : ((ci)d)mod n = ((mi)e*d)mod n = mi.
Листинг программ:
program RSA_shifr;
var p,q,n,e,d,m,o:integer;
c1,c:LongInt;
st1,str3:string;
f1,f2:text;
procedure shifr(var st,str3:string);
var str1,str2:string;
s,i,j:integer;
begin
val(st,m,o);
s:=length(st);
for i:=1 to s
do begin
str1:=copy(st,i,1);
val(str1,m,o);
c1:=1;
for j:=1 to e
do c1:=c1*m;
c:=c1 mod n;
str(c,str2);
if c<=9
then str3:=concat(str3,str2,' ')
else str3:=concat(str3,str2);
end;
end;
begin
p:=3;
q:=5;
n:=p*q;
e:=7;
d:=7;
assign(f1,'TEXT.txt');
reset(f1);
assign(f2,'TEMP.txt');
rewrite(f2);
readln(f1,st1);
shifr(st1,str3);
writeln(f2,str3);
close(f1);
close(f2);
erase(f1);
rename(f2,'text.txt');
end.
program RSA_deshifr;
var p,q,n,e,d,m,o,i,j:integer;
c1,c:LongInt;
st1,st2,s1,s2:string;
f1,f2:text;
procedure deshifr(var st1,st2:string);
var str2,str3:string;
s:integer;
begin
s:=length(st1);
for i:=1 to s
do begin
if ((i mod 2)=1)
then
begin
str2:=copy(st1,i,2);
if pos(' ',str2)<>0
then delete(str2,pos(' ',str2),1);
val(str2,c1,o);
c:=1;
for j:=1 to d
do c:=c*c1;
m:=c mod n;
str(m,str3);
st2:=concat(st2,str3,'');
end
else;
end;
end;
begin
p:=3;
q:=5;
n:=p*q;
e:=7;
d:=7;
assign(f1,'text.txt');
reset(f1);
assign(f2,'temp.txt');
rewrite(f2);
readln(f1,st1);
deshifr(st1,st2);
writeln(f2,st2);
close(f1);
close(f2);
erase(f1);
rename(f2,'text.txt');
end.
Результаты тестирования:
исходный файл:
123456789
зашифрованный файл:
1 8 124 5 6 132 9
расшифрованный файл:
123456789