Secretele
lumii...
Criptare cu chei publiceVictor-Valeriu PatriciuVlad și Gabi doresc să dialogheze, transmițând unul celuilalt mesaje "top secret" pe Internet. Să vedem cum procedează... În evoluția criptografiei moderne, în anul 1976, Whitfield Diffie și Martin Hellman, de la Universitatea Stanford din California, au descoperit un principiu diferit de cifrare. Ei au pus bazele criptografiei asimetrice cu chei publice. În locul unei singure chei secrete, criptografia asimetrică folosește două chei diferite: una pentru cifrare, alta pentru descifrare. Deoarece este imposibilă deducerea unei chei din cealaltă, una din chei este făcută publică, fiind pusă la îndemâna oricui dorește să transmită un mesaj cifrat. Doar destinatarul, care deține cea de-a doua cheie, poate descifra și utiliza mesajul. Tehnica cheilor publice poate fi folosită și pentru autentificarea mesajelor prin semnătură digitală, fapt care i-a sporit popularitatea.
În cripto-sistemele având chei publice, un utilizator, de exemplu Vlad, va deține:
Cheia de descifrare (secretă) este derivată din cheia de cifrare (publică) printr-o transformare greu inversabilă (one-way). În sistemele cu chei publice, secretizarea și autentificarea sunt realizate prin transformări distincte. Iată cum sunt folosite sistemele cu chei publice:
- Să presupunem că utilizatorul Vlad dorește să transmită un mesaj M unui alt utilizator, Gabi. Vlad cunoaște dintr-un fișier (server) transformarea (cheia) publică EGabi și poate transmite pe M lui Gabi sub forma criptată C: C=EGabi(M). Se asigură astfel funcția de confidențialitate. La recepție Gabi va descifra criptograma C utilizând transformarea (cheia) sa secretă DGabi, cunoscută doar de ea: DGabi(C)=DGabi(EGabi(M))=M. Schema nu asigură autentificare, deoarece orice utilizator are acces la cheia publică EGabi a lui Gabi și îi poate trimite mesaje false M' sub forma C'=EGabi(M'). - Pentru autentificare, se pune problema recunoașterii adevăratului emițător. Pentru aceasta se aplică lui M transformarea secretă DVlad a lui Vlad. Acesta va calcula și apoi va trimite lui Gabi criptograma C: C=DVlad(M). La recepție, Gabi va aplica transformarea publică, EVlad a lui Vlad: EVlad(C)=EVlad(DVlad(M))=M. Numai Vlad cunoaște și poate aplica transformarea DVlad. Observăm că nu este asigurată și confidențialitatea mesajului, întrucât este posibil ca M să fie decriptat de orice user ce are acces la fișierul (serverul) cu chei publice, aplicând în exemplul nostru transformarea publică EVlad.
- Pentru a se realiza simultan confidențialitatea și autentificarea, emițătorul de mesaj Vlad va aplica mai întâi transformarea sa secretă DVlad pentru autentificarea mesajului M. Apoi Vlad va cifra rezultatul, utilizând transformarea publică a lui Gabi, EGabi și va emite către receptor criptograma: C=EGabi(DVlad(M)). Receptorul Gabi îl obține pe M aplicând la început propria-i funcție de descifrare DGabi, iar apoi transformarea publică a lui Vlad EVlad, cea care furnizează autentificarea: EVlad(DGabi(C)) =EVlad(DGabi(EGabi(DVlad(M)))) =EVlad(DVlad(M)) =M.
În figura 1 se arată modalitatea de asigurare a confidențialității (secretul) unui mesaj, folosind criptarea cu chei publice. Pentru aceasta, mesajul este cifrat cu cheia publică a destinatarului, operație ce poate fi făcută de către orice persoană care poate accesa fișierul cu chei publice. După cifrare mesajul nu va mai putea fi descifrat decât de către destinatar, singurul care posedă cheia secretă (privată), pereche a celei publice. Când doi utilizatori vor să schimbe mesaje securizate, fiecare transmite o cheie celuilalt, denumită cheie publică și o păstrează pe cealaltă, denumită cheie privată. Deoarece mesajul criptat cu cheia publică poate fi decriptat doar cu cea privată, mesajele pot fi transmise prin rețea fără a exista riscul ca un intrigant să citească datele transmise.
Figura 1 Sisteme de cifrare cu chei publice
În practica aplicațiilor Internet, cifrurile cu chei publice sunt folosite în general pentru următoarele 2 servicii: - semnătura digitală asociată mesajelor, pentru autentificarea conținutului și a emițătorului; - cifrarea și distribuția cheilor simetrice (de tip DES, IDEA etc.), folosite în secretizarea mesajelor, operație numită anvelopare a cheii.
Semnătura digitală rezolvă atât problema autentificării emițătorului, cât și pe cea a autentificării conținutului mesajului însuși. În exemplul din figura 2 se prezintă utilizarea sistemelor cu chei publice pentru semnare digitală. Dacă, de exemplu, Gabi primește un mesaj semnat de Vlad, semnătura lui Vlad trebuie să satisfacă următoarele proprietăți: - Gabi să fie capabilă să valideze semnătura lui Vlad; - semnătura lui Vlad să fie imposibil de falsificat, chiar pentru Gabi; - în cazul în care Vlad nu recunoaște semnarea mesajului, trebuie să existe un "judecător" care să poată rezolva disputa dintre Vlad și Gabi.
Sistemele de autentificare cu chei publice permit o implementare simplă a semnăturilor digitale. Cheia privată, deoarece este deținută doar de Vlad, poate servi ca element de calcul a semnăturii digitale pentru Vlad. Gabi, receptorul mesajului M semnat, poate verifica atât autenticitatea emițătorului, cât și pe cea a datelor. Validarea semnăturii se poate face de către Gabi, cu cheia publică pereche, a lui Vlad. În practică, o semnatură digitală se realizează folosind un sistem criptografic cu chei publice și o funcție H de dispersie (hash). Funcția de dispersie este folosită pentru a calcula o valoare rezumat (digest) care depinde de toți biții mesajului ce va fi semnat. Pentru o astfel de funcție, (de exemplu pentru cea cunoscută sub numele de MD5, proiectată de Rivest), trebuie să fie computațional imposibil să se construiască 2 mesaje distincte care să aibă aceeași valoare rezumat; acest lucru face din rezumat o "amprentă" a mesajului. Utilizatorul emițător, în loc să semneze mesajul M, care poate avea sute sau mii de kilobytes, semnează rezumatul (de 128 de biți), prin cifrare cu cheia sa privată. Semnătura poate fi validată apoi de receptor folosind cheia publică a emițătorului, așa cum se poate vedea în figura 2. La recepție, se calculează din nou rezumatul mesajului primit, se descifrează semnătura primită cu cheia publică a emițătorului și apoi se compară cele 2 rezumate. Dacă ele sunt identice, semnătura este validă.
Figura 2 Sisteme de semnătură digitală
Criptografia are ca scop principal confidențialitatea mesajelor. Acestea sunt criptate cu o cheie de cifru simetric, de exemplu IDEA sau DES, generată aleator. Pentru a se putea distribui receptorului această cheie, ea este criptată, la rândul ei, cu cheia publică a primitorului mesajului, obținându-se așa-numita anvelopă digitală a mesajului. Învelișul (anvelopa) digital(ă) este trimis receptorului împreună cu mesajul criptat. După primirea datelor, receptorul decriptează învelișul digital, folosind cheia sa privată, pentru a obține cheia simetrică generată aleator de către emițător, pe care apoi o folosește la decriptarea mesajului original.
Algoritmii de criptare cu cheie publică prezintă o cripto-complexitate foarte mare, bazându-se în general pe operații cu întregi foarte mari (sute de cifre zecimale sau mii de biți). Dintre problemele matematice dificile care stau la baza acestor cifruri, amintim factorizarea unor numere întregi mari, calculul logaritmilor în câmp finit sau problema rucsacului. Implementările existente de sisteme de criptare cu chei publice folosesc, cel mai adesea, următorii algoritmi criptografici: - pentru rezumat: MD2, MD5 (Mesage Digest creat de Ronald Rivest), SHA (Secure Hash Algoritm, creat de Institutul de Standarde al SUA - NIST pentru standardul de semnătură DSA); - pentru criptare/semnătură: RSA (creat de Rivest, Shamir și Adleman), El Gamal, DSA (Digital Signature Algorithm, creat de NIST ca standard de semnătură digitală), Curbe Eliptice și Metoda Rucsacului a lui Merkle-Hellman. Vom prezenta două dintre cele mai cunoscute sisteme criptografice cu chei publice. Cifrul RSARSA reprezintă cel mai folosit sistem cu chei publice și semnături digitale. A fost realizat de trei cercetători - Rivest, Shamir, Adleman - de la MIT (Massachusetts Institute of Technology) și are o mare susținere atât în mediul guvernamental, cât și în cel comercial. Sub diferite forme de implementare, prin software sau prin dispozitive hardware speciale, RSA este astăzi recunoscută ca cea mai sigură metodă de cifrare și autentificare disponibilă comercial. Ideea pe care își bazează puterile RSA constă în imposibilitatea computațională practică actuală de a factoriza numere (întregi) mari, de sute de cifre zecimale. Criptarea/decriptarea se face prin funcții de tip exponențial, unde exponentul este cheia, iar calculele se fac în inelul claselor de resturi modulo n. Pentru folosirea unui cripto-sistem RSA sunt necesari următorii parametrii: - două numere prime foarte mari, ținute secrete, p și q (de exemplu de 100 de cifre zecimale fiecare); - modulul n, produsul celor două numere prime mari, făcut public: n = p * q. Securitatea RSA depinde de dificultatea factorizării lui n în p și q. Rivest, Shamir și Adleman recomandă folosirea unor numere prime p și q de 100 cifre zecimale, adică a unui n de 200 de cifre zecimale, ceea ce cere pentru factorizare mai multe milioane de ani calculator. Ultimele recomandări făcute de firma RSA Data Security, deținătoarea patentului RSA, pentru alegerea dimensiunii cheilor de cifrare RSA (de fapt a modulului n) sunt următoarele: - în cazul unor aplicații cu cerințe de securitate pe termen scurt: 768 biți, dimensiune suficientă în aplicații pentru utilizatori individuali. Se precizează că informația este sigură 1 an; - în cazul unor aplicații cu cerințe de securitate pe termen mediu: 1024 biți, dimensiune suficientă în aplicații comerciale. Se apreciază că informația este sigură 3 ani; - în cazul unor aplicații cu cerințe de securitate pe termen lung: 2048 biți, dimensiune considerată suficientă pentru aplicații cu cerințe de securitate sporită, la nivel strategic militar sau guvernamental. Se apreciază că, în acest caz, informația este sigură 20 de ani. Plecând de la parametrii specificați se calculează indicatorul lui Euler (n)=(p-1)*(q-1), care este imposibil de determinat de un atacator, întrucât nu se cunosc factorii primi ai lui n, p și q. Baza teoretică a lui RSA este generalizarea lui Euler a Teoremei lui Fermat care stabilește că: Mj(n) = 1 mod n. Această proprietate implică necesitatea ca cele 2 chei, PUB și PRIV să fie inverse multiplicativ modulo j(n). Cele 2 chei cu care opereazăRSA sunt: - PRIV - cheia privată, aleasă ca un întreg relativ prim cu j(n), în intervalul [max(p,q)+1, n-1]; - PUB - cheia publică, un întreg calculat ca invers multiplicativ modulo j(n): PUB * PRIV = 1 mod j(n). Criptarea unui mesaj Se generează cu un program special pentru fiecare utilizator, modulul n și cheile PUB și PRIV. În cazul exemplului pe care-l vom analiza, user-ul Vlad obține modulul nVlad și cheile PUBVlad și PRIVVlad. Apoi Vlad va înregistra într-un fișier public, cheia publică (PUBVlad, nVlad) și ține secretă cheia privată PRIVVlad. Un alt user, de exemplu Gabi, poate emite un mesaj M criptat, utilizând cheia publică a lui Vlad, pe care o găsește în fișierul (BD) public. Criptarea constă în ridicarea biților ce reprezintă mesajul, interpretați ca un întreg, la puterea PUBVlad, modulo nVlad: C = M PUBVlad mod nVlad. La recepție doar destinatarul Vlad poate obține mesajul în clar, tot prin ridicare la putere, cu cheia sa secretă PRIVVlad: M = C PRIVVlad mod nVlad = (M PUBVlad )PRIVVlad mod nVlad = M PUBVlad * PRIVVlad mod nVlad = M, conform teoremei lui Euler, deoarece: PUB*PRIV=1 mod j(n) = (k* j(n) +1) . Semnarea unui mesaj User-ul Vlad va putea semna un mesaj M, calculând cu cheia sa secretă PRIVVlad: S = MPRIVVlad mod nVlad. Un alt user, de exemplu Gabi, poate autentifica acest mesaj, utilizând cheia publică PUBVlad a lui Vlad și calculând, tot prin ridicare la putere, mesajul M din semnătura S recepționată: M= S PUBVlad mod nVlad . Semnătura se consideră a fi validă în cazul în care mesajul astfel calculat coincide cu cel trimis direct prin rețea. În practica semnării digitale, se utilizează un rezumat al mesajului M, H(M), calculat cu o funție de hash, H; acesta este mai scurt decât M, având de obicei 128 de biți. Vom ilustra folosirea algoritmului RSA printr-un exemplu numeric. Fie p=19 și q=43 cele două numere prime secrete alese pentru userul Vlad. Valoarea modulului nVlad (produsul celor două numere) este nVlad = 43*19 = 817. Indicatorul lui Euler calculat este: (n)=(p-1)*(q-1)=42*18=756. Se alege, de exemplu, cheia privată a lui Vlad, PRIVVlad=625. Se calculează apoi cheia publică PUBVlad = (PRIVVlad)-1 mod 756 = (625)-1 mod 756 = 227. Se va publica pe server sau într-un fișier cheia publică PUBVlad și nVlad și se va ține secretă valoarea PRIVVlad.
Pentru a cripta mesajul: M= "astazi ma duc la scoala" îl vom sparge mai întâi în blocuri mai mici, în cazul nostru de câte o cifră: M1 = "a" = 97, M2 = "S" = 115 etc. Primul caracter va fi criptat ca: 97227 mod 817 = 451, 115227 mod 817 = 628 etc. Restul caracterelor sunt prelucrate prin exponențiere la fel, obținându-se criptograma: C=451 628 679 451 122 528 409 212 451 409 662 268 310 409 352 451 409 628 310 701 451 352 451 Pentru a decripta mesajul, se va ridica fiecare bloc criptat la puterea 625: 451625 mod 817 = 97 = "a" etc.
Cifrul MERKLE-HELLMAN (MH)Metoda de cifrare cu cheie publică MH este bazată pe cunoscuta problemă a rucsacului, care constă în a determina într-o mulțime de numere întregi, o submulțime de o sumă dată. Merkle și Hellman propun o metodă a cărei securitate depinde de dificultatea rezolvării următoarei probleme:
Fiind dat un întreg pozitiv C și un vector A=(a1,a2,...,an) de întregi pozitivi, să se găsească un subset al lui A a cărui sumă să fie C. Cu alte cuvinte este necesar să se determine un vector binar M=(m1,...,mn), astfel încât C=A Ž M sau C= ć ai Ś mi. Intuitiv, problema este următoarea: Cunoscând greutatea unui rucsac închis și greutățile mai multor obiecte care s-ar putea afla în interiorul său, să se determine setul de obiecte aflate în rucsac, fără a-l deschide.
Această problemă este NP completă. Cel mai bun algoritm cunoscut pentru rezolvarea ei - în cazul în care dimensiunea rucsacului este n - cere O(2n/2) timp și O(2n/2) memorie. Există totuși o clasă specială de probleme de un asemenea tip, numită clasa problemelor cu rucsac simplu ce pot fi rezolvate într-un timp liniar. Într-un rucsac simplu elementele ai (i=1, ..., n) sunt în relația de dominanță, adică: ai > ć aj , unde j=1 , i. Relația de dominanță simplifică soluția rucsacului, după următorul algoritm:
procedura RUCSAC-SIMPLU (C,A) este pentru i=n,1 execută dacă C >= ai atunci mi=1 altfel mi=0 atribuie C=C - S ai*mi sfârșit_pentru dacă C = 0 atunci "Soluția este în M" altfel "Nu există soluție" sfârșit_procedura
În proiectarea unui astfel de criptosistem trebuie convertit rucsacul simplu într-un rucsac cu trapă aditivă (trapdoor knapsack), care este greu de rezolvat. Mai întâi se selectează un vector rucsac simplu A'=(a'1, a'2, ..., a'n). Acesta permite o soluție simplă a problemei, C'=A'M. Apoi se alege un întreg n, astfel ca: n > 2 a'n > ća'i, unde i=1 ,...,n.
În continuare se alege un alt întreg w, astfel ca cmmdc(n,w)=1 și se calculează inversul lui w mod n. În final vectorul A' este transformat într-un vector rucsac greu: A=w Ž A' mod n, ai = w Ž ai' mod n. Acum, rezolvarea problemei C=A Ž M este dificilă, dacă nu se dispune de o informație "trapă" (inversul lui w și n), cu ajutorul căreia calculul se simplifică: C' = w-1 C Ž mod n = w-1 A Ž M Ž mod n = w-1 (w Ž A') Ž M mod n = A' M mod n = A' M.
Transformarea de cifrare PUB (publică) folosește cheia publică care este vectorul rucsac greu A. Se obține criptograma C = PUB(M) = A Ž M. Transformarea de descifrare PRIV folosește cheia secretă(A',n,w-1), calculând pe baza funcției rucsac simplu: PRIV(C)=rucsac_simplu(w-1C mod n, A')=M.
Pentru a se înțelege mai clar algoritmul Merkle-Hellman, să considerăm următorul exemplu numeric: Fie A'=(1,3,5,10) vectorul rucsac simplu, n=20 și se alege w=7. Ca urmare, inversul multiplicativ al lui w modulo 20 este w'-1=3. Acest rucsac simplu este transformat într-unul cu trapă aditivă A astfel: A = (7*1 mod 20, 7*3 mod 20, 7*5 mod 20, 7*10 mod 20) = (7, 1, 15, 10).
Se consideră următorul mesaj M, care va fi cifrat: M=13, în binar M=(1, 1, 0, 1). Criptograma C este obținută cu ajutorul vectorului cu trapă A: C=PUB (M)=A; M=7+1+10=18. Ca urmare, avem C=(1, 0, 0, 1, 0). La descifrare se obține mesajul clar, cu vectorul simplu A' care este secret: M =PRIV(C)=PRIV(18)= =RUCSAC_SIMPLU(3*18 mod 20, A')= =RUCSAC_SIMPLU(14, A')= =(1, 1, 0, 1)= =13
Merkle și Hellman au sugerat alegerea în proiectarea unui cripto-sistem bazat pe acest algoritm, a unui rucsac cu n=100 elemente (sau chiar mai mare), ceea ce face ca cifrul să fie computațional inatacabil. În numerele viitoare ne vom opri asupra unor aplicații ale sistemelor criptografice, simetrice sau cu chei publice, în serviciile Internet.
Domnul Victor-Valeriu Patriciu este cadru didactic la Academia Tehnică Militară. Poate fi contactat prin e-mail la adresa: vip@mta.ro [cuprins] |