Продолжение листинга 18.1. WriteLn('n = p*q = ',s1); // z =(p-1)*(q-1) s1 := '1'; BN_dec_to_bignum(s1,none); BN_a_sub_b(p,none,n1); BN_a_sub_b(q,none,n2); BN_a_mul_b(n1,n2,z)

WriteLn('n = p*q = ',s1);
// z =(p-1)*(q-1)
s1:= '1'; BN_dec_to_bignum(s1,none);
BN_a_sub_b(p,none,n1);
BN_a_sub_b(q,none,n2);
BN_a_mul_b(n1,n2,z);
BN_bignum_to_dec(z,s1);
WriteLn('z = (p-1)*(q-1) = ',s1);
// d
WriteLn('Введите большое десятичное значение, которое будет
использовано в качестве открытого ключа (Enter ->
генерируется программой): ');
ReadLn(s1);
BN_dec_to_bignum(s1,d);
BN_bignum_to_dec(d,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();
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);
if (s1<>s2) then
begin
WriteLn('СБОЙ: расшифрованное значение не совпадает
с исходным!');
WriteLn('Нажмите Enter для выхода.'); ReadLn;
Halt(1);
end;
WriteLn('OK');
WriteLn;
//Техническая информация.
WriteLn('--------------------------------------------------');
BN_bignum_to_hex(e,s1);
WriteLn(' e = 0x',s1,' (',BN_a_upbit(e),'bit)');
BN_bignum_to_hex(d,s1);
WriteLn(' d = 0x',s1,' (',BN_a_upbit(d),'bit)');
BN_bignum_to_hex(n,s1);
WriteLn(' n = 0x',s1,' (',BN_a_upbit(n),'bit)');
WriteLn('--------------------------------------------------');
WriteLn;
WriteLn(' Размер блока исходного текста: ',IntToStr(BN_a_upbit(n)-1),' бит');
WriteLn(' Размер блока зашифрованного текста: ',IntToStr(BN_a_upbit(n)),' bit');
WriteLn;
WriteLn('Нажмите Enter для выхода.'); ReadLn;
end.

Листинг 18.2. Вспомогательный модуль uBigNumber

unit uBigNumber;
{$IFDEF FPC}
{$MODE DELPHI}
{$ASMMODE INTEL}
{$ENDIF}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: