ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.06.2021
Просмотров: 3566
Скачиваний: 3
376
Глава
18.
Криптографическая
защита
Продолжение
листинга
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
begin
WriteLn('
К
сожалению
,
простое
число
не
найдено
!');
WriteLn('
Нажмите
Enter
для
выхода
.'); ReadLn;
Halt(1);
end;
BN_bignum_to_dec(p,s1);
WriteLn('
Первое
простое
число
p = ',s1);
//q
WriteLn('
Введите
большое
десятичное
значение
,
которое
будет
использовано
в
качестве
второго
простого
числа
(Enter
->
генерируется
программой
): ');
Криптографическая
система
RSA
377
Продолжение
листинга
18.1
ReadLn(s1);
BN_dec_to_bignum(s1,q);
BN_bignum_to_dec(q,s2);
if (s1<>s2) then
begin
if (s1<>'') then WriteLn('
Число
задано
неверно
!');
s1 := '0'; BN_dec_to_bignum(s1,q);
for i := 0 to BIGNUM_DWORD do n1[i] := MyRandom();
BN_a_shr_k(n1,(BIGNUM_DWORD+1)*32-maxbit,q);
BN_bignum_to_dec(q,s2);
WriteLn('
Сгенерированное
число
: ',s2);
end;
WriteLn('
Поиск
первого
простого
числа
...
Ждите
...');
q[0] := q[0] or 1;
s1 := '2'; BN_dec_to_bignum(s1,ntwo);
j := 0;
while (BN_PrimeTest(q)=0) and (j<8192) do
begin
BN_a_add_b(q,ntwo,n1);
Move(n1,q,sizeof(n1));
Write('.');
end;
WriteLn;
if (j>=8192) then
begin
WriteLn('
К
сожалению
,
простое
число
не
найдено
!');
WriteLn('
Нажмите
Enter
для
выхода
.'); ReadLn;
end;
BN_bignum_to_dec(q,s1);
WriteLn('
Второе
простое
число
q = ',s1);
WriteLn;
//n = p*q
BN_a_mul_b(p,q,n);
BN_a_div_b(n,q,n1);
if (BN_a_cmp_b(p,n1)<>0) then
begin
WriteLn('
К
сожалению
,
результат
умножения
p*q
слишком
велик
!');
WriteLn('
Нажмите
Enter
для
выхода
.'); ReadLn;
Halt(1);
end;
BN_bignum_to_dec(n,s1);
378
Глава
18.
Криптографическая
защита
Продолжение
листинга
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);
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('
К
сожалению
,
подходящего
простого
числа
не
найдено
!');
Криптографическая
система
RSA
379
Продолжение
листинга
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);
380
Глава
18.
Криптографическая
защита
Окончание
листинга
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}