Cтворення програм для генерацiї цифрового пiдпису вказаної iнформацiї

Страницы работы

Содержание работы

Лабораторна робота №10

Тема: Побудова цифрового пiдпису.

Мета: cтворення програм для генерацiї цифрового пiдпису вказаної iнформацiї..

Постановка задачi:  необхiдно розробити i налагодити комплекс програм:

-  яка дозволяє генерувати цифровий підпис;

-  та яка перевіряє валідність підпису;

Індивідуальне завдання: реалізувати цифровий підпис на основі алгоритму RSA

Текст програми:


{ Программа создания цифровой подписи }

PROGRAM SignCrt;

USES Crt;

LABEL Next;

VAR N,K,D,I,U,E: LongInt;

    P,Q: Word;

    St,St3:String;

    St2: array [1..255] of integer;

    f: file of Byte;

    f1:file of Word;

    f3: text;

    Cur,Tmp: Byte;

    Cur2,Tmp2: Word;

    f1n,f2n:text;

    ch: char;

    Dgs:ARRAY [1..10] of byte;

    cnt:byte;

{ Проверка простых чисел }

PROCEDURE Proverka (Temp: Integer);

VAR I: LongInt;

 Begin

  For I:=2 to round(sqrt(Temp)) do { перебор до корн из этого числа }

    If (Temp mod I=0) then

      Begin

       TextColor(20);

       Write('  ERROR: ');

       TextColor(7);

       WriteLn('Число ',Temp,' не простое! Оно делиться на ',i,'.');

       ReadLn;

       Halt;

      End;

 End;

FUNCTION Encoding(Ch,e,n: Longint): longInt;

Var Result,i: Longint;

Begin

     Result:=1;

     i:=0;

     while (i<e) do

       Begin

        Result:=(Result*Ch) mod n;

        inc(i);

       End;

Encoding:=Result;

End;

FUNCTION Decoding(Ch,d,n: Longint): Byte;

Var Result,i: Longint;

Begin

     Result:=1;

     i:=0;

     while (i<d) do

       Begin

         Result:=(Result*Ch) mod n;

        inc(i);

       End;

Decoding:=Result;

End;

BEGIN

{ Содание дайджеста собщения }

Cnt:=1;

Assign(f1n,'c:\text.rsa');

Reset(f1n);

Assign(f2n,'c:\digest.rsa');

Rewrite(f2n);

Read(f1n,Ch);

     While (NOT EOF(f1n)) do

     Begin

     Dgs[cnt]:=Dgs[cnt] xor ord (Ch);

     inc(cnt);

     if (cnt>10) then cnt:=1;

     Write(Ch);

     Read(f1n,Ch);

     End;

for i:=1 to 10 do Write(f2n,Dgs[i]);

Close(f1n);

Close(f2n);

 P:=151;

 Q:=11;

 ClrScr;

 WriteLn;

 WriteLn('  Стартовала программа, реализующая алгоритм RSA!!!');

 WriteLn;

  { Проверка простых чисел }

  Proverka(P);

  Proverka(Q);

 WriteLn('Входные данные. P=',p,', Q=',q,'.');

 N:=P*Q;

WriteLn('Число N=',n,'.');

 K:=(P-1)*(Q-1);

WriteLn('Число K=',k,'.');

WriteLn;

TextColor(4);Write('  Ждите... ');TextColor(7);

WriteLn('Идет поиск D числа. Это может занять длительное время.');

WriteLn;

   For I:=2 to MaxLongInt do

     Begin

       For U:=2 to I do

           Begin

             If ( I mod U=0 ) and (K mod U=0) then

             Goto Next;

           End;

WriteLn('Число D=',I,' найдено.');

D:=I;

break;

Next:

     End;

 For i:=1 to MaxLongInt do

   If (i*d) mod k = 1 then

     Begin

       WriteLn('Подобрано число E=',i,'.');

       e:=i;

       Break;

     End;

{ преобразование дайджеста собщения в подпись }

TextColor(2);

WriteLn;

WriteLn('  Начинается прцесс шифровки...');

TextColor(7);

Assign (f,'c:\digest.rsa');

Assign(f1,'c:\sign.rsa'); { Файл подписи }

Reset(f);

Rewrite(f1);

     While (not eof(f)) do

     Begin

       Read(f,Cur);

       Tmp2:=Encoding(Cur,d,n); { Закрытый ключ }

       Write(f1, Tmp2);

     End;

       Tmp2:=$FFFF;

       Write(f1, Tmp2);

Close(f);

Close(f1);

END.

{ Программа проверки цифровой подписи }

PROGRAM SignChk;

USES Crt;

LABEL Next;

VAR N,K,D,I,U,E: LongInt;

    P,Q: Word;

    St,St3:String;

    St2: array [1..255] of integer;

    f: file of Byte;

    f1:file of Word;

    f3: text;

    Cur,Tmp: Byte;

    Cur2,Tmp2: Word;

    f1n,f2n:text;

    ch,tst1,tst2: char;

    Dgs:ARRAY [1..10] of byte;

    cnt:byte;

{ Проверка простых чисел }

PROCEDURE Proverka (Temp: Integer);

VAR I: LongInt;

 Begin

  For I:=2 to round(sqrt(Temp)) do { перебор до корн из этого числа }

    If (Temp mod I=0) then

      Begin

       TextColor(20);

       Write('  ERROR: ');

       TextColor(7);

       WriteLn('Число ',Temp,' не простое! Оно делиться на ',i,'.');

       ReadLn;

       Halt;

      End;

 End;

FUNCTION Encoding(Ch,e,n: Longint): longInt;

Var Result,i: Longint;

Begin

     Result:=1;

     i:=0;

     while (i<e) do

       Begin

        Result:=(Result*Ch) mod n;

        inc(i);

       End;

Encoding:=Result;

End;

FUNCTION Decoding(Ch,d,n: Longint): Byte;

Var Result,i: Longint;

Begin

     Result:=1;

     i:=0;

     while (i<d) do

       Begin

         Result:=(Result*Ch) mod n;

        inc(i);

       End;

Decoding:=Result;

End;

BEGIN

{ Создание дайжеста из пришедшего сообщения }

Cnt:=1;

Assign(f1n,'c:\text.rsa');

Reset(f1n);

Assign(f2n,'c:\digest.rsa');

Rewrite(f2n);

Read(f1n,Ch);

     While (NOT EOF(f1n)) do

     Begin

     Dgs[cnt]:=Dgs[cnt] xor ord (Ch);

     inc(cnt);

     if (cnt>10) then cnt:=1;

     Write(Ch);

     Read(f1n,Ch);

     End;

for i:=1 to 10 do Write(f2n,Dgs[i]);

Close(f1n);

Close(f2n);

{ *** Простые числа *** }

 P:=151;

 Q:=11;

 ClrScr;

 WriteLn;

 WriteLn('  Стартовала программа, реализующая алгоритм RSA!!!');

 WriteLn;

  { Проверка простых чисел }

  Proverka(P);

  Proverka(Q);

 WriteLn('Входные данные. P=',p,', Q=',q,'.');

 N:=P*Q;

WriteLn('Число N=',n,'.');

 K:=(P-1)*(Q-1);

WriteLn('Число K=',k,'.');

WriteLn;

TextColor(4);Write('  Ждите... ');TextColor(7);

WriteLn('Идет поиск D числа. Это может занять длительное время.');

WriteLn;

   For I:=2 to MaxLongInt do

     Begin

       For U:=2 to I do

           Begin

             If ( I mod U=0 ) and (K mod U=0) then

             Goto Next;

           End;

WriteLn('Число D=',I,' найдено.');

D:=I;

break;

Next:

     End;

 For i:=1 to MaxLongInt do

   If (i*d) mod k = 1 then

     Begin

       WriteLn('Подобрано число E=',i,'.');

       e:=i;

       Break;

     End;

{ Расшифровка пришедшего дайжеста при помощи открытого ключа }

WriteLn;

WriteLn('  Начинается прцесс расшифровки...');

Assign(f1,'c:\sign.rsa');

Reset(f1);

Assign(f3,'c:\digest2.rsa');

Rewrite(f3);

Read(f1,Cur2);

     While (Cur2<>$FFFF) do

     Begin

       Tmp:=Decoding(Cur2,e,n); { Открытый ключ }

       Write(f3,Chr(Tmp));

       Read(f1,Cur2);

     End;

Close(f1);

Close(f3);

{ Проверка совпадения вычисленого и пришедшего дайджестов }

Assign(f1n,'c:\digest.rsa');

Reset(f1n);

Assign(f2n,'c:\digest2.rsa');

Reset(f2n);

Read(f1n,tst1); Read(f2n,tst2);

     While (NOT EOF(f1n)) do

     Begin

       if tst1<>tst2 then Begin WriteLn ('Подпись неверна') ; Halt(0); End;

       Read(f1n,tst1); Read(f2n,tst2);

     End;

WriteLn ('Подпись верна!!!') ; { Дайджесты совпали }

Close(f1n);

Close(f2n);

END.


Алгоритм програми:

1. Хеш функція формує дайджест повідомлення.

2. Проводимо шифрування закритим ключем RSA отриманого дайджесту та отримуємо підпис.

3. Перевіряємо підпис за допомогою відкритого ключа.

Результати роботи програми:В результаті роботи програми отримали файл цифрового підпису, який при розшифруванні дав той же самий дайджест, який отримали при пропусканні повідомлення серез хеш функцію.

Висновок: В ході роботи були придбані навички роботи з цифровим підписом реалізованим на базі алгоритму RSA.

Похожие материалы

Информация о работе