unit genkey; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,FGIntRSA, FGInt, FGIntPrimeGeneration, StdCtrls, Spin, ExtCtrls, ImgList, ComCtrls, ToolWin; type TForm2 = class(TForm) Label1: TLabel; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; Button1: TButton; Label3: TLabel; Edit3: TEdit; Label4: TLabel; Edit4: TEdit; Label5: TLabel; Edit5: TEdit; Button2: TButton; Button4: TButton; Button5: TButton; Panel1: TPanel; GroupBox1: TGroupBox; Label6: TLabel; Label7: TLabel; Label8: TLabel; Panel2: TPanel; Label9: TLabel; Panel3: TPanel; Button3: TButton; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; ImageList1616: TImageList; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ToolButton1Click(Sender: TObject); procedure ToolButton2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; n, e, d, dp, dq, p, q, phi, one, two, gcd, temp, nilgint : TFGInt; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var i:integer; simplenum:string; begin {Подбор простых чисел } Randomize; SimpleNum:=''; for i:=1 to SpinEdit1.Value do // число P simplenum:=Simplenum+IntToStr(Random(10)); Base10StringToFGInt(simplenum, p);// преобразование строки в большое целое из модуля FGInt PrimeSearch(p);// проверка простоты числа из модуля FGIntPrimeGeneration FGIntToBase10String(p, simplenum); // преобразование целого в строку edit1.Text:=simplenum; SimpleNum:=''; for i:=1 to SpinEdit2.Value do // тоже самое для числа q simplenum:=Simplenum+IntToStr(Random(10)); Base10StringToFGInt(simplenum, q); PrimeSearch(q); FGIntToBase10String(q, simplenum); edit2.Text:=simplenum; end; procedure TForm2.Button2Click(Sender: TObject); var test : String; i:integer; begin {Расчет ключей} // Расчет простых чисел test:=Form2.Edit1.Text; Base10StringToFGInt(test, p); test:=Form2.Edit2.Text; Base10StringToFGInt(test, q); // Считаем модуль FGIntMul(p, q, n); FGIntToBase10String(n, test); Form2.Edit3.Text:=test; // Считаем p-1, q-1 p.Number[1] := p.Number[1] - 1; q.Number[1] := q.Number[1] - 1; // Считаем (p-1)*(q-1) FGIntMul(p, q, phi); // Выбор открытого ключа Test:=''; for i:=1 to 6 do test:=test+IntToStr(Random(10)); Base10StringToFGInt(test, e); PrimeSearch(e); Base10StringToFGInt('1', one); Base10StringToFGInt('2', two); FGIntGCD(phi, e, gcd);// находит общий делитель чисел phi и e , как gcd , //phi и e должны быть взаимно простыми gcd=1 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); FGIntToBase10String(e, test); // преобразование большого числа в строку Edit4.Text:=test; FGIntToBase10String(d, test); Edit5.Text:=test; end; procedure TForm2.Button4Click(Sender: TObject); begin Base10StringToFGInt(Form2.Edit3.Text,n); Base10StringToFGInt(Form2.Edit4.Text,e); Base10StringToFGInt(Form2.Edit5.Text,d); //ToolButton2.Click; Form2.Close; end; procedure TForm2.Button3Click(Sender: TObject); begin Button1Click(nil); Button2Click(nil); end; procedure TForm2.Button5Click(Sender: TObject); begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Edit4.Text:=''; Edit5.Text:=''; end; procedure TForm2.FormCreate(Sender: TObject); var dir:string; begin GetDir(0,dir); SaveDialog1.InitialDir:=dir; OpenDialog1.InitialDir:=dir; end; procedure TForm2.ToolButton1Click(Sender: TObject); var f:TextFile; s:string; i:integer; begin {Открыть текст} i:=3; if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then begin AssignFile(F,OpenDialog1.FileName); Reset(f); Memo1.Lines.Clear; while not EOF(f) do begin Readln(f,s); Memo1.Lines.Add(s); end; CloseFile(f); end; Edit3.Text:=Memo1.Lines[0]; Edit4.Text:=Memo1.Lines[1]; Edit5.Text:=Memo1.Lines[2]; end; procedure TForm2.ToolButton2Click(Sender: TObject); var str:string; f:TextFile; begin {Сохранение} str:=''; if SaveDialog1.Execute then begin AssignFile(F,SaveDialog1.FileName); rewrite(f); if (Edit3.Text<>'')and(Edit4.Text<>'')and(Edit5.Text<>'') then begin WriteLn(f,Edit3.Text); WriteLn(f,Edit4.Text); WriteLn(f,Edit5.Text); end; CloseFile(f); end; end; end.