Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Возведение в степень по модулю
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Возведение в степень по модулю

Страниц (1): [1]
 

1. iflight - 30 Апреля, 2011 - 11:02:58 - перейти к сообщению
По учебе надо реализовать RSA(http://ru.wikipedia.org/wiki/RSA) в примитивном виде, т.е. ключи можно брать достаточно маленькие.
Сами ключи вроде как сгенерировал, хоть и понимаю что далеко не лучшим способом.

PHP:
скопировать код в буфер обмена
  1. function is_easy($numb) {                       //функция проверки на чистоту
  2.  if(($numb % $i) == 0) { return false; break;}
  3.  }
  4.  return true;
  5. }
  6.  
  7. function get_nod($a,$b) { //нахождение НОД по алгоритму Евклида
  8. $ar=$a;
  9. $br=$b;
  10.         do{
  11.                 if($ar<$br){
  12.                 $br=$br%$ar;
  13.                 }else{
  14.                 $ar=$ar%$br;
  15.                 }
  16.         } while($ar!==0 && $br!==0);
  17. return max($ar,$br);   
  18. }
  19.  
  20.  
  21.  
  22. do {            // Генерим простое число p
  23. $p=mt_rand(100,500);
  24. } while(is_easy($p)<> true);
  25.  
  26. do {                // Генерим простое число q
  27. $q=mt_rand(100,500);
  28. } while(is_easy($q)<> true);
  29.  
  30. $n = $p*$q;  //считаем n
  31.  
  32. $eyler = ($p-1)*($q-1); // считаем функцию Эйлера
  33.  
  34. do {                // Генерим e
  35.         $e=mt_rand(3,50);
  36. } while(get_nod($e,$eyler)!==1);
  37.  
  38. do {                // Генерим d
  39.         $d=mt_rand();
  40. } while((($e*$d)%$eyler)!==1);


Ключи выходят например такие: q=439 n=184819 Эйлейр=183960 e=23 d=2121052239

Проблемма возникла на самом кодировании, т.е. возведении в степень по модулю. Использовал такую функцию:

PHP:
скопировать код в буфер обмена
  1. function powmod($a, $b, $c)
  2. {
  3.     $z = 1;
  4.  
  5.     while ($b)
  6.     {
  7.         if ($b % 2 == 0)
  8.         {
  9.              $b = $b/2;
  10.              $a = ($a * $a) % $c;
  11.         }
  12.         else
  13.         {
  14.              $b--;
  15.              $z = ($z * $a) % $c;
  16.          }
  17.      }
  18.      return $z;
  19. }

С мелкими числами считает нормально (например ключи (3,33) и (7,33)), но с сгенерированными мною нет, подставлял пример из вики, так же считает не правильно.

В таком программировании не шарю) Весь опыт работы с php сводится к web) Подскажите, может где ошибка, направьте на путь истинный)
2. Haron - 30 Апреля, 2011 - 12:12:09 - перейти к сообщению
http://www.php.su/learnphp/operators/?arith
Цитата:
Операция вычисления остатка от деления "%" работает только с целыми числами, так что применение ее к дробным может привести к нежелательному результату.


Оно?
3. iflight - 30 Апреля, 2011 - 20:14:05 - перейти к сообщению
Хм, а где там дробные могут получиться? Везде все целое вроде как.

 

Powered by ExBB FM 1.0 RC1