Поэтому далеко не всегда указанные системы обеспечивают необходимый уровень защищенности.
Курсовая работа может быть полезна при изучение курсов связанных с ЭВМ, она окажется полезной для специалистов, сталкивающихся в своей работе с кодированием информации на ЭВМ.
В результате выполнения данной курсовой работы я узнал много нового касающегося как программирования, так и методов кодирования информации. Работа была очень интересной, хотя временами и возникали некоторые трудности.
Описанные в данной курсовой работе аспекты показывают, что выбор системы электронной цифровой подписи - непростая задача, решению которой необходимо уделить серьезное внимание. Не существует готовых рецептов. Правильный выбор - это не просто просмотр рекламных буклетов, полученных на выставке, или ознакомление с Web-сервером поставщика системы ЭЦП. Это кропотливый процесс, в котором должно учитываться множество факторов. Это и необходимость интеграции в принятую технологию обработки информации, и необходимость наличия сертификата ФАПСИ, и алгоритм распределения ключей, и т.д.
Выполнение данной курсовой работы закрепило теоретические знания по данной дисциплине, способствовало приобретению навыков формализации и составления алгоритмов решения криптографических задач, а также дало опыт практического решения криптографических задач, что являлось ее целью.
Сделайте правильный выбор - и Ваша информация будет надежно защищена от подделки.
1. Б. Анин «Защита компьютерной информации», Санкт-Петербург, 2000
2. Брюс Шнайер. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на Си. – М.: Издательство ТРИУМФ, 2002.
3. Ю. Мельников. Электронная цифровая подпись: всегда ли она подлинная? Банковские технологии, №5, 1995.
4. http://www.kinnet.ru
5. http://www.citforum.ru
6. http://kiev-security.org.ua
7. http://www.study.centersti.com
ПРОГРАММА РЕАЛИЗАЦИИ АЛГОРИТМА RSA
Файл FGIntPrimeGeneration.PAS
Unit FGIntPrimeGeneration;
Interface
Uses Windows, SysUtils, Controls, FGInt;
Procedure PrimeSearch(Var GInt : TFGInt);
Implementation
{$H+}
Procedure PrimeSearch(Var GInt : TFGInt);
Var
temp, two : TFGInt;
ok : Boolean;
Begin
If (GInt.Number[1] Mod 2) = 0 Then GInt.Number[1] := GInt.Number[1] + 1;
Base10StringToFGInt('2', two);
ok := false;
While Not ok Do
Begin
FGIntAdd(GInt, two, temp);
FGIntCopy(temp, GInt);
FGIntPrimeTest(GInt, 4, ok);
End;
FGIntDestroy(two);
End;
End.
Файл FGIntRSA.PAS
Unit FGIntRSA;
Interface
Uses Windows, SysUtils, Controls, FGInt;
Procedure RSAEncrypt(P : String; Var exp, modb : TFGInt; Var E : String);
Procedure RSADecrypt(E : String; Var exp, modb, d_p, d_q, p, q : TFGInt; Var D : String);
Procedure RSASign(M : String; Var d, n, dp, dq, p, q : TFGInt; Var S : String);
Procedure RSAVerify(M, S : String; Var e, n : TFGInt; Var valid : boolean);
Implementation
{$H+}
Procedure RSAEncrypt(P : String; Var exp, modb : TFGInt; Var E : String);
Var
i, j, modbits : longint;
PGInt, temp, zero : TFGInt;
tempstr1, tempstr2, tempstr3 : String;
Begin
Base2StringToFGInt('0', zero);
FGIntToBase2String(modb, tempstr1);
modbits := length(tempstr1);
convertBase256to2(P, tempstr1);
tempstr1 := '111' + tempstr1;
j := modbits - 1;
While (length(tempstr1) Mod j) <> 0 Do tempstr1 := '0' + tempstr1;
j := length(tempstr1) Div (modbits - 1);
tempstr2 := '';
For i := 1 To j Do
Begin
tempstr3 := copy(tempstr1, 1, modbits - 1);
While (copy(tempstr3, 1, 1) = '0') And (length(tempstr3) > 1) Do delete(tempstr3, 1, 1);
Base2StringToFGInt(tempstr3, PGInt);
delete(tempstr1, 1, modbits - 1);
If tempstr3 = '0' Then FGIntCopy(zero, temp) Else FGIntMontgomeryModExp(PGInt, exp, modb, temp);
FGIntDestroy(PGInt);
tempstr3 := '';
FGIntToBase2String(temp, tempstr3);
While (length(tempstr3) Mod modbits) <> 0 Do tempstr3 := '0' + tempstr3;
tempstr2 := tempstr2 + tempstr3;
FGIntdestroy(temp);
End;
While (tempstr2[1] = '0') And (length(tempstr2) > 1) Do delete(tempstr2, 1, 1);
ConvertBase2To256(tempstr2, E);
FGIntDestroy(zero);
End;
Procedure RSADecrypt(E : String; Var exp, modb, d_p, d_q, p, q : TFGInt; Var D : String);
Var
i, j, modbits : longint;
EGInt, temp, temp1, temp2, temp3, ppinvq, qqinvp, zero : TFGInt;
tempstr1, tempstr2, tempstr3 : String;
Begin
Base2StringToFGInt('0', zero);
FGIntToBase2String(modb, tempstr1);
modbits := length(tempstr1);
convertBase256to2(E, tempstr1);
While copy(tempstr1, 1, 1) = '0' Do delete(tempstr1, 1, 1);
While (length(tempstr1) Mod modbits) <> 0 Do tempstr1 := '0' + tempstr1;
If exp.Number = Nil Then
Begin
FGIntModInv(q, p, temp1);
FGIntMul(q, temp1, qqinvp);
FGIntDestroy(temp1);
FGIntModInv(p, q, temp1);
FGIntMul(p, temp1, ppinvq);
FGIntDestroy(temp1);
End;
j := length(tempstr1) Div modbits;
tempstr2 := '';
For i := 1 To j Do
Begin
tempstr3 := copy(tempstr1, 1, modbits);
While (copy(tempstr3, 1, 1) = '0') And (length(tempstr3) > 1) Do delete(tempstr3, 1, 1);
Base2StringToFGInt(tempstr3, EGInt);
delete(tempstr1, 1, modbits);
If tempstr3 = '0' Then FGIntCopy(zero, temp) Else
Begin
If exp.Number <> Nil Then FGIntMontgomeryModExp(EGInt, exp, modb, temp) Else
Begin
FGIntMontgomeryModExp(EGInt, d_p, p, temp1);
FGIntMul(temp1, qqinvp, temp3);
FGIntCopy(temp3, temp1);
FGIntMontgomeryModExp(EGInt, d_q, q, temp2);
FGIntMul(temp2, ppinvq, temp3);
FGIntCopy(temp3, temp2);
FGIntAddMod(temp1, temp2, modb, temp);
FGIntDestroy(temp1);
FGIntDestroy(temp2);
End;
End;
FGIntDestroy(EGInt);
tempstr3 := '';
FGIntToBase2String(temp, tempstr3);
While (length(tempstr3) Mod (modbits - 1)) <> 0 Do tempstr3 := '0' + tempstr3;
tempstr2 := tempstr2 + tempstr3;
FGIntdestroy(temp);
End;
If exp.Number = Nil Then
Begin
FGIntDestroy(ppinvq);
FGIntDestroy(qqinvp);
End;
While (Not (copy(tempstr2, 1, 3) = '111')) And (length(tempstr2) > 3) Do delete(tempstr2, 1, 1);
delete(tempstr2, 1, 3);
ConvertBase2To256(tempstr2, D);
FGIntDestroy(zero);
End;
Procedure RSASign(M : String; Var d, n, dp, dq, p, q : TFGInt; Var S : String);
Var
MGInt, SGInt, temp, temp1, temp2, temp3, ppinvq, qqinvp : TFGInt;
Begin
Base256StringToFGInt(M, MGInt);
If d.Number <> Nil Then FGIntMontgomeryModExp(MGInt, d, n, SGInt) Else
Begin
FGIntModInv(p, q, temp);
FGIntMul(p, temp, ppinvq);
FGIntDestroy(temp);
FGIntModInv(q, p, temp);
FGIntMul(q, temp, qqinvp);
FGIntDestroy(temp);
FGIntMontgomeryModExp(MGInt, dp, p, temp1);
FGIntMul(temp1, qqinvp, temp2);
FGIntCopy(temp2, temp1);
FGIntMontgomeryModExp(MGInt, dq, q, temp2);
FGIntMul(temp2, ppinvq, temp3);
FGIntCopy(temp3, temp2);
FGIntAddMod(temp1, temp2, n, SGInt);
FGIntDestroy(temp1);
FGIntDestroy(temp2);
FGIntDestroy(ppinvq);
FGIntDestroy(qqinvp);
End;
FGIntToBase256String(SGInt, S);
FGIntDestroy(MGInt);
FGIntDestroy(SGInt);
End;
Procedure RSAVerify(M, S : String; Var e, n : TFGInt; Var valid : boolean);
Var
MGInt, SGInt, temp : TFGInt;
Begin
Base256StringToFGInt(S, SGInt);
Base256StringToFGInt(M, MGInt);
FGIntMod(MGInt, n, temp);
FGIntCopy(temp, MGInt);
FGIntMontgomeryModExp(SGInt, e, n, temp);
FGIntCopy(temp, SGInt);
valid := (FGIntCompareAbs(SGInt, MGInt) = Eq);
FGIntDestroy(SGInt);
FGIntDestroy(MGInt);
End;
End.
Файл Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
FGInt, FGIntPrimeGeneration, FGIntRSA, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
CheckBox1: TCheckBox;
Label2: TLabel;
Edit2: TEdit;
CheckBox2: TCheckBox;
Button1: TButton;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Edit3: TEdit;
Label13: TLabel;
Button2: TButton;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
n, e, d, dp, dq, p, q, phi, one, two, gcd, temp, nilgint : TFGInt;
test, signature : String;
ok : boolean;
st: string;
tx: text;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckBox1.Checked then
Base10StringToFGInt(Edit1.Text, p) else
Base256StringToFGInt(Edit1.Text, p);
if CheckBox2.Checked then
Base10StringToFGInt(Edit2.Text, q) else
Base256StringToFGInt(Edit2.Text, q);
PrimeSearch(p);
PrimeSearch(q);
if CheckBox1.Checked then
FGIntToBase10String(p, st) else
FGIntToBase256String(p, st);
Edit1.Text:=st;
if CheckBox2.Checked then
FGIntToBase10String(q, st) else
FGIntToBase256String(q, st);
Edit2.Text:=st;
FGIntMul(p, q, n);
p.Number[1] := p.Number[1] - 1;
q.Number[1] := q.Number[1] - 1;
FGIntMul(p, q, phi);
FGIntToBase10String(n, st);
Label5.Caption:=st;
FGIntToBase10String(phi, st);
Label6.Caption:=st;
Base10StringToFGInt('14486581214143', e);
Base10StringToFGInt('1', one);
Base10StringToFGInt('2', two);
FGIntGCD(phi, e, gcd);
While FGIntCompareAbs(gcd, one) <> Eq Do
Begin
FGIntadd(e, two, temp);
FGIntCopy(temp, e);
FGIntGCD(phi, e, gcd);
End;
FGIntDestroy(two);
FGIntDestroy(one);
FGIntDestroy(gcd);
FGIntModInv(e, phi, d);
FGIntModInv(e, p, dp);
FGIntModInv(e, q, dq);
p.Number[1] := p.Number[1] + 1;
q.Number[1] := q.Number[1] + 1;
FGIntDestroy(phi);
FGIntDestroy(nilgint);
FGIntToBase256String(e, st);
Label8.Caption:=st;
FGIntToBase10String(d, st);
Label10.Caption:=st;
end;
procedure TForm1.Button2Click(Sender: TObject);
var prom: string;
begin
test := Edit3.Text;
RSAEncrypt(test, e, n, test);
Label11.Caption:=test;
PGPConvertBase256to64(test,prom);
Label17.Caption:=prom;
RSADecrypt(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);
Label12.Caption:=test;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
AssignFile(tx,'key.txt');
ReWrite(tx); CloseFile(tx);
Append(tx);
FGIntToBase256String(n, st);
ConvertBase256to64(st, st);
WriteLn(tx,st);
FGIntToBase256String(e, st);
ConvertBase256to64(st, st);
WriteLn(tx,st);
FGIntToBase256String(d, st);
ConvertBase256to64(st, st);
WriteLn(tx,st);
CloseFile(tx);
end;
end.
Результат выполнения программы: