RSA: Diferență între versiuni
→Bibliografie: iw |
m wl |
||
(Nu s-au afișat 47 de versiuni intermediare efectuate de alți 19 utilizatori) | |||
Linia 1: | Linia 1: | ||
{{pentru|Republica Sud-Africană|Africa de Sud}} |
|||
În [[criptografie]], '''RSA''' este un algoritm criptografic cu chei publice, primul algoritm utilizat atât pentru criptare, cât şi pentru semnătura electronică. Algoritmul a fost dezvoltat în 1977 şi publicat în 1978 de [[Ron Rivest]], [[Adi Shamir]] şi [[Leonard Adleman]] la [[MIT]] şi îşi trage numele de la iniţialele numelor celor trei autori.<ref>Schneier, 1996, p. 385</ref> |
|||
În [[criptografie]], '''RSA''' este un algoritm criptografic cu chei publice, primul algoritm utilizat atât pentru criptare, cât și pentru semnătura electronică. Algoritmul a fost dezvoltat în 1977 și publicat în 1978 de [[Ron Rivest]], [[Adi Shamir]] și [[Leonard Adleman]] la [[MIT]] și își trage numele de la inițialele numelor celor trei autori.<ref>Schneier, 1996, p. 385</ref> |
|||
Puterea sa criptografică se bazează pe dificultatea [[Factorizarea întregilor|problemei factorizării numerelor întregi]], problemă la care se reduce criptanaliza RSA și pentru care toți algoritmii de rezolvare cunoscuți au [[Teoria complexității|complexitate]] exponențială. Există însă câteva metode de criptanaliză care ocolesc factorizarea efectivă, exploatând maniere eronate de implementare efectivă a schemei de criptare. |
|||
==Funcţionare== |
|||
RSA este un algoritm de criptare pe blocuri. Aceasta înseamnă că atât textul clar cât şi cel cifrat sunt numere între ''0'' şi ''n''-1, cu un ''n'' ales. Un mesaj de dimensiune mai mare decât <math>log\,n</math> este împărţit în segmente de lungime corespunzătoare, numite ''blocuri'', care sunt cifrate rând pe rând.<ref>Stallings, 2005, p. 269</ref> De asemenea, ca algoritm criptografic cu chei publice, funcţionează pe baza unei perechi de chei legate matematic între ele: o cheie publică, cunoscută de toată lumea, şi una secretă, necunoscută decât de deţinătorul acesteia. |
|||
== Funcționare == |
|||
===Generarea cheilor=== |
|||
RSA este un algoritm de criptare pe blocuri. Aceasta înseamnă că atât textul clar cât și cel cifrat sunt numere între ''0'' și ''n''-1, cu un ''n'' ales. Un mesaj de dimensiune mai mare decât <math>log\,n</math> este împărțit în segmente de lungime corespunzătoare, numite ''blocuri'', care sunt cifrate rând pe rând.<ref>Stallings, 2005, p. 269</ref> De asemenea, ca algoritm criptografic cu chei publice, funcționează pe baza unei perechi de chei legate matematic între ele: o cheie publică, cunoscută de toată lumea, și una secretă, cunoscută doar de deținătorul acesteia. |
|||
Perechea de chei se generează după următorii paşi<ref>Menezes, p. 286</ref>: |
|||
#Se generează două numere prime, de preferat mari, ''p'' şi ''q''; |
|||
#Se calculează <math>n\,=\,pq</math> şi <math>\phi\,=\,(p-1)(q-1)</math> |
|||
#Se alege un întreg aleator ''e'', <math>1 < e < \phi</math> astfel încât cmmdc(e, φ) = 1. Perechea (n, e) este cheia publică. |
|||
#Folosind [[algoritmul lui Euclid]] extins, se calculează întregul ''d'', unicul cu proprietatea că <math>de\,\equiv\,1\,mod\,\phi</math>. (n, d) constituie cheia secretă. |
|||
=== Generarea cheilor === |
|||
Decizia cu privire la care dintre ''e'' şi ''d'' este cheia publică şi care este cea privată este, din punct de vedere matematic, arbitrară, oricare dintre cele două numere poate juca oricare dintre roluri<ref>Schneier, 1996, p. 387</ref>. În practică însă, pentru a mări viteza de criptare, şi întrucât dintre cele două numere ''e'' este cel ales arbitrar, ''e'' se alege un număr mic, de regulă 3, 17 sau 65537 (2<sup>16</sup>+1)<ref name="stallings_274">Stallings, 2005, p. 274</ref>. Aceasta conduce la un număr minim de înmulţiri, deci la o performanţă sporită, deoarece toate aceste numere au doar două cifre 1 în reprezentarea lor binară<ref name="stallings_274"/>. |
|||
Perechea de chei se generează după următorii pași<ref>Menezes, p. 286</ref>: |
|||
# Se generează două numere prime, de preferat mari, ''p'' și ''q''; |
|||
# Se calculează <math>n\,=\,pq</math> și <math>\phi\,=\,(p-1)(q-1)</math> |
|||
# Se alege un întreg aleator ''e'', <math>1 < e < \phi</math> astfel încât cmmdc(e, φ) = 1. Perechea (n, e) este cheia publică. |
|||
# Folosind [[algoritmul lui Euclid]] extins, se calculează întregul ''d'', unicul cu proprietatea că <math>de\,\equiv\,1\,mod\,\phi</math>. (n, d) constituie cheia secretă. |
|||
Decizia cu privire la care dintre ''e'' și ''d'' este cheia publică și care este cea secretă este, din punct de vedere matematic, arbitrară, oricare dintre cele două numere poate juca oricare dintre roluri<ref>Schneier, 1996, p. 387</ref>. În practică însă, pentru a mări viteza de criptare, și întrucât dintre cele două numere ''e'' este cel ales arbitrar, ''e'' este cheia publică iar valoarea sa este aleasă un număr mic, de regulă 3, 17 sau 65537 (2<sup>16</sup>+1)<ref name="stallings_274">Stallings, 2005, p. 274</ref>. Aceasta conduce la un număr minim de înmulțiri, deci la o performanță sporită, deoarece toate aceste numere au doar două cifre 1 în reprezentarea lor binară<ref name="stallings_274"/>. |
|||
===Criptarea şi decriptarea=== |
|||
=== Criptarea și decriptarea === |
|||
Presupunând că mesajul clar este sub forma unui număr ''m'', mai mic decât ''n'', atunci mesajul cifrat, notat cu ''c'' este |
Presupunând că mesajul clar este sub forma unui număr ''m'', mai mic decât ''n'', atunci mesajul cifrat, notat cu ''c'' este |
||
:<math>c\,=\,m^e\, |
:<math>c\,=\,m^e\,\pmod{n}</math> |
||
unde ''e'' este cheia publică a destinatarului mesajului. Pentru a decripta mesajul, destinatarul |
unde ''e'' este cheia publică a destinatarului mesajului. Pentru a decripta mesajul, destinatarul își folosește cheia sa secretă ''d'', care are proprietatea foarte importantă că: |
||
:<math>de\,\equiv\,1\,mod\,\phi</math> |
:<math>de\,\equiv\,1\,mod\,\phi</math> |
||
Astfel, mesajul clar este recuperat calculând: |
Astfel, mesajul clar este recuperat calculând: |
||
:<math>m\,=\,c^d\ |
:<math>m\,=\,c^d\pmod{n}</math> |
||
Oricine poate cripta mesaje cu cheia publică a destinatarului, dar numai acesta din urmă poate decripta, deoarece trebuie să folosească cheia sa secretă. |
Oricine poate cripta mesaje cu cheia publică a destinatarului, dar numai acesta din urmă poate decripta, deoarece trebuie să folosească cheia sa secretă. |
||
Algoritmul poate fi folosit |
Algoritmul poate fi folosit și pentru semnătura electronică, folosind cheile invers. Dacă o entitate criptează un mesaj (sau mai degrabă un [[Funcție hash|hash]] al acestuia) cu cheia sa secretă și atașează rezultatul mesajului său, atunci oricine poate verifica, decriptând cu cheia publică a semnatarului și comparând rezultatul cu mesajul clar (sau cu hash-ul acestuia), că într-adevăr acea entitate este autorul mesajului. |
||
==== Demonstrația formulei de decriptare ==== |
|||
==Note== |
|||
Formula de decriptare este valabilă, deoarece<ref>Demonstrație similară cu cea din Menezes, p. 286</ref>: |
|||
{{Reflist}} |
|||
:<math>c^d\,mod\,n\,=\,m^{ed}\,mod\,n</math> |
|||
:<math>ed \equiv 1 \pmod{\phi}</math> și, fiindcă <math>\phi=(p-1)(q-1)</math>, atunci |
|||
==Bibliografie== |
|||
:<math>ed \equiv 1 \pmod{p-1}</math> și |
|||
:<math>ed \equiv 1 \pmod{q-1}</math> |
|||
și deci se poate scrie: |
|||
:<math>ed=k(p-1)+1</math> |
|||
:<math>ed=h(q-1)+1</math> |
|||
Dar, cum ''p'' este prim, și deci prim cu m, conform [[Mica teoremă a lui Fermat|micii teoreme a lui Fermat]], rezultă că |
|||
:<math>m^{p-1}\,\equiv\,1\pmod{p}</math> |
|||
Astfel, |
|||
:<math>m^{ed} = m^{k (p-1) + 1} = (m^{p-1})^k m \equiv {1}^k m = m \pmod{p}\,</math>. |
|||
Dacă ''p'' nu este totuși prim cu ''m'', atunci înseamnă că ''m'' este [[multiplu]] al lui ''p'', caz trivial în care ''m'' este congruent cu 0 modulo ''p'', și deci ridicat la orice putere este congruent cu 0 și deci cu el însuși. |
|||
Analog și pentru ''q'', <math>m^{ed} \equiv m \pmod{q}</math> |
|||
De aici, conform [[Teorema chinezească a resturilor|teoremei chinezești a resturilor]], deoarece ''p'' și ''q'' sunt numere prime, rezultă că |
|||
:<math>m^{ed} \equiv m \pmod{pq}</math> |
|||
== Performanțe în implementări == |
|||
În general, deoarece se bazează pe o operație destul de costisitoare din punct de vedere al timpului de calcul și al resurselor folosite, și anume exponențierea modulo ''n'', viteza RSA este mult mai mică decât a algoritmilor de criptare cu cheie secretă.<ref>Menezes, p. 291</ref> [[Bruce Schneier]] estima, pe baza unor calcule efectuate în [[anii 1990]], că o implementare hardware de RSA este de 1000 de ori mai lentă decât o implementare [[DES]], iar în software, RSA este de 100 de ori mai lent. |
|||
Există anumite modificări care pot aduce performanțe sporite, precum alegerea unui exponent de criptare mic, care astfel reduce calculele necesare criptării, rezolvând în același timp și unele probleme de securitate.<ref name="schneier389">Schneier, p. 389</ref> De asemenea, operațiile cu cheia secretă pot fi accelerate pe baza [[Teorema chinezească a resturilor|teoremei chinezești a resturilor]], dacă se stochează ''p'', ''q'' și unele rezultate intermediare, folosite des.<ref name="schneier389"/> Cu toate acestea, îmbunătățirile nu sunt mari, iar ordinul de mărime al diferențelor de performanță față de implementările algoritmilor cu cheie secretă rămâne același. De aceea, în sistemele de comunicație în timp real, în care viteza de criptare și decriptare este esențială (cum ar fi, de exemplu, aplicațiile de streaming video sau audio securizate), RSA se folosește doar la începutul comunicației, pentru a transmite cheia secretă de comunicație, care ulterior este folosită într-un algoritm cu cheie secretă, cum ar fi [[3DES]] sau [[AES]]. |
|||
== Securitatea == |
|||
Problema decriptării unui mesaj criptat cu RSA este denumită ''problema RSA''. Aceasta constă în obținerea radicalului de ordin ''e'' modulo ''n'', unde ''e'' și ''n'' au proprietatea că ''n'' este produsul a două numere prime mari ''p'' și ''q'', iar ''e'' este [[Numere prime între ele|prim cu]] produsul dintre ''p-1'' și ''q-1''.<ref>Menezes, 2005, p. 98</ref> În acest moment, cea mai eficientă metodă de a realiza aceasta este [[Factorizarea întregilor|descompunerea în factori primi]] a lui ''n'', și obținerea astfel a cheii secrete ''d'' pe baza lui ''e''. Astfel, este demonstrat că dificultatea spargerii unui mesaj criptat cu RSA nu este mai dificilă decât problema factorizării. Nu a fost descoperită încă o altă soluție generală a problemei RSA, dar nici nu s-a demonstrat matematic că nu există o altă soluție.<ref name="Schneier390">Schneier, p. 390</ref><ref>Menezes, 2005, p. 99</ref> |
|||
[[Fișier:Nfs graph.png|thumb|right|240px|Graficul complexităţii celei mai bune metode de factorizare a întregilor în funcţie de lungimea reprezentării binare a numărului factorizat (pe abscisă, <code>log n</code>, adică numărul de cifre al numărului de factorizat; pe ordonată, ordinul de mărime al duratei de factorizare). Se observă că această complexitate este exponenţială, crescând foarte mult pentru numere mari]] |
|||
Factorizarea întregilor prin metodele comune ajută la găsirea soluțiilor în timp util doar pentru numere mici. Pentru numere mari, algoritmii de factorizare, cu complexitate exponențială, dau soluția după foarte mult timp. Cea mai rapidă metodă de factorizare a întregilor, algoritmul general al ciurului câmpurilor de numere, are o [[Complexitatea algoritmilor|complexitate]] de <math>o\left(e^{c((\log{n})^{\frac{1}{3}}(\log{\log{n}})^{\frac{2}{3}}}\right)</math><ref>Lenstra, p. 51</ref><ref name="nfs_wolfram">{{Citat web|author=Weisstein, Eric W.|title=Number Field Sieve|publisher=MathWorld--A Wolfram Web Resource|url=http://mathworld.wolfram.com/NumberFieldSieve.html}}</ref> Aici, ''c'' este un număr ce ia valori în jur de 1,9 pentru numere de tipul lui ''n'', adică numere cu doi factori primi. Cel mai mare număr factorizat vreodată prin acest algoritm, rulat în anul 2005, de către specialiști de la Agenția Federală Germană pentru Securitatea Tehnologiei Informației, are 200 de cifre zecimale, iar reprezentarea binară a factorilor primi obținuți ocupă 663 de biți.<ref>Stallings, p. 276</ref><ref>{{Citat web|title=RSA-200 Factored|url=http://mathworld.wolfram.com/news/2005-05-10/rsa-200/|author=Eric W. Weisstein|publisher=Mathworld news|date=[[10 mai]] [[2005]]}}</ref> Cheile de criptare RSA cele mai sigure au lungimi de peste 1024 de biți. |
|||
Atacul RSA prin metoda forței brute, adică încercarea fiecărei chei secrete posibile, consumă chiar mai mult timp decât factorizarea.<ref name="Schneier390"/> |
|||
=== Atacuri împotriva RSA === |
|||
Deși securitatea algoritmului RSA constă în legătura dintre acesta și [[factorizarea întregilor]], el trebuie folosit cu grijă în implementări, deoarece, în caz de folosire eronată, sistemele bazate pe RSA pot fi atacate în anumite maniere care ocolesc factorizarea efectivă a modulului, atacatorul ajungând să obțină mesajul clar sau cheia secretă. |
|||
==== Atac cu text cifrat ales ==== |
|||
În cazul atacului cu text cifrat ales, atacatorul dispune de cheia publică a entității atacate (exponentul de criptare ''e'' și modulul ''n''), și interceptează mesaje cifrate trimise acestuia. Pentru a obține mesajul clar ''m'' dintr-un mesaj cifrat ''c'', atacatorul poate proceda, de exemplu, astfel:<ref>Stallings, p. 280</ref> |
|||
# Calculează <math>x = (c \times 2^e) \pmod{n}</math> |
|||
# Trimite entității atacate spre semnare pe ''x'', obținând <math>y = x^d \pmod{n}</math> |
|||
# Se observă că <math>x = c \times 2^e \pmod{n} = m^e \times 2^e \pmod{n} = (2m)^e \pmod{n}</math> |
|||
# Se rezolvă ecuația <math>y = (2m) \pmod{n}</math> |
|||
Atacatorul obține astfel mesajul cifrat. Există mai multe feluri de atacuri cifrate,<ref>Mai multe exemple sunt descrise în Schneier, pp 390-391</ref> dar sunt câteva moduri de apărare împotriva lor. Unele pot fi evitate dacă pur și simplu entitatea protejată cu chei secrete refuză să semneze texte arbitrare trimise de terți.<ref>Schneier, p. 391</ref> Dacă acest lucru nu este posibil (ca de exemplu în cazul unui notar public care trebuie să semneze documente electronice prezentate de persoane străine), atunci atacul poate fi prevenit prin folosirea unei perechi diferite de chei pentru criptare și pentru semnătura electronică. De asemenea, este necesar să se folosească și un padding aleator pentru mesaj înainte de criptare sau, în cazul semnăturii, să nu se semneze mesajul clar, ci un [[Funcție hash|hash]] al acestuia. De asemenea, atacul poate fi evitat și dacă se impune o anumită structură predefinită mesajelor primite spre semnare.<ref>Menezes, p. 289</ref> |
|||
==== Mesaje necriptate ==== |
|||
Întrucât RSA se bazează pe ridicarea la putere (modulo un număr ''n''), există anumite părți de mesaje care nu sunt criptate, părți rezultate în urma împărțirii mesajului pe blocuri. Astfel de mesaje sunt mesajele ''m'' cu proprietatea că ''m''=''m<sup>x</sup>'' (mod ''n'') oricare ar fi ''x'', ca de exemplu ''m''=0, ''m''=1, ''m''=''n''-1. Numărul exact al acestor mesaje decriptate este <math>(1+cmmdc(e-1,p-1)) \cdot (1+cmmdc(e-1,q-1))</math><ref>Menezes, p. 290</ref>, și deci este de minim 9 (deoarece ''e'', ''p'' și ''q'' sunt impare). Pentru a micșora numărul de astfel de părți de mesaj, este util să se folosească un exponent public ''e'' cât mai mic. |
|||
==== Exponentul de criptare mic ==== |
|||
În unele aplicații, se folosește un exponent de criptare (public) mic, de exemplu 3, pentru a mări performanța, dar și pentru a rezolva unele probleme de securitate. Dacă mai multe entități care comunică folosesc același exponent public (dar fiecare are propriul modul și deci propria cheie secretă), atunci același mesaj trimis mai multor destinatari are următoarele valori: |
|||
:<math>c_1 = m^e \pmod{n_1}</math> |
|||
:<math>c_2 = m^e \pmod{n_2}</math> |
|||
:<math>c_3 = m^e \pmod{n_3}</math> |
|||
unde ''n<sub>i</sub>'' sunt modulele celor trei destinatari, ''e'' este exponentul comun acestora iar ''m'' este mesajul trimis tuturor celor trei. Un atacator poate folosi [[algoritmul lui Gauss]] pentru a descoperi o soluție mai mică decât ''n<sub>1</sub>n<sub>2</sub>n<sub>3</sub>'' a unui sistem compus din următoarele ecuații: |
|||
:<math>x = m^e \pmod{n_1}</math> |
|||
:<math>x = m^e \pmod{n_2}</math> |
|||
:<math>x = m^e \pmod{n_3}</math> |
|||
Această soluție este, conform [[Teorema chinezească a resturilor|teoremei chinezești a resturilor]], cubul mesajului ''m''.<ref>Menezes, p. 288</ref> Soluția pentru această problemă este cea denumită ''sărarea'' mesajului (din {{en|salting}}), adică adăugarea unui padding format din numere pseudoaleatoare, padding diferit pentru fiecare expediere a mesajului. |
|||
==== Exponentul de decriptare mic ==== |
|||
Dacă exponentul de decriptare (cel secret) este mic, pe lângă faptul că multe părți din mesaj nu se criptează, așa cum s-a arătat mai sus, există un algoritm rapid de găsire a lui ''d'', cunoscând informațiile ''e'' și ''n''.<ref name="Menezes288">Menezes, p. 288</ref> Acest algoritm nu este eficient dacă ''d'' este de același ordin de mărime cu ''n'', deci dacă ''e'' este mic<ref name="Menezes288"/>, acesta fiind unul din motivele pentru care se alege în general ''e'' un număr mic, pentru ca ''d'' să fie cât mai mare. |
|||
== Note == |
|||
{{listănote|2}} |
|||
== Bibliografie == |
|||
* {{Citat carte|title=Applied Cryptography, Second Edition: Protocols, Algorithms, and Source Code in C|author=Bruce Schneier|publisher=Wiley Computer Publishing, John Wiley & Sons, Inc.|year=1996|isbn=0471128457}} |
* {{Citat carte|title=Applied Cryptography, Second Edition: Protocols, Algorithms, and Source Code in C|author=Bruce Schneier|publisher=Wiley Computer Publishing, John Wiley & Sons, Inc.|year=1996|isbn=0471128457}} |
||
* {{Citat carte|title=Cryptography and Network Security, 4th edition|publisher=Prentice Hall|author=William Stallings|year=2005|isbn=0-13-187319-3}} |
* {{Citat carte|title=Cryptography and Network Security, 4th edition|publisher=Prentice Hall|author=William Stallings|year=2005|isbn=0-13-187319-3}} |
||
* {{Citat carte|title=Handbook of Applied Cryptography|author=Alfred Menezes|others=Paul van Oorschot, Scott Vanstone}} |
* {{Citat carte|title=Handbook of Applied Cryptography|author=Alfred Menezes|others=Paul van Oorschot, Scott Vanstone}} |
||
* {{Citat carte|url=http://books.google.ro/books?id=_QBvFRP69xEC&pg=PA52&lpg=PA52&dq=number+field+sieve+complexity&source=web&ots=NL6WwNclMl&sig=Hyv-vLMJNh3hCzRFPPb-5OTKkdc&hl=ro#PPA51,M1|author=A. W. Lenstra, H.W. Lenstra Jr.|title=The development of the number field sieve|publisher=Springer|date=1993}} |
|||
* {{Citat web|url=http://people.csail.mit.edu/rivest/Rsapaper.pdf|title=A Method for Obtaining Digital Signatures and Public-Key Cryptosystems|author=Rivest, R.L.; Shamir, A.; Adleman, L.|accessdate=30 martie 2009|archive-date=2008-12-17|archive-url=https://web.archive.org/web/20081217101831/http://people.csail.mit.edu/rivest/Rsapaper.pdf|dead-url=yes}} |
|||
{{Ciot-info}} |
|||
[[Categorie:Criptografie]] |
[[Categorie:Criptografie]] |
||
[[Categorie:Criptosisteme cu cheie asimetrică]] |
|||
[[bg:RSA]] |
|||
[[ca:RSA]] |
|||
[[cs:RSA]] |
|||
[[da:RSA]] |
|||
[[de:RSA-Kryptosystem]] |
|||
[[et:RSA]] |
|||
[[el:RSA]] |
|||
[[es:RSA]] |
|||
[[en:RSA]] |
|||
[[eo:RSA]] |
|||
[[eu:RSA]] |
|||
[[fa:آراسای]] |
|||
[[fr:Rivest Shamir Adleman]] |
|||
[[gl:RSA]] |
|||
[[ko:RSA 암호]] |
|||
[[hr:RSA]] |
|||
[[id:RSA]] |
|||
[[is:RSA]] |
|||
[[it:RSA]] |
|||
[[he:RSA]] |
|||
[[lv:RSA šifrēšanas algoritms]] |
|||
[[lt:RSA]] |
|||
[[hu:RSA-eljárás]] |
|||
[[nl:RSA (cryptografie)]] |
|||
[[ja:RSA暗号]] |
|||
[[no:RSA]] |
|||
[[pl:RSA (kryptografia)]] |
|||
[[pt:RSA]] |
|||
[[ru:RSA]] |
|||
[[simple:RSA]] |
|||
[[sl:RSA]] |
|||
[[sr:RSA]] |
|||
[[fi:RSA]] |
|||
[[sv:RSA]] |
|||
[[th:RSA]] |
|||
[[vi:RSA (mã hóa)]] |
|||
[[tr:RSA]] |
|||
[[uk:RSA]] |
|||
[[zh:RSA加密演算法]] |
Versiunea curentă din 9 septembrie 2023 16:34
În criptografie, RSA este un algoritm criptografic cu chei publice, primul algoritm utilizat atât pentru criptare, cât și pentru semnătura electronică. Algoritmul a fost dezvoltat în 1977 și publicat în 1978 de Ron Rivest, Adi Shamir și Leonard Adleman la MIT și își trage numele de la inițialele numelor celor trei autori.[1]
Puterea sa criptografică se bazează pe dificultatea problemei factorizării numerelor întregi, problemă la care se reduce criptanaliza RSA și pentru care toți algoritmii de rezolvare cunoscuți au complexitate exponențială. Există însă câteva metode de criptanaliză care ocolesc factorizarea efectivă, exploatând maniere eronate de implementare efectivă a schemei de criptare.
Funcționare
[modificare | modificare sursă]RSA este un algoritm de criptare pe blocuri. Aceasta înseamnă că atât textul clar cât și cel cifrat sunt numere între 0 și n-1, cu un n ales. Un mesaj de dimensiune mai mare decât este împărțit în segmente de lungime corespunzătoare, numite blocuri, care sunt cifrate rând pe rând.[2] De asemenea, ca algoritm criptografic cu chei publice, funcționează pe baza unei perechi de chei legate matematic între ele: o cheie publică, cunoscută de toată lumea, și una secretă, cunoscută doar de deținătorul acesteia.
Generarea cheilor
[modificare | modificare sursă]Perechea de chei se generează după următorii pași[3]:
- Se generează două numere prime, de preferat mari, p și q;
- Se calculează și
- Se alege un întreg aleator e, astfel încât cmmdc(e, φ) = 1. Perechea (n, e) este cheia publică.
- Folosind algoritmul lui Euclid extins, se calculează întregul d, unicul cu proprietatea că . (n, d) constituie cheia secretă.
Decizia cu privire la care dintre e și d este cheia publică și care este cea secretă este, din punct de vedere matematic, arbitrară, oricare dintre cele două numere poate juca oricare dintre roluri[4]. În practică însă, pentru a mări viteza de criptare, și întrucât dintre cele două numere e este cel ales arbitrar, e este cheia publică iar valoarea sa este aleasă un număr mic, de regulă 3, 17 sau 65537 (216+1)[5]. Aceasta conduce la un număr minim de înmulțiri, deci la o performanță sporită, deoarece toate aceste numere au doar două cifre 1 în reprezentarea lor binară[5].
Criptarea și decriptarea
[modificare | modificare sursă]Presupunând că mesajul clar este sub forma unui număr m, mai mic decât n, atunci mesajul cifrat, notat cu c este
unde e este cheia publică a destinatarului mesajului. Pentru a decripta mesajul, destinatarul își folosește cheia sa secretă d, care are proprietatea foarte importantă că:
Astfel, mesajul clar este recuperat calculând:
Oricine poate cripta mesaje cu cheia publică a destinatarului, dar numai acesta din urmă poate decripta, deoarece trebuie să folosească cheia sa secretă.
Algoritmul poate fi folosit și pentru semnătura electronică, folosind cheile invers. Dacă o entitate criptează un mesaj (sau mai degrabă un hash al acestuia) cu cheia sa secretă și atașează rezultatul mesajului său, atunci oricine poate verifica, decriptând cu cheia publică a semnatarului și comparând rezultatul cu mesajul clar (sau cu hash-ul acestuia), că într-adevăr acea entitate este autorul mesajului.
Demonstrația formulei de decriptare
[modificare | modificare sursă]Formula de decriptare este valabilă, deoarece[6]:
- și, fiindcă , atunci
- și
și deci se poate scrie:
Dar, cum p este prim, și deci prim cu m, conform micii teoreme a lui Fermat, rezultă că
Astfel,
- .
Dacă p nu este totuși prim cu m, atunci înseamnă că m este multiplu al lui p, caz trivial în care m este congruent cu 0 modulo p, și deci ridicat la orice putere este congruent cu 0 și deci cu el însuși.
Analog și pentru q,
De aici, conform teoremei chinezești a resturilor, deoarece p și q sunt numere prime, rezultă că
Performanțe în implementări
[modificare | modificare sursă]În general, deoarece se bazează pe o operație destul de costisitoare din punct de vedere al timpului de calcul și al resurselor folosite, și anume exponențierea modulo n, viteza RSA este mult mai mică decât a algoritmilor de criptare cu cheie secretă.[7] Bruce Schneier estima, pe baza unor calcule efectuate în anii 1990, că o implementare hardware de RSA este de 1000 de ori mai lentă decât o implementare DES, iar în software, RSA este de 100 de ori mai lent.
Există anumite modificări care pot aduce performanțe sporite, precum alegerea unui exponent de criptare mic, care astfel reduce calculele necesare criptării, rezolvând în același timp și unele probleme de securitate.[8] De asemenea, operațiile cu cheia secretă pot fi accelerate pe baza teoremei chinezești a resturilor, dacă se stochează p, q și unele rezultate intermediare, folosite des.[8] Cu toate acestea, îmbunătățirile nu sunt mari, iar ordinul de mărime al diferențelor de performanță față de implementările algoritmilor cu cheie secretă rămâne același. De aceea, în sistemele de comunicație în timp real, în care viteza de criptare și decriptare este esențială (cum ar fi, de exemplu, aplicațiile de streaming video sau audio securizate), RSA se folosește doar la începutul comunicației, pentru a transmite cheia secretă de comunicație, care ulterior este folosită într-un algoritm cu cheie secretă, cum ar fi 3DES sau AES.
Securitatea
[modificare | modificare sursă]Problema decriptării unui mesaj criptat cu RSA este denumită problema RSA. Aceasta constă în obținerea radicalului de ordin e modulo n, unde e și n au proprietatea că n este produsul a două numere prime mari p și q, iar e este prim cu produsul dintre p-1 și q-1.[9] În acest moment, cea mai eficientă metodă de a realiza aceasta este descompunerea în factori primi a lui n, și obținerea astfel a cheii secrete d pe baza lui e. Astfel, este demonstrat că dificultatea spargerii unui mesaj criptat cu RSA nu este mai dificilă decât problema factorizării. Nu a fost descoperită încă o altă soluție generală a problemei RSA, dar nici nu s-a demonstrat matematic că nu există o altă soluție.[10][11]
Factorizarea întregilor prin metodele comune ajută la găsirea soluțiilor în timp util doar pentru numere mici. Pentru numere mari, algoritmii de factorizare, cu complexitate exponențială, dau soluția după foarte mult timp. Cea mai rapidă metodă de factorizare a întregilor, algoritmul general al ciurului câmpurilor de numere, are o complexitate de [12][13] Aici, c este un număr ce ia valori în jur de 1,9 pentru numere de tipul lui n, adică numere cu doi factori primi. Cel mai mare număr factorizat vreodată prin acest algoritm, rulat în anul 2005, de către specialiști de la Agenția Federală Germană pentru Securitatea Tehnologiei Informației, are 200 de cifre zecimale, iar reprezentarea binară a factorilor primi obținuți ocupă 663 de biți.[14][15] Cheile de criptare RSA cele mai sigure au lungimi de peste 1024 de biți.
Atacul RSA prin metoda forței brute, adică încercarea fiecărei chei secrete posibile, consumă chiar mai mult timp decât factorizarea.[10]
Atacuri împotriva RSA
[modificare | modificare sursă]Deși securitatea algoritmului RSA constă în legătura dintre acesta și factorizarea întregilor, el trebuie folosit cu grijă în implementări, deoarece, în caz de folosire eronată, sistemele bazate pe RSA pot fi atacate în anumite maniere care ocolesc factorizarea efectivă a modulului, atacatorul ajungând să obțină mesajul clar sau cheia secretă.
Atac cu text cifrat ales
[modificare | modificare sursă]În cazul atacului cu text cifrat ales, atacatorul dispune de cheia publică a entității atacate (exponentul de criptare e și modulul n), și interceptează mesaje cifrate trimise acestuia. Pentru a obține mesajul clar m dintr-un mesaj cifrat c, atacatorul poate proceda, de exemplu, astfel:[16]
- Calculează
- Trimite entității atacate spre semnare pe x, obținând
- Se observă că
- Se rezolvă ecuația
Atacatorul obține astfel mesajul cifrat. Există mai multe feluri de atacuri cifrate,[17] dar sunt câteva moduri de apărare împotriva lor. Unele pot fi evitate dacă pur și simplu entitatea protejată cu chei secrete refuză să semneze texte arbitrare trimise de terți.[18] Dacă acest lucru nu este posibil (ca de exemplu în cazul unui notar public care trebuie să semneze documente electronice prezentate de persoane străine), atunci atacul poate fi prevenit prin folosirea unei perechi diferite de chei pentru criptare și pentru semnătura electronică. De asemenea, este necesar să se folosească și un padding aleator pentru mesaj înainte de criptare sau, în cazul semnăturii, să nu se semneze mesajul clar, ci un hash al acestuia. De asemenea, atacul poate fi evitat și dacă se impune o anumită structură predefinită mesajelor primite spre semnare.[19]
Mesaje necriptate
[modificare | modificare sursă]Întrucât RSA se bazează pe ridicarea la putere (modulo un număr n), există anumite părți de mesaje care nu sunt criptate, părți rezultate în urma împărțirii mesajului pe blocuri. Astfel de mesaje sunt mesajele m cu proprietatea că m=mx (mod n) oricare ar fi x, ca de exemplu m=0, m=1, m=n-1. Numărul exact al acestor mesaje decriptate este [20], și deci este de minim 9 (deoarece e, p și q sunt impare). Pentru a micșora numărul de astfel de părți de mesaj, este util să se folosească un exponent public e cât mai mic.
Exponentul de criptare mic
[modificare | modificare sursă]În unele aplicații, se folosește un exponent de criptare (public) mic, de exemplu 3, pentru a mări performanța, dar și pentru a rezolva unele probleme de securitate. Dacă mai multe entități care comunică folosesc același exponent public (dar fiecare are propriul modul și deci propria cheie secretă), atunci același mesaj trimis mai multor destinatari are următoarele valori:
unde ni sunt modulele celor trei destinatari, e este exponentul comun acestora iar m este mesajul trimis tuturor celor trei. Un atacator poate folosi algoritmul lui Gauss pentru a descoperi o soluție mai mică decât n1n2n3 a unui sistem compus din următoarele ecuații:
Această soluție este, conform teoremei chinezești a resturilor, cubul mesajului m.[21] Soluția pentru această problemă este cea denumită sărarea mesajului (din engleză salting), adică adăugarea unui padding format din numere pseudoaleatoare, padding diferit pentru fiecare expediere a mesajului.
Exponentul de decriptare mic
[modificare | modificare sursă]Dacă exponentul de decriptare (cel secret) este mic, pe lângă faptul că multe părți din mesaj nu se criptează, așa cum s-a arătat mai sus, există un algoritm rapid de găsire a lui d, cunoscând informațiile e și n.[22] Acest algoritm nu este eficient dacă d este de același ordin de mărime cu n, deci dacă e este mic[22], acesta fiind unul din motivele pentru care se alege în general e un număr mic, pentru ca d să fie cât mai mare.
Note
[modificare | modificare sursă]- ^ Schneier, 1996, p. 385
- ^ Stallings, 2005, p. 269
- ^ Menezes, p. 286
- ^ Schneier, 1996, p. 387
- ^ a b Stallings, 2005, p. 274
- ^ Demonstrație similară cu cea din Menezes, p. 286
- ^ Menezes, p. 291
- ^ a b Schneier, p. 389
- ^ Menezes, 2005, p. 98
- ^ a b Schneier, p. 390
- ^ Menezes, 2005, p. 99
- ^ Lenstra, p. 51
- ^ Weisstein, Eric W. „Number Field Sieve”. MathWorld--A Wolfram Web Resource.
- ^ Stallings, p. 276
- ^ Eric W. Weisstein (10 mai 2005). „RSA-200 Factored”. Mathworld news. Verificați datele pentru:
|date=
(ajutor) - ^ Stallings, p. 280
- ^ Mai multe exemple sunt descrise în Schneier, pp 390-391
- ^ Schneier, p. 391
- ^ Menezes, p. 289
- ^ Menezes, p. 290
- ^ Menezes, p. 288
- ^ a b Menezes, p. 288
Bibliografie
[modificare | modificare sursă]- Bruce Schneier (). Applied Cryptography, Second Edition: Protocols, Algorithms, and Source Code in C. Wiley Computer Publishing, John Wiley & Sons, Inc. ISBN 0471128457.
- William Stallings (). Cryptography and Network Security, 4th edition. Prentice Hall. ISBN 0-13-187319-3 Verificați valoarea
|isbn=
: checksum (ajutor). - Alfred Menezes. Handbook of Applied Cryptography. Paul van Oorschot, Scott Vanstone.
- A. W. Lenstra, H.W. Lenstra Jr. (). The development of the number field sieve. Springer.
- Rivest, R.L.; Shamir, A.; Adleman, L. „A Method for Obtaining Digital Signatures and Public-Key Cryptosystems” (PDF). Arhivat din original (PDF) la . Accesat în .