Методы и средства защиты информации



              

Алгоритм RSA - часть 3


procedure InicMyRandom;

var i: Integer;

var s: string;

begin

 

WriteLn('Введите какой-либо текст для инициализации генератора

         

случайных чисел (до 256 символов):');

 

ReadLn(s);

 

i := 1;

 

while (i<=255) and (i<=Length(s)) do

Продолжение листинга 18.1

 begin

 

t[i] := Ord(s[i]);

 

Inc(i);

 

end;

 

pos := 0;

 

WriteLn('OK');

 

WriteLn;

end;

function MyRandom: Cardinal;

var i: Integer;

var l: Cardinal;

begin

 

if (pos = 0) then

 

begin

 

for i := 1 to 255 do     t[i] := cbox[(t[i-1]+t[i]) and 255];

 

for i := 254 downto 0 do t[i] := cbox[(t[i]+t[i+1]) and 255];

 

end;

 

l := 0;

 

for i := 0 to 3 do l := l shl 8 + Cardinal(t[pos+i]);

 

Result := l;

 

pos := (pos+4) and 255;

end;

//-------------------------------------------------------------

//Главная программа

var i,j: Integer;

var maxbit: Integer;

var none,ntwo: TBigNum;

var n1,n2: TBigNum;

var p,q,z: TBigNum;

var n,e,d: TBigNum;

var s1,s2: string;

begin

 

WriteLn;

 

InicMyRandom();

 

repeat

 

Write('Введите максимальный размер простых чисел (p и q) в

        

битах (8-257): ');

 

ReadLn(maxbit);

Продолжение листинга 18.1

 until (maxbit>=8) and (maxbit<=257);

//p

 

WriteLn('Введите большое десятичное значение, которое будет

         

использовано в качестве первого простого числа (Enter

          

-> генерируется программой): ');

 

ReadLn(s1);

 

BN_dec_to_bignum(s1,p);

 

BN_bignum_to_dec(p,s2);

 

if (s1<>s2) then

 

begin

 

if (s1<>'') then WriteLn('Число задано неверно!');

 

s1 := '0'; BN_dec_to_bignum(s1,p);

 

for i := 0 to BIGNUM_DWORD do n1[i] := MyRandom();

 

BN_a_shr_k(n1,(BIGNUM_DWORD+1)*32-maxbit,p);

 

BN_bignum_to_dec(p,s2);

 

WriteLn('Сгенерированное число: ',s2);

 

end;

 

WriteLn('Поиск первого простого числа... Ждите...');

 

p[0] := p[0] or 1;

 

s1 := '2'; BN_dec_to_bignum(s1,ntwo);

 

j := 0;

 

while (BN_PrimeTest(p)=0) and (j<8192) do

 

begin

 

BN_a_add_b(p,ntwo,n1);

 

Move(n1,p,sizeof(n1));

 

Inc(j);

 

Write('.');

 

end;

 

WriteLn;

 

if (j>=8192) then



Содержание  Назад  Вперед