Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: RSA - błąd w kodzie?
Forum PHP.pl > Forum > PHP
Ardzej16
Witam.
Mam nadzieję, że to dobry dział.
Mam problem z RSA w PHP.
Napisałem prosty kod testowy szyfrujący i deszyfrujący prostą wiadomość (np. liczbę 16).
Szyfrowanie przebiega pomyślnie, deszyfracja też w większości przypadków, jednak owy problem pojawia się czasem. Mianowicie, źle odszyfrowuje.

Może dokładniej, dla przykładu:
Szyfruje liczbę 6 a następnie szyfrogram odszyfrowuje.
I tu pojawia się problem. W większości przypadków wszystko działa jak należy lecz zdarza się dość często że wiadomość odszyfrowana nie zgadza się z wiadomością szyfrowaną.

Gdzie może być błąd?

  1. <?php
  2.  
  3.  
  4. function nwd( $a, $b )
  5. {
  6. while( $b != 0)
  7. {
  8. $t = $b;
  9. $b = $a % $b;
  10. $a = $t;
  11. };
  12. return $a;
  13. }
  14.  
  15. function odwr_mod( $a, $n)
  16. {
  17. $p0 = 0; $p1 = 1; $a0 = $a; $n0 = $n;
  18. $q = $n0 / $a0;
  19. $r = $n0 % $a0;
  20. while($r > 0)
  21. {
  22. $t = $p0 - $q * $p1;
  23. if( $t >= 0)
  24. $t = $t % $n;
  25. else
  26. $t = $n - ((-$t) % $n);
  27. $p0 = $p1; $p1 = $t;
  28. $n0 = $a0; $a0 = $r;
  29. $q = $n0 / $a0;
  30. $r = $n0 % $a0;
  31. }
  32. return $p1;
  33. }
  34.  
  35. {
  36.  
  37. $tp = array(11,13,17,19,23,29,31,37,41,43) ;
  38.  
  39. do
  40. {
  41. do
  42. {
  43. $p = $tp[rand() % 10];
  44. $q = $tp[rand() % 10];
  45. // $p=13;
  46. // $q=11;
  47. } while( $p == $q ) ;
  48.  
  49. $phi = ($p - 1) * ($q - 1);
  50. $n = $p * $q;
  51.  
  52.  
  53. for($e = 3; nwd($e,$phi) != 1; $e += 2);
  54.  
  55. $d = odwr_mod($e,$phi);
  56. } while( $d >= $phi ) ;
  57.  
  58.  
  59. echo "P=$p<br />Q=$q<br />Phi=$phi<br /><br />";
  60.  
  61. echo "KLUCZ PUBLICZNY<br />
  62. wykladnik e = ".$e.
  63. "<br /> modul n = ".$n.
  64. "<br /><br />KLUCZ PRYWATNY<br />".
  65. "wykladnik d = ".$d ;
  66.  
  67. }
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. function pot_mod( $a, $w, $n)
  79. {
  80.  
  81. $pot = $a; $wyn = 1;
  82. for($q = $w; $q > 0; $q /= 2)
  83. {
  84. if($q % 2) $wyn = ($wyn * $pot) % $n;
  85. $pot = ($pot * $pot) % $n;
  86. }
  87. return $wyn;
  88. }
  89.  
  90.  
  91.  
  92. // Odszyfrowuje:
  93. {
  94. $t = 16 ;
  95. echo "<br /><br />T=".$t;
  96. $c = pot_mod($t,$e,$n);
  97. echo "<br />C=$c" ;
  98.  
  99.  
  100.  
  101.  
  102.  
  103. $c1 = pot_mod($c,$d,$n);
  104. echo "<br />C1=$c1" ;
  105. }


Jak już pisałem kod jest całkowicie testowy.
Załączę jeszcze screen.



Pozdrawiam.
bostaf
Jest małe przeoczenie w funkcji obliczającej odwrotność modularną odwr_mod(). Wynik dzielenia w wierszach 18 i 29 powinien być częścią całkowitą tego dzielenia, czyli zamiast
Kod
$q  = $n0 / $a0;


daj
Kod
$q  = intval($n0 / $a0);

albo
Kod
$q  = (int) ($n0 / $a0);

albo
Kod
$q  = floor($n0 / $a0);

Ardzej16
To właśnie był błąd.
Problem rozwiązany.
Dziękuje serdecznie i pozdrawiam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.