Schema de semnătură probabilistică a lui Rabin este o metodă de semnătură digitală propusă inițial de Michael O. Rabin în 1979 [1] . Schema de semnătură a lui Rabin a fost una dintre primele scheme de semnătură digitală propuse și este singura care leagă direct complexitatea falsificării semnăturii cu problema factorizării întregi . Algoritmul de semnătură al lui Rabin este nepotrivit într-un model de calcul aleator aleator care presupune că problema factorizării întregi este indecidabilă. Schema de semnătură Rabin este, de asemenea, strâns legată de criptosistemul Rabin .
Algoritmul original nu folosește funcții hash și este considerat nesigur. [2]
Algoritmul sigur și securizat [3] se bazează pe o funcție hash rezistentă la coliziuni .
În majoritatea vizualizărilor, algoritmul este simplificat prin alegerea . Se presupune că funcția hash cu numărul de biți de ieșire este un oracol aleatoriu și algoritmul funcționează după cum urmează:
Generarea cheilorÎn unele implementări ale algoritmului, valoarea nu este utilizată. În schimb, este posibil să înmulțim valoarea hash cu două numere a sau b cu proprietăți și , unde denotă simbolul Legendre . Apoi, pentru orice modulo, doar unul dintre cele patru numere va fi un modulo pătrat , iar acest număr este ales pentru a semna digital mesajul.
Pentru a simplifica și mai mult algoritmul, trebuie să schimbați mesajul până când semnătura trece de verificare.
\\ Funcția de schimbare a mesajului pentru verificarea semnăturii def root ( m : str , p , q ): while True : x = h ( m ) sig = pow ( p , q - 2 , q ) * p * pow ( x , ( q ) + 1 ) / 4 , q ) sig = ( pow ( q , p - 2 , p ) * q * pow ( x , ( p + 1 ) / 4 , p ) + sig ) % ( nrabin ) dacă ( sig * sig ) ) % nrabin == x : print ( „Scrieți mesajul extins în fișierul m.txt” ) f = deschis ( 'm.txt' , 'w' ) f . scrie ( m ) f . close () break m = m + ' ' return sigDacă funcția hash este un oracol aleatoriu, adică ieșirea sa este cu adevărat aleatorie la , atunci falsificarea unei semnături pentru orice mesaj este la fel de dificilă precum calcularea rădăcinii pătrate a unui element aleatoriu din .
Pentru a demonstra [4] că obținerea unei rădăcini pătrate aleatoare este la fel de dificilă ca și factorizarea, trebuie remarcat că în majoritatea cazurilor există patru rădăcini pătrate diferite, deoarece are două rădăcini pătrate modulo și două rădăcini pătrate modulo , iar fiecare pereche dă un rădăcină pătrată modulo după teorema chineză a restului . Unele dintre rădăcini pot avea aceeași valoare, dar probabilitatea ca aceasta este extrem de mică.
Dacă este posibil să găsim două rădăcini pătrate diferite astfel încât dar , atunci aceasta duce imediat la o factorizare a lui , deoarece factorii primi sunt divizibili cu , dar nu divizibili. Deci, calculul va avea ca rezultat o factorizare non-trivială .
Acum se presupune că există un algoritm eficient pentru găsirea a cel puțin o rădăcină pătrată. Apoi se alege un modulo aleator și se pune la pătrat , după folosirea algoritmului, se ia rădăcina pătrată a modulo și se obține o nouă rădăcină , care cu o probabilitate de 50% .
Smart N. Criptografie. - M .: Technosfera, 2005. S. 525.