Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> RSA - błąd w kodzie?, Odszyfrowana wiadomość różni się od szyfrowanej
Ardzej16
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 21.04.2017

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 14:30