Вот код:
Код: Выделить всё
Var
primes : Array[1..7] Of integer =
(2, 3, 5, 7, 11, 13, 17);
abet:array[0..25] of char;
p,g,k,y,x: Integer;
procedure TForm1.Button1Click(Sender: TObject);
Var
i,j:integer;
p1,g1,x1,y1:string;
begin
j:=1+random(7);
i:=2+random(6);
while (j>i) or (j=i) do
begin
j:=1+random(7);
end;
p:={17}primes[i];
g:={13}primes[j];
x:={8}RandomRange(1,p-1);
y:={1}(Round(exp(x*ln(g)))) mod p;
p1:=p1+IntToStr({p}primes[i]);
g1:=g1+IntToStr({g}primes[j]);
x1:=x1+IntToStr(x);
y1:=y1+FloatToStr(y);
edit1.Text:=p1;
edit2.Text:=g1;
edit3.Text:=x1;
edit4.Text:=y1;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,M:integer;
M1:string;
a,b:Int64;
begin
Memo1.Lines.Clear;
k:={13}RandomRange(1,p-1);
edit6.Text:=IntToStr(k);
for i:=0 to 25 do abet[i]:=chr(97+i);
M1:=Edit5.Text;
for j:=1 to length(M1) do
for i:=0 to 25 do
if M1[j]=abet[i] then
begin
M:=i;
a:=(Round(exp(k*ln(g)))) mod p;
b:=(Round(exp(k*ln(y)))*M) mod p;
Memo1.Lines[0]:=Memo1.Lines[0]+IntToStr(a)+','+IntToStr(b)+',';
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
SLA: array[1..50] of string;
SLB: array[1..50] of string;
i,j,n,t,a,b,c,d,M,posS,sort:integer;
M1,M2,a1,b1:string;
begin
c:=1;
d:=1;
j:=1;
sort:=1;
M1:=Memo1.Lines.Text;
while Pos(',',M1)<>0 do
begin
posS:=pos(',',M1);
if (sort Mod 2)<>0 then
begin
SLA[c]:=copy(M1,0,posS-1);
c:=c+1;
end
else
begin
SLB[d]:=copy(M1,0,posS-1);
d:=d+1;
end;
sort:=sort+1;
delete(M1,1,posS);
end;
For i:=1 to 20 do
begin
if SLA[i]='' then
Break
else
a:=StrToInt(SLA[i]);
{for n:=1 to k do
begin
a:=a*a;
end; }
b:=StrToInt(SLB[j]);
M:=(b*(Round(exp((p-1-x)*ln(a))))) mod p;
{M:=(b*a) mod p;}
for t:=0 to 25 do
begin
if t=M then
M2:=M2+abet[t];
end;
{M2:=M2+IntToStr(M);}
j:=j+1;
end;
edit7.Text:=M2;
end;
end.