Краткое описание.

Программа демонстрации работы метода шифровании RSA.

Характеристика метода.

Криптостойкость алгоритма RSA основывается на предположении, что исключительно определить секретный ключ по известному, поскольку для этого необходимо решить задачу о существовании делителей целого числа. Данная задача не имеет до настоящего времени эффективного (полиномиального) решения. Более того, вопрос существования эффективных алгоритмов решения, таких задач является открытым. В связи с этим для чисел, состоящих из 200-т цифр (а именно такие числа рекомендуется использовать), традиционные методы требуют выполнения огромного числа операций (около 1023).

Метод является очень перспективным, поскольку не требуется передачи ключа пользователям. Это выгодно отличает его от других методов криптографической защиты данных. Но в настоящее время к этому методу относятся вероятностно -сомнительно, поскольку в ходе дальнейшего развития науки и техники может быть найден эффективный алгоритм определения делителей целых чисел, в результате чего метод станет абсолютно незащищённым.

В остальном, метод RSA обладает только достоинствами. К числу этих достоинств, следует отнести очень высокую криптостойкость, довольно простую программную и аппаратную реализации. Правда, использование этого метода для защиты информации неразрывно связано с уровнем развития вычислительной техники.

Программа осуществляет генерацию секретного и открытого ключей, шифрование текстового файла и его дешифрование.

Данная программа предназначена для демонстрации работы метода шифрования открытым ключом RSA. Текст, для шифрования считывается из файла исходных данных TEXT.DAT, затем шифруется и в шифрованном виде записывается в файл TEXT.RSA. После этого программа осуществляет дешифрацию, результат которой записывается в файл TEXT.RES. Числа р и q генерируются случайным образом на заданном границами интервале. Число d определяется как взаимно простое с результатом умножения (р-1 )(q-l). Число е определяется как удовлетворяющее соотношению (e*d)mod(p-l)(q-l)=l. С целью избежать зависания программы при выборе d и е в процессе подбора этих чисел генерируются новые значения р и q. Шифрование производится по формуле:

Ci=Mi*mod n,

где Mi и Ci имеют тот же смысл, что и в при шифровании. Числа р и q берутся маленькими по сравнению с реальными задачами, поскольку даже при небольшом их увеличении не хватает разрядной сетки для вычислений (Mi возведенное в степень e«d получается огромным). О работе с программой. После вычислений и печати сообщения о завершении работы можно нажать любую клавишу и провести вычисления заново, а можно нажать <Escape> и выйти из программы.

program RSA_security_method; uses

Crt, Plus, Win Work, Win;

const

LMp = 5; RMp=13; LMq = 7; RMq = 3; RMe = 7; LMe=l;

{ Переменные и константы, }

{используемые в программе }

{границы для генерации чисел }

{ р, q, e, d. Эти числа генерируются }

{ случайным образом в заданных }

{пределах и затем производится }

{проверка их допустимости. }


var

a,b :longint;

z :longint;

n :longint;

e :longint;

d :longint;

p,q :longint;

i :longint;

x,xl :double;

df :text;

rfl :text;

rf :text;
Sym rchar;

C,M :longint;

Man W : WindowType;


{ Вспомогательные переменные}

{ Произведение(я-1 )(р-1) }

{ Произведение p*q }

{ Число е }

{ Число d }

{ Числа р и q }

{Счетчик }
{ Вспомогательные переменные }

{ Файл данных (текст) }

{Файл результата! }

{ Файл результата 2 }

{ Считанный символ }

{ Коды символа }

{ Окно сообщения }


const {Символы оформления }

WatSymbols : array[1..4] of char = (‘\’, '|',’/’,'-');

WaitNum : byte = 1;

 

{Функция возведения числа в положительную целую степень Power }
{Входные и выходные переменные: Р - степень, }

{ Num - число для возведения в степень. }

function Power(Num, Р : Longint): Longint; var

i : Longint; {Используемые переменные}

Mult : Longint; {Счётчик }

begin

Mult:=l; {Начальное значение }

for i := 1 to P do Mult := Mult *Num;{Последовательное умножение}

Power := Mult;
end;

 

Begin {Основная программа}

repeat

TextAttr := darkgray;

ClrScr; {Очистка экран }

OpenWin(5, 5, 75, 17, 'Метод RSA', white+16*blue,

white+16*blue, 1, 0, true, 1, yellow, blue, MainW);

WriteStr(9, 2, 'Программа демонстрации работы метода шифрования RSA.',

white+16*blue);

WriteStr(25, 4, 'Идет подбор параметров', white+16*blue); repeat

RANDOMIZE; {Иниц-я ген-pa ел. чисел}

WriteStr(35, 6, WaitSymbols[WaitNumJ, white+16*blue);

if WaitNum<4 then inc(WaitNum) else WaitNum:=l;

repeat

{Генерация числа р) (Проверка является } {ли р простым числом }

repeat

p:=round(random*(RMp-LMp+1 )+LMp); i:=2;

while ((-int(p/i)+p/i)<>0) and (i<p) do inc(i); until i=p;

repeat

repeat

{Генерация числа q} {Проверка является ли} { q простым числом }

q:=round(random*(RMq-LMq+1 )+LMq); i:=2;

while ((-int(q/i)+q/i)<>0) and (i<q) do inc(i);

until i=q;

{Проверка условия p<>q} {Вычисление n} {Вычисление z} {Нахождение числа d } {взаимно простого с z }

until (p<>q) and (p*q>35); n:=p*q;

z:=(p-i)*(q-i);

a:=z;

{repeat}

d:=round(random*(RMd-LMd+1 )+LMd);

b:=d;

while a<>b do

if a>b then a:=a-b else b:=b-a;

until (a=l) and (pod) and (p<>q); {repeat}

{Нахождение числа е, } {удовлетворяющего соотн.} {(e*d)modz= 1 }

e::=round(random*(RMe-LMe+1 )+LMe);

until ((e*d) mod z)=l;

{e:=round(z/(d mod z));}

GotoXY(25,4);

writeln(' Параметры метода ');

GotoXY(25,6);

writeln(' Число р=',р:2,' Чисто n=',n:2);

GotoXY(25,7);

Writeln(‘Число q=',q:2,' Число d=',d:2);

GotoXY(25,8);

writeln(' Число е=',е:2);

textattr:=white+16*blue;

{Определение файла данных} {файла результата 1,} {файла результата 2} }
{Считывание символа } {Получение его кода }

assign(rfl ,'text.rsa'); rewrite(rfl); assign(rf,'text.res'); rewrite(rf);

while not EoF(df) do begin

read(df,Sym);

case Sym of

'А'..'Я' : M:=ord(Sym)-127;
' ' :M:=34;

‘.‘ :M:=35;

‘,’ :M:=36;

' ! ' :M:=37;

' ? ' :M:=38;

' + ' :M:=39; {Возведение Ме}

{Получение кода С} {Запись кода в файл рез-в } {Возведение Cd } {Дешифрация кода С }

‘-‘ :М:=40;

else M:=l;

end;

х :=ехр(еЛп(М)-1п(п));

xl:=frac(xl);

C:=round(n*xl);

Write(rfl,C);

x:=exp(d*ln(M)-ln(n));

xl:=frac(x);

M:=round(n*xl);

Case M of

1..33 :M:=M+127;

34 : M:=32;

35 : M:=ord('.');

36 : M:=ord(',');

37 : M:=ord(' ! ');

38 : M:=ord(' ? ');

39 : M:=ord(' -');

40 : M:=ord(' + '); end;

{Печать декодированного } {символа } }

write(rf,chr(M));

end;

{Закрываем файлы }

readln(df);

writeln(rfl); writeln(rf); end;

close(df); close(dfl); close(rf);

GotoXY(20,10): write(' Работа программы завершена успешно ');

Sym:=readkey;

Close Win(MainW);

{Очистка экрана }

Textattr:=lightgray; until Sym= #27; ClrScr;

end;