Лабораторна робота №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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.