Algoritm RSA | algoritm usted pentru criptarea și decriptarea mesajelor
RSA (Rivest-Shamir-Adleman) este un algoritm utilizat de computerele moderne pentru criptarea și decriptarea mesajelor. Este un algoritm criptografic asimetric. Asimetric înseamnă că există două chei diferite. Acesta se mai numește și criptografie cu cheie publică, deoarece una dintre chei poate fi dată oricui. Cealaltă cheie trebuie să fie păstrată privată. Algoritmul se bazează pe faptul că găsirea factorilor unui număr compus mare este dificilă: atunci când factorii sunt numere prime, problema se numește factorizare primă. Este, de asemenea, un generator de perechi de chei (cheie publică și cheie privată).
RSA implică o cheie publică și o cheie privată. Cheia publică poate fi cunoscută de toată lumea - este utilizată pentru a cripta mesaje. Mesajele criptate cu ajutorul cheii publice pot fi decriptate numai cu ajutorul cheii private. Cheia privată trebuie să fie păstrată secretă. Calcularea cheii private din cheia publică este foarte dificilă.
Concepte utilizate
RSA utilizează o serie de concepte din domeniul criptografiei:
- O funcție unidirecțională care este ușor de calculat; găsirea unei funcții care să o inverseze sau calcularea acestei funcții este foarte dificilă.
- RSA utilizează un concept numit logaritm discret. Acesta funcționează la fel ca logaritmul normal: Diferența constă în faptul că se folosesc numai numere întregi și, în general, este implicată o operație de modul. De exemplu, ax =b, modulo n. Logaritmul discret constă în găsirea celui mai mic x care satisface ecuația, atunci când sunt furnizate a b și n
- Acesta este potențial contracarat de algoritmul lui Shor.
Generarea cheilor
Cheile pentru algoritmul RSA sunt generate în felul următor:
- Alegeți două numere prime aleatoare mari și diferite și . Acest lucru trebuie păstrat secret.
- Calculați .
- este modulul pentru cheia publică și cheile private.
- Calculați totientul: ϕ .
- Alegeți un număr întreg astfel încât ϕ , iar este co-primă cu ϕ
adică: și ϕ nu au în comun alți factori decât : ; A se vedea cel mai mare divizor comun. - este lansat ca exponent al cheii publice.
- Calculați pentru a satisface relația de congruență .
adică: pentru un număr întreg . (Pur și simplu să spunem: Se calculează pentru a fi un număr întreg) - este păstrat ca exponent al cheii private.
Observații privind etapele de mai sus:
- Pasul 1: Numerele pot fi testate probabilistic pentru primalitate.
- Pasul 3: modificat în PKCS#1 v2.0 în în loc de ϕ .
- Pasul 4: O alegere populară pentru exponenții publici este . Unele aplicații aleg valori mai mici, cum ar fi , sau . Acest lucru se face pentru ca criptarea și verificarea semnăturilor să fie mai rapide pe dispozitive mici, cum ar fi cardurile inteligente, dar exponenții publici mici pot duce la riscuri de securitate mai mari.
- Etapele 4 și 5 pot fi realizate cu algoritmul Euclidian extins ; a se vedea aritmetica modulară.
Cheia publică
este formată din modulul și exponentul public (sau de criptare) . Cheia personală
este formată din p,q și exponentul privat (sau de decriptare) , care trebuie păstrat secret.
- Pentru eficiență, se poate stoca o formă diferită a cheii private:
- și : numerele prime de la generarea cheii;
- și : adesea numite dmp1 și dmq1;
- : adesea numit iqmp.
- Toate părțile cheii private trebuie să fie păstrate secrete în această formă. și sunt sensibile, deoarece sunt factorii lui și permit calcularea lui dat fiind . În cazul în care și nu sunt stocate în această formă a cheii private, atunci acestea sunt șterse în siguranță împreună cu alte valori intermediare de la generarea cheii.
- Deși această formă permite decriptarea și semnarea mai rapidă prin utilizarea teoremei chinezești a restului (CRT), este considerabil mai puțin sigură, deoarece permite atacuri prin canal lateral . Aceasta este o problemă deosebită dacă este implementată pe carduri inteligente, care beneficiază cel mai mult de eficiența îmbunătățită.
(Începeți cu și lăsați cardul să decripteze asta. Deci, calculează sau , ale căror rezultate dau o anumită valoare . Acum, induceți o eroare în unul dintre calcule. Atunci va dezvălui sau ).
Criptarea mesajului
Alice îi dă cheia sa publică
lui Bob și își păstrează secretă cheia privată. Bob dorește să trimită mesajul către Alice.În primul rând, el transformă
într-un număr mai mic decât prin utilizarea unui protocol reversibil convenit, cunoscut sub numele de schemă de umplere. El calculează apoi textul cifrat care corespunde:
Acest lucru se poate face rapid folosind metoda exponențializării prin ridicarea la pătrat. Bob trimite apoi
către Alice.Decriptarea mesajului
Alice poate recupera
de la folosind cheia sa privată în următoarea procedură:Dat fiind
, ea poate recupera numerele prime distincte originale, aplicând teorema restului chinezesc la aceste două congruențe rezultă.
Astfel,
.
Prin urmare:
Un exemplu de lucru
Iată un exemplu de criptare și decriptare RSA. Numerele prime utilizate aici sunt prea mici pentru a ne permite să criptăm ceva în siguranță. Puteți utiliza OpenSSL pentru a genera și examina o pereche de chei reală.
1. Alegeți două numere prime aleatoare și :
și ;
2. Calculați :
;
3. Calculați totienul ϕ :
;
4. Alegeți coprimă cu :
;
5. Alegeți pentru a satisface :
, cu .
Cheia publică este ( , ). Pentru un mesaj umplut funcția de criptare devine:
Cheia privată este (
, ). Funcția de decriptare devine:
De exemplu, pentru a cripta , se calculează
Pentru a decripta
, se calculează
Ambele calcule pot fi efectuate rapid și ușor cu ajutorul algoritmului pătrat și înmulțire pentru exponențierea modulară.
Derivarea ecuației RSA din teorema lui Euler
RSA poate fi ușor de derivat folosind teorema lui Euler și funcția de totizare a lui Euler.
Începând cu teorema lui Euler,
trebuie să arătăm că decriptarea unui mesaj criptat, cu ajutorul cheii corecte, va da mesajul original. Dat fiind un mesaj umplut m, textul cifrat c se calculează astfel
Înlocuind în algoritmul de decriptare, avem
Vrem să arătăm că această valoare este, de asemenea, congruentă cu m. Valorile lui e și d au fost alese pentru a satisface,
Adică, există un număr întreg k, astfel încât
Acum înlocuim mesajul criptat și apoi decriptat,
Aplicăm teorema lui Euler și obținem rezultatul.
Scheme de umplere
Atunci când este utilizat în practică, RSA trebuie combinat cu o anumită formă de schemă de umplere, astfel încât nicio valoare a lui M să nu conducă la texte cifrate nesigure. RSA utilizat fără padding poate avea unele probleme:
- Valorile m = 0 sau m = 1 produc întotdeauna texte cifrate egale cu 0 sau, respectiv, 1, datorită proprietăților exponențializării.
- Atunci când se criptează cu exponenți de criptare mici (de exemplu, e = 3) și valori mici ale lui m, rezultatul (nemodular) al lui poate fi strict mai mic decât modulul n. În acest caz, textele cifrate pot fi decriptate cu ușurință prin luarea rădăcinii etice a textului cifrat, fără a se ține seama de modul.
- Criptarea RSA este un algoritm de criptare determinist. Acesta nu are nicio componentă aleatorie. Prin urmare, un atacator poate lansa cu succes un atac de tip "chosen plaintext" împotriva criptosistemului. Acesta poate crea un dicționar prin criptarea unor plajexuri probabile sub cheia publică și stocarea textelor cifrate rezultate. Atacatorul poate apoi să observe canalul de comunicare. De îndată ce vede textele cifrate care se potrivesc cu cele din dicționarul lor, atacatorii pot folosi acest dicționar pentru a afla conținutul mesajului.
În practică, primele două probleme pot apărea atunci când se trimit mesaje ASCII scurte. În astfel de mesaje, m poate fi concatenarea unuia sau mai multor caractere codate ASCII. Un mesaj format dintr-un singur caracter ASCII NUL
(a cărui valoare numerică este 0) ar fi codificat ca m = 0, ceea ce produce un text cifrat de 0, indiferent de valorile lui e și N utilizate. De asemenea, un singur caracter ASCII SOH
(a cărui valoare numerică este 1) ar produce întotdeauna un text cifrat de 1. Pentru sistemele care utilizează în mod convențional valori mici ale lui e, cum ar fi 3, toate mesajele cu un singur caracter ASCII codificate folosind această schemă ar fi nesigure, deoarece cel mai mare m ar avea o valoare de 255, iar 2553 este mai mic decât orice modul rezonabil. Astfel de texte în clar ar putea fi recuperate prin simpla extragere a rădăcinii cubice a textului cifrat.
Pentru a evita aceste probleme, implementările practice RSA integrează de obicei o formă de umplutură structurată și aleatorie în valoarea m înainte de a o cripta. Această umplutură garantează că m nu se încadrează în intervalul de plagiate nesigure și că un anumit mesaj, odată umplut, va fi criptat într-unul dintre numeroasele texte cifrate posibile. Această din urmă proprietate poate crește costul unui atac prin dicționar dincolo de capacitățile unui atacator rezonabil.
Standarde precum PKCS au fost concepute cu atenție pentru a proteja mesajele înainte de criptarea RSA. Deoarece aceste sisteme umplu textul clar m cu un anumit număr de biți suplimentari, dimensiunea mesajului M neumplut trebuie să fie ceva mai mică. Schemele de umplere RSA trebuie să fie proiectate cu atenție pentru a preveni atacurile sofisticate. Acest lucru poate fi facilitat de o structură previzibilă a mesajului. Primele versiuni ale standardului PKCS foloseau construcții ad-hoc, care s-au dovedit ulterior vulnerabile la un atac practic de tip adaptive chosen ciphertext. Construcțiile moderne utilizează tehnici sigure, cum ar fi OAEP (Optimal asymmetric encryption padding), pentru a proteja mesajele, prevenind în același timp aceste atacuri. Standardul PKCS are, de asemenea, scheme de procesare concepute pentru a oferi o securitate suplimentară pentru semnăturile RSA, de exemplu, schema de semnătură probabilistică pentru RSA (RSA-PSS).
Semnarea mesajelor
Să presupunem că Alice utilizează cheia publică a lui Bob pentru a-i trimite un mesaj criptat. În mesaj, ea poate pretinde că este Alice, dar Bob nu are nicio modalitate de a verifica dacă mesajul provine într-adevăr de la Alice, deoarece oricine poate folosi cheia publică a lui Bob pentru a-i trimite mesaje criptate. Așadar, pentru a verifica originea unui mesaj, RSA poate fi folosit și pentru a semna un mesaj.
Să presupunem că Alice dorește să trimită un mesaj semnat lui Bob. Ea produce o valoare hash a mesajului, o ridică la puterea lui d mod n (la fel ca atunci când decriptează un mesaj) și o atașează ca "semnătură" la mesaj. Când Bob primește mesajul semnat, el ridică semnătura la puterea lui e mod n (la fel ca la criptarea unui mesaj) și compară valoarea hash rezultată cu valoarea hash reală a mesajului. Dacă cele două corespund, Bob știe că autorul mesajului a fost în posesia cheii secrete a lui Alice și că mesajul nu a fost modificat de atunci.
Rețineți că schemele de umplere securizată, cum ar fi RSA-PSS, sunt la fel de esențiale pentru securitatea semnării mesajelor ca și pentru criptarea mesajelor și că nu trebuie folosită niciodată aceeași cheie atât pentru criptare, cât și pentru semnare.
Întrebări și răspunsuri
Î: Ce este RSA?
R: RSA (Rivest-Shamir-Adleman) este un algoritm folosit de computerele moderne pentru a cripta și decripta mesaje. Este un algoritm criptografic asimetric.
Î: Ce înseamnă asimetric?
R: Asimetric înseamnă că există două chei diferite - o cheie publică și o cheie privată.
Î: Care este baza algoritmului RSA?
R: Algoritmul se bazează pe faptul că găsirea factorilor unui număr compus mare este dificilă - atunci când factorii sunt numere prime, această problemă se numește factorizare primă.
Î: Cum funcționează RSA?
R: RSA implică o cheie publică și o cheie privată. Cheia publică poate fi cunoscută de toată lumea - este utilizată pentru a cripta mesaje. Mesajele criptate cu ajutorul cheii publice pot fi decriptate numai cu ajutorul cheii private, care trebuie să fie ținută secretă. Calcularea cheii private din cheia publică este foarte dificilă.
Î: Există o altă denumire pentru acest tip de criptografie?
R: Acest tip de criptografie se mai numește și criptografie cu cheie publică, deoarece una dintre chei poate fi dată oricui, păstrând-o pe cealaltă privată.
Î: RSA generează o pereche de chei?
R: Da, RSA generează o pereche de chei - o cheie publică și una privată - care sunt utilizate pentru criptare și, respectiv, decriptare.