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



              

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


 

begin

 

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

 

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

 

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

 

BN_a_mod_b(n1,z,d);

 

BN_bignum_to_dec(d,s2);

 

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

 

end;

 

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

 

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

 

s1 := '1'; BN_dec_to_bignum(s1,none);

 

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

 

j := 1;

 

BN_ab_GCD(d,z,n1);

 

while (BN_a_cmp_b(n1,none)<>0) and (j<1000) do

 

begin

 

BN_a_add_b(d,ntwo,n1);

 

Move(n1,d,sizeof(n1));

 

BN_ab_GCD(d,z,n1);

 

j := j+1;

 

end;

 

BN_ab_GCD(d,z,n1);

 

if (BN_a_cmp_b(n1,none)<>0) then

 

begin

 

WriteLn('К сожалению, подходящего простого числа не найдено!');

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

  WriteLn('Нажмите Enter для выхода.'); ReadLn;

 

Halt(1);

 

end;

 

WriteLn;

 

BN_bignum_to_dec(d,s1);

 

WriteLn('Открытый ключ d = ',s1);

 

WriteLn;

// e

 

WriteLn('Вычисление секретного ключа...');

 

BN_a_modinv_b(d,z,e);

 

BN_bignum_to_dec(e,s1);

 

WriteLn('Секретный ключ e = ',s1);

 

WriteLn;

//e*d mod z = 1 ?

 

BN_a_mul_b(e,d,n1);

 

BN_a_mod_b(n1,z,n2);

 

if (BN_a_cmp_b(n2,none)<>0) then

 

begin

 

WriteLn('СБОЙ: e*d mod z <> 1!');

 

WriteLn('Нажмите Enter для выхода.'); ReadLn;

 

Halt(1);

 

end;

 

WriteLn('e*d mod z = 1');

 

WriteLn;

//Проверка ключей.

 

WriteLn('Введите большое значение для проверки ключей (Enter

         

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

 

ReadLn(s1);

 

BN_dec_to_bignum(s1,n1);

 

BN_bignum_to_dec(n1,s2);

 

if (s1<>s2) then

 

begin

 

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

 

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

 

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

 

end;

 

n1[7] := 0;

 

BN_a_mod_b(n1,n,n2);

 

BN_bignum_to_hex(n2,s2);

Окончание листинга 18.1

 WriteLn('Исходное значение   = 0x',s2);

 

BN_a_exp_b_mod_c(n2,e,n,n1);

 

BN_bignum_to_hex(n1,s1);

 

WriteLn('Зашифрованное значение = 0x',s1);

 

BN_a_exp_b_mod_c(n1,d,n,n2);

 

BN_bignum_to_hex(n2,s1);

 

WriteLn('Расшифрованное значение = 0x',s1);



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