ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.06.2021

Просмотров: 3566

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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 

          -> 

генерируется

 

программой

): '); 


background image

Криптографическая

 

система

 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); 


background image

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('

К

 

сожалению

подходящего

 

простого

 

числа

 

не

 

найдено

!'); 


background image

Криптографическая

 

система

 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); 


background image

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}