![]() |
Eugeniusz Jakubas |
Stąd można pobrać teksty źródłowe poniższych 57 programów w Pascalu pr-pascal.zip - 34 kB
42. Twierdzenie o liczbach pierwszych i jego zastosowanie do szyfrowania RSA
program Twierdzenie_o_liczbach_pierwszych_i_jego_zastosowanie_do_szyfrowania_RSA;
{$N+}
uses crt;
var i,p,q,k,N,M,a,a1,e,d:integer;
potega,potega1,potega2:extended;
reszta,reszta1,reszta2:integer;
function pierwsza(a:integer):boolean;
var n:integer;
begin
pierwsza:=false;
for n:=2 to round(sqrt(a)) do if a mod n=0 then exit;
pierwsza:=true;
end;
function NdoM(a,b:integer):extended;
var n:integer;
x:extended;
begin
x:=1;
for n:=1 to b do x:=x*a;
NdoM:=x;
end;
function nwd(a,b:integer):integer;
var r:integer;
begin
repeat
r:=a mod b; a:=b; b:=r;
until r=0;
nwd:=a;
end;
procedure liczba_d;
var m:integer;
begin
a:=0;
repeat
a:=a+1; m:=a*(p-1)*(q-1)+1;
until m mod e=0;
d:= m div e;
end;
{******* program gl˘wny *********}
begin
clrScr; randomize;
repeat
repeat
repeat
repeat
p:=random(12)+2;
until pierwsza(p)=true;
repeat
q:=random(12)+2;
until (pierwsza(q)=true) and (p<>q);
k := p * q;
M := (p-1)*(q-1)+1;
N := random(12)+2;
potega:=NdoM(N,M);
until (N<k) and (potega<1e14);
reszta:=round(potega-int(potega/k)*k);
repeat
e:=random(5)+2;
until (nwd(e,p-1)=1) and (nwd(e,q-1)=1);
liczba_d;
potega1:=NdoM(N,e);
until potega1<1e14;
reszta1:=round(potega1-int(potega1/k)*k);
potega2:=NdoM(reszta1,d);
until (potega2<1e14) and (reszta1<>N);
reszta2:=round(potega2-int(potega2/k)*k);
textColor(green); { Twierdzenie }
writeLn('TW.2.');
write(' Jezeli p,q-r˘zne liczby pierwsze i ');
textColor(lightBlue); write('N');
textColor(green); write('<p*q, to ');
textColor(lightBlue); write('N');
textColor(green); write('^(p-1)*(q-1)+1 mod p*q = ');
textColor(lightBlue); writeLn('N');
textColor(white); for i:=1 to 76 do write('_');
textColor(green); writeLn; writeLn; { przyklad }
write('Przyklad:');
textColor(white);
write(' p=',p:1,', q=',q:1,', p*q=',p*q:1,', N=');
textColor(lightBlue);
write(N:1);
textColor(white);
writeLn(', (p-1)*(q-1)+1=',M:1);
textColor(lightBlue);
write(' ',N:1);
textColor(white);
write('^',M:1,' mod ',k:1,' = ',potega:1:0,' mod ',k:1,' = ');
textColor(lightBlue);
write(reszta:1);
textColor(green); writeLn; writeLn; { uog˘lnienie }
writeLn('Uog˘lnienie:');
write(' Jezeli p,q-r˘zne liczby pierwsze i ');
textColor(lightBlue); write('N');
textColor(green); write('<p*q, to ');
textColor(lightBlue); write('N');
textColor(green); write('^a*(p-1)*(q-1)+1 mod p*q = ');
textColor(lightBlue); writeLn('N');
textColor(green);
writeLn(' gdzie a = 1, 2, 3, ...');
for a1:=1 to 3 do
begin
textColor(white);
write(' np. a=',a1:1,' p=',p:1,', q=',q:1,', p*q=',p*q:1,' N=');
textColor(lightBlue);
write(N:1);
M:=a1*(p-1)*(q-1)+1;
potega:=NdoM(N,M);
reszta:=round(potega-int(potega/k)*k);
textColor(white);
writeLn(', a*(p-1)*(q-1)+1=',M:1);
textColor(lightBlue);
write(' ',N:1);
textColor(white);
write('^',M:1,' mod ',k:1,' = ',potega:1:0,' mod ',k:1,' = ');
textColor(lightBlue); write(reszta:1);
writeLn;
end;
writeLn;
a1:=a;
M:=a1*(p-1)*(q-1)+1;
potega:=NdoM(N,M);
reszta:=round(potega-int(potega/k)*k);
textColor(green);
writeLn('Zastosowanie:'); { Zastosowanie-szyfrowanie RSA }
textColor(lightBlue);
write(' N');
textColor(green);
write('^M mod k = (');
textColor(lightBlue);
write('N');
textColor(green);
write('^e)^d mod k = (');
textColor(lightBlue);
write('N');
textColor(green);
write('^e mod k)^d mod k = ');
textColor(lightRed);
write('X');
textColor(green);
write('^d mod k = ');
textColor(lightBlue);
writeLn('N');
textColor(green);
writeLn(' gdzie M = a*(p-1)*(q-1)+1 = e*d i e,d wzglednie pierwsze z p-1 i q-1,');
textColor(white);
writeLn(' np. a=',a:1,', p=',p:1,', q=',q:1,', e=',e:1,', d=',d:1,', M=',M:1,', k=',k:1);
writeLn;
textColor(lightBlue);
write(N:1);
textColor(white);
write('^',M:1,' mod ',k:1,' = (');
textColor(lightBlue);
write(N:1);
textColor(white);
write('^',e:1,' mod ',k:1,')');
write('^',d:1,' mod ',k:1,' = ');
textColor(lightRed);
write(reszta1:1);
textColor(white);
write('^',d:1,' mod ',k:1,' = ');
write(potega2:1:0,' mod ',k:1,' = ');
textColor(lightBlue); write(reszta2:1);
textColor(white);writeLn;
readLn;
end.
|
![]() |