UNIVERSITATEA “DUNĂREA DE JOS” GALAŢI FACULTATEA DE ŞTIINŢE - CAHUL SPECIALIZAREA MATEMATICĂ-INFORMATICĂ
LUCRARE DE LICENŢĂ CRIPTATAREA ŞI DECRIPTAREA DATELOR
Coordonator ştiinţific: Lect. ANĂSTĂSOAEI VASILE Absolvent: MAZUREAN EUGENIU
GALAŢI
2007
2
Cuprins 1. Introducere
4
1.1 Termeni Criptografici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Istoria criptografiei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2. Criptosisteme clasice
25
2.1 Cifrul lui Caezar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.1 Descriere generală . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.2 Descriere matematică . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.3 Algoritm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.1.4 Exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2 Cifrarea afină . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2.1 Descriere generală . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2.2 Descriere matematică . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2.3 Algoritm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.3 Codul Hill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3.1 Descriere generală . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3.2 Descriere matematică . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3.3 Algoritm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3. Criptosisteme simetrice
32
3.1 Cifrare de tip flux (stream) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.1.1 Codul Vernam sau One Time Pad . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.1.2 SEAL - Software Encryption Algorithm . . . . . . . . . . . . . . . . . . . . . . 37 4. Sisteme de criptare prin chei publice (asimetrice)
41
4.1 Schimbul de chei Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.2 Sistemul RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3 Semnătura digitală . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.4 Sisteme de certificare a cheilor publice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.5 Infrastructura cheilor publice (PKI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.6 Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.6.1 Algoritmul DES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.6.2 Variante de DES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.6.3 Algoritmul AES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.6.4 Algoritmul LUCIFER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3
4.6.5 Algoritmul Blowfish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.6.6 Dubla criptare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.6.7 Tripla criptare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.6.8 Concluzii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5. Aplicaţie. Algoritmul Vigenere şi implementarea lui
71
5.1 Codul Vigenere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.1.1 Descriere generală . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.1.2 Descriere matematică . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.1.3 Algoritm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.1.4 Exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.1.5 Implementarea algoritmului Vigenere . . . . . . . . . . . . . . . . . . . . . . . . . 73 Bibliografie
86
4
Capitolul 1
Introducere 1.1
Termeni Criptografici Scenariul cel mai des întâlnit în criptografie, dar şi în viaţa reală presupune că există două
persoane sau entităţi care doresc să comunice dar se află la capetele unui canal de comunicaţie nesigur. Şi anume o terţă persoană poate intercepta şi ulterior avea acces la informaţii care nu îi sunt destinate. În acest scenariu părţile comunicante (pentru a fi în concordanţă cu toate materialele din domeniu) se numesc Alice (expeditorul mesajelor) şi Bob (destinatarul), cea de-a treia entitate o vom numi Eve şi singurul ei scop în acest scenariu este de a afla secretele celor doi, Alice şi Bob. Pentru a transmite informaţii Alice are mai întâi nevoie de un canal de comunicaţie. Acesta poate fi o reţea informatică, o reţea telefonică sau pur şi simplu clasicul sistem poştal. Caracteristica principală care reuneşte toate aceste canale de comunicaţie este faptul ca ele nu sunt sigure, informaţia poate fi interceptată sau şi mai rău poate fi modificată în timp ce parcurge drumul de la Alice la Bob. Unul din obiectivele criptografiei este de a produce mijloace prin care să se prevină astfel de atacuri. Obiectivul fundamental si clasic al criptografiei este de a pune la dispoziţia entităţilor precum Alice şi Bob posibilitatea de a comunica confidenţial folosind metode criptografice. Adesea mesajul care se trimite este denumit text în clar şi el poate fi un text obişnuit, un şir de numere, sau un program executabil. Alice înainte de a trimite mesajul lui Bob criptează textul în clar pt şi obţine textul criptat tc. Textul criptat este cel ce va fi trimis lui Bob, acesta pentru a decripta mesajul si a obţine textul in clar va avea nevoie de o cheie de decriptare. Eve, denumită şi adversarul sau atacatorul are în continuare posibilitatea de a intercepta mesajul însă criptarea textului ar trebui să garanteze faptul că Eve nu va putea citi mesajul, adică nu va putea obţine textul în clar din textul criptat, cunoscând chiar şi algoritmul folosit pentru criptare. Se spune adeseori că puterea unui criptosistem stă în puterea cheii şi nu în păstrarea secretului asupra algoritmului folosit. Pe lângă obiectivul prezentat mai sus metodele criptografice trebuie să prezinte soluţii pentru încă trei probleme de importanţă cel puţin egală cu păstrarea secretului asupra informaţiilor transmise: 1.
Autentificarea: destinatarul unui mesaj trebuie sa dispună de modalităţi de a verifica identitatea expeditorului şi originea mesajului. Să presupunem ca Bob primeşte un mesaj, el trebuie să se convingă de faptul că mesajul primit vine intr-adevăr de la Alice.
2.
Integritatea datelor: destinatarul trebuie să dispună de modalităţi de verificare a integrităţii mesajului primit. După ce a verificat că mesajul primit este de la Alice, Bob vrea să se asigure că mesajul este complet şi nu au fost erori de transmisie sau modificări
5
voite din partea unui atacator, Eve. 3.
Non-repudierea: după transmisia mesajului, trebuie ca expeditorul să nu poată nega faptul că mesajul a fost intr-adevăr trimis de el sau destinatarul să nu poată nega faptul că a citit intr-adevăr mesajul. Alice nu poate nega faptul că a trimis mesajul după primirea mesajului de către Bob, iar acesta nu poate nega faptul că a citit mesajul din moment ce a trimis un răspuns.
Definiţia 1.1.1. Criptografia este o ştiinţă matematică folosită pentru a asigura confidenţialitatea datelor prin înlocuirea lor (textului în clar) cu o versiune schimbată, obţinută în urma unui proces de criptare, şi din care versiune se pot obţine datele iniţiale utilizând algoritmul criptografic potrivit şi cheia necesara decriptării. Definiţia 1.1.2. Criptanaliza sau analiza criptografică este ştiinţa care se ocupă cu regăsirea de informaţii valide din informaţii cifrate fără ca entitatea care doreşte accesul la informaţie să aibă acest drept. În urma proceselor criptanalitice se pot expune eventuale slăbiciuni ale algoritmului de criptare folosit sau ale cheii. Definiţia 1.1.3. Criptologia este ştiinţa care se ocupă cu studiul criptografiei şi criptanalizei. Criptarea informaţiei este făcută prin intermediul unei funcţii E care transformă textul, sau informaţia pt folosind o cheie k în textul criptat tc(neinteligibil pentru eventualii adversari). Altfel spus Alice pentru a trimite un mesaj către Bob va aplica funcţia E de parametri pt şi k şi va obţine textul tc: E(pt, k) = tc Textul astfel obţinut va fi trimis prin intermediul canalului de comunicaţie şi prelucrat la primire de către Bob, care va utiliza o funcţie D pentru decriptare şi o cheie k’ astfel: D(k', tc) = pt Formalizând putem defini acest sistem de asigurare a confidenţialităţii informaţiei astfel: Definiţia 1.1.4. Un criptosistem este un tuplu (P,C,K,E,D) care îndeplineşte următoarele condiţii: 1. P este un set finit de posibile texte în clar 2. C este un set finit de posibile texte cifrate 3. K este un set finit de posibile chei de cifrare 4.
Pentru fiecare k e K există o regulă de criptare ek ∈ E şi o regulă corespunzătoare de decriptare dk ∈ D. Fiecare ek : P —► C şi dk : C —► P funcţionează astfel încât:
6
dk(ek(pt)) = pt pentru oricare text în clar pt ∈ P Criptosistemele se deosebesc în funcţie de modul în care este folosită cheia de criptare/decriptare, astfel putem distinge două sisteme criptografice: 1. Cu cheie simetrică unde se foloseşte aceeaşi cheie pentru ambele proceduri, criptare şi decriptare. Adesea aceste sisteme sunt numite cripto-sisteme cu cheie privata sau criptosisteme cu o singură cheie deoarece cheia folosită trebuie să rămână cunoscută exclusiv parţilor comunicante şi k = k!. 2. Cu cheie publică unde se folosesc două chei pentru criptare, respectiv decriptare. Aceste criptosisteme mai sunt numite şi criptosisteme asimetrice. Cheile folosite se numesc cheie publică şi respectiv cheie privată. Criptosistemele cu cheie simetrică se împart în două categorii în funcţie de modul în care se face criptarea: algoritmi de tip stream sau algoritmi de tip block. Criptarea de tip stream presupune generarea unei secvenţe de biţi cu o înfăţişare cât de aleatoare posibil pe baza unei chei. Secvenţa de biţi este deci obţinută în urma criptării bit cu bit a textului în clar (biţii textului în clar sunt adunaţi cu cei ai cheii). Este esenţial pentru criptările de tip stream ca două mesaje să nu fie criptate cu acelaşi stream al cheii de criptare, în acest sens se ia măsuri speciale. Exemple de algoritmi de tip stream: SEAL (Software-optimised Encryption Algorithm), RC4, A5, LEVIATHAN, Sober. Algoritmii de tip block presupun împărţirea textului în clar în blocuri de biţi care sunt criptate, criptarea blocurilor făcându-se în mai multe runde. Majoritatea algoritmilor cu cheie simetrică sunt de tip block cipher şi folosesc diferite metode pentru a opera criptarea textului: • modul ECB (Electronic Code Book) presupune criptarea fiecărui bloc separat şi independent de celelalte • modurile CBC (Cipher Block Chaining) şi CFB (Cipher Feed Back ) presupun dependenţe între blocurile criptate la runda anterioară ş i cele de la runda curentă în funcţie de un vector de iniţializare. • modul OFB (Output Feedback Mode) poate fi interpretat că foloseşte o cifrare de tip block pentru a genera un stream care este apoi adunat bit cu bit cu textul în clar. Unii dintre algoritmi , spre exemplu DES (Data Encryption Standard) folosesc S-box-uri sau tabele, denumite şi Substitution-box pentru a obţine textul criptat, folosirea numelui de substituţie este mai degrabă nepotrivită din moment ce o astfel de "cutie" poate avea mai multe intrări decât ieşiri sau mai multe ieşiri decât intrări. Un exemplu de S-box poate fi transformarea identică (0 → 0,1 → 1,2 → 2,...) care în mod evident nu are nici un efect, în timp ce alte tipuri de
7
transformări au anumite efecte, cantitatea şi calitatea fiind diferite pentru fiecare. Efectele cel mai des menţionate includ efectul de avalanşă ş i nonliniaritatea funcţiei Booleene. Desigur este de aşteptat ca structuri de cifrare diferite să dispună de caracteristici diferite ale tabelelor, de aceea discuţii despre puterea S-box-urilor apar de fiecare dată la construirea unui nou cifru. Avalanşa este o proprietate a algoritmilor de tip block construiţi în mai multe runde, respectând o mică schimbare a datelor de intrare. Schimbarea unui singur bit produce după o rundă multiple schimbări la nivel de bit, mai multe schimbări se produc după încă o rundă, până când în cele din urmă aproximativ jumate din bloc va fi schimbat, aceasta ca o analogie asupra unei avalanşe naturale unde un mic efect iniţial produce un rezultat neaşteptat. "Pe măsură ce datele de intrare trec prin straturi succesive, modelul care produce cifra 1 este amplificat şi rezultă o avalanşă imprevizibilă. La final, rezultatul va conţine, în medie, jumate cifre 0 şi jumate cifre 1. .. " Feistel, H. 1973. Cryptography and Computer Privacy. Scientific American. Din punct de vedere matematic, în criptografia cu cheie publică, fiecare entitate participantă la transmisia şi recepţia de mesaje are o cheie personală k = (pk, sk) care este formată din două părţi, pk este cheia publică sau cheia de criptare şi este făcută cunoscută tuturor celor care vor să trimită mesaje deţinătorului cheii sk. Cheia sk este ţinută secretă ş i va fi folosită de către cel ce o deţine pentru a decripta mesajele care ii sunt trimise. Să spunem că Alice doreşte să ii trimită un mesaj lui Bob, atunci ea va obţine de la el, sau o terţă persoană de încredere, cheia lui publică, va cripta mesajul cu cheia lui Bob, pk, şi îl va trimite. Bob va folosi cheia sa secretă sk pentru a decripta şi citi mesajul, avem deci: D (sk, E(pk, pt)) = pt Criptarea cu cheie publică are nevoie de computaţii complexe şi este mai puţin eficientă decât criptarea cu cheie simetrică, astfel criptările simetrice sunt folosite pentru volume mari de date. Înainte ca Alice şi Bob să comunice, ştiind că au un volum mare de informaţii pe care vor să-l transmită ei vor fi nevoiţi să schimbe o cheie simetrică, pentru aceasta criptarea cu chei publice este ideală. Acest tip de criptare mai este cunoscut şi ca funcţie one-way cu trapdoor deoarece oricine poate foarte uşor folosi cheia publica pk pentru a cripta un mesaj, însă numai cel ce deţine cheia privată sk îl poate decripta. Definiţia 1.1.5. O funcţie one-way cu trapdoor este o funcţie f(x) = y pentru care y este foarte uşor de calculat, dar având pe y şi cunoscând funcţia f este greu de calculat x. Cunoscând insă o informaţie secretă k (denumită cheie) şi având pe y sau valoarea lui f(x) este foarte uşor să se calculeze x. Un alt tip de funcţie one-way este one-way hash function care mai are multe alte nume, printre care: funcţie de compresie, funcţie de contracţie, message digest, fingerprint,
8
cryptographic checksum, verificarea integrităţii mesajului (message integrity check, MIC), si cod pentru detectarea manipulării mesajului (manipulation detection code, MDC). Funcţiile de hash există de mult timp în criptografie şi fac parte din pilonii principali în construcţia multor protocoale criptografice. Definiţia 1.1.6. O funcţie de hash este o funcţie, matematică sau de altă natură, care ia ca argument un şir de mărime variabilă ş i întoarce ca rezultat un şir de mărime fixă denumit valoare hash. Ideea din spatele funcţiilor hash este aceea de a produce reprezentare exactă de mărime fixă a unor date de intrare ca apoi după ce datele au fost transmise printr-un canal de comunicaţie, la capătul la care se află destinatarul să se poată spune dacă datele au fost modificate de-a lungul canalului de comunicaţie. Acest lucru se poate face aplicând din nou funcţia de hash datelor primite şi compararea rezultatului cu cel obţinut înaintea transmiterii. O funcţie de hash trebuie de asemenea să producă o valoare unică de ieşire pentru o singură valoare de intrare, adesea spunem că o funcţie hash nu are coliziuni. Semnăturile digitale sunt folosite în combinaţie cu metodele criptografiei cu cheie publică. La fel ca în viata obişnuită, semnăturile digitale trebuie să asigure non-repudierea, care este o trăsătură de bază în cazul în care spre exemplu se foloseşte o astfel de metodă pentru a semna contracte, sau alte acte oficiale. Să presupunem ca Alice vrea să semneze un contract pe care Bob i l-a propus, ea va aplica atunci algoritmul S, folosind cheia secretă sk pentru a obţine semnătura S(sk, pt).La primirea semnăturii Bob va utiliza algoritmul V pentru a verifica semnătura V (pk, s, pt) = ok. Este de preferat a nu se semna întreg textul în clar ci numai valoarea rezultată în urma aplicării unei funcţii hash asupra textului. Definiţia 1.1.7. Un atac este o cale generală pe care un criptanalist o poate urma pentru a "sparge" sau descoperi secretele protejate de un cifru sau sistem criptografic. Atacurile nu sunt algoritmi precişi ci mai degrabă moduri de abordare pentru construirea unor algoritmi care să spargă un sistem criptografic. Atacurile criptografice pot beneficia de constrângeri informaţionale care pot reduce strategiile de atac ce pot fi folosite, atacatorul dispune de unele din informaţiile de mai jos şi poate alege strategia care se potriveşte cel mai bine informaţiilor pe care le deţine: • numai text criptat atacatorul dispune numai de text criptat, adesea informaţiile statistice rezultate din textul criptat pot oferi detalii care pot conduce la spargerea cifrului. Dacă o metodă criptografică nu poate rezista acestui tip de atac este complet nesigură. Chiar dacă Eve nu poate
9
folosi metode criptanalitice complicate Alice trebuie să presupună ca Eve poate să intercepteze mesajele. • text în clar cunoscut atacatorul dispune de un volum considerabil de text în clar şi textul criptat corespunzător. La o primă vedere s-ar părea că un astfel de fapt e imposibil de realizat, insă spre exemplu în cazul unor mesaje cu format standard Eve poate cunoaşte acest format. • text în clar definit atacatorul poate trimite text în clar arbitrar şi poate obţine textul criptat corespunzător. Un text în clar bine ales poate dezvălui anumite detalii de interes pentru atacator. În acest caz se presupune că Eve are acces cel puţin o dată la maşina de criptare înainte de a putea criptanaliza sistemul. • text criptat definit atacatorul poate trimite text criptat şi apoi să obţină versiunea decriptată. • cheie aleasă atacatorul poate specifica schimbări ale unui bit din cheie sau anumite relaţii intre cheile de criptare folosite. • cronometrare atacatorul poate cronometra duratele operaţiilor de criptare şi poate folosi aceste informaţii pentru a afla detalii despre cheie sau datele criptate. • analiza greşelilor atacatorul poate include greşeli arbitrare în maşinăria care execută criptarea şi poate folosi aceste greşeli pentru a expune detalii despre cheia folosita la criptare. • man in the middle (intermediarul) se presupune că atacatorul poate in tercepta mesajele transmise şi poate pretinde că este destinatarul mesajelor venite de ambele parţi. Eve interceptează mesajele atât de la Alice, cât şi de la Bob şi întotdeauna pretinde a fi una din părţi. Adeseori o strategie de atac este uşor de ales şi urmat dându-se constrângerile informaţionale enunţate mai sus. Iată câteva strategii de atac: • Brute Force sau căutarea exhaustivă a cheii presupune căutarea unei chei de decriptare până atunci când textul rezultat în urma decriptării cu una dintre chei are sens. • CodeBook sau abordarea clasică a spargerii codurilor presupune colecţionarea de transformări din text în clar în text cifrat şi reciproc. • Criptanaliză diferenţială atacatorul trebuie să găsească diferenţe statistice intre valorile cheilor şi transformările asupra textului criptat, iar apoi trebuie să utilizeze suficient text în clar pentru a putea recupera cheia de criptare. • Criptanaliza liniară atacatorul trebuie să găsească o aproximaţie liniară a S-box-urilor care au utilizat biţi din cheia unui cifru şi să o folosească pentru a descoperi cheia. • Programarea cheii atacatorul alege chei care produc efecte cunoscute în runde diferite ale criptării. • Birthday attack atacatorul foloseşte paradoxul zilei de naştere, ideea este că atacatorul va găsi mai uşor 2 valori care se potrivesc decât o valoare care să se potrivească unei valori date. • Codificare formală atacatorul trebuie să construiască ecuaţii pentru cheie folosind textul în
10
clar şi pornind de la designul algoritmului. După ce ecuaţiile sunt construite atacatorul trebuie să le rezolve. • Corelaţii de obicei la cifrările de tip stream atacatorul trebuie să distingă datele de elementele de confuzie. • Dicţionar este o îmbunătăţire la atacul de tip brute force. Atacatorul trebuie să formeze o listă de chei probabile şi să le testeze una câte una. • Reluare atacatorul trebuie să păstreze bucăţi de mesaje criptate şi să le trimită parţilor comunicante când consideră oportun. Definiţia 1.1.8. Un protocol criptografic este o serie bine definită de paşi care combină mai multe primitive criptografice, cum ar fi algoritmi de criptare/decriptare, funcţii hash, sau generatoare pseudo-aleatoare de numere, pentru îndeplinirea unei sarcini. După cum se obişnuieşte într-un protocol este necesar să existe cel puţin două părţi implicate. Pentru a întări această afirmaţie considerăm o schemă pentru generarea unei semnături digitale. Mai întâi partea implicată trebuie să aplice o funcţie de hash mesajului după care va folosi cheia privată pk pentru a semna valoarea hash obţinută. Ambii paşi sunt efectuaţi de o singură persoană, astfel nu putem numi această operaţie un protocol criptografic. Situaţii tipice de utilizare a protocoalelor criptografice sunt cele în care este nevoie să se facă o autentificare a utilizatorilor. Abordarea tradiţională este aceea de a avea câte un nume de utilizator şi o parolă pentru fiecare din părţile implicate. Daca se procedează aşa, atunci când Alice va dori o autentificare va trebui să trimită numele de utilizator şi parola către Bob, nu este nevoie să mai spunem ca acest tip de autentificare este susceptibil atacului de tipul "man in the middle", şi anume Eve poate asculta comunicaţia între cei doi şi poate afla numele de utilizator şi parola lui Alice. Un simplu protocol de tip "challenge-and-response" poate rezolva cu succes problema expusă mai sus. Protocolul se bazează pe criptarea asimetrică ş i presupunem că Bob deţine un set de "cereri" suficient de mare pentru a nu repeta aceeaşi cerere, în vreme ce Alice are o cheie k = (pk, sk) pentru a se identifica. Protocolul decurge după cum urmează: 1. Bob alege la întâmplare o cerere c pe care o trimite către Alice 2. Alice semnează cererea c folosind cheia secretă sk şi funcţia S pentru semnătură S(sk, c) = s,
apoi va trimite răspunsul s înapoi la Bob. 3. Bob va accepta răspunsul primit dacă funcţia de verificare V va returna un mesaj afirmativ în urma verificării semnăturii V(pk, s,c) = ok Protocolul nu este totalmente sigur însă rezolvă problema unui atac de tipul man-in-themiddle, o asigură pe Alice că nimeni nu îi cunoaşte cheia secretă sk, nici Bob, cel care verifică
11
semnătura, Eve nu poate căpăta nici un fel de informaţie utilă în urma ascultării canalului de comunicaţie deoarece cererea c face parte dintr-o mulţime rezonabil de mare încât să nu se repete, şi în plus cererea este aleasă aleator.
1.2
Istoria criptografiei Criptografia este denumită "ştiinţa scrierii secrete", însă în egală măsură este o artă. Având
această natură duală criptografia a apărut ca răspuns la nevoia oamenilor de a păstra anumite lucruri secrete, departe de eventuali duşmani, adversari sau opozanţi puşi a face rău părţilor comunicante. Dezvoltarea ei însă nu a avut un ritm susţinut, mai întâi era nevoie ca oamenii să dobândească un anumit grad de cunoaştere, în special în domeniul lingvistic, în ceea ce priveşte atât limba scrisă dar şi vorbită. Odată atins acest grad criptografia a apărut în mod spontan. Desigur, acolo unde există secrete există şi oameni dispuşi să le afle, astfel o ştiinţă, să spunem inversă criptografiei a apărut, şi anume analiza criptografică, al cărei obiect de studiu este descifrarea mesajelor. Inventarea criptografiei nu a ţinut în mod deosebit şi nu a fost limitată la o singură civilizaţie sau formă de guvernare. Oricând nevoia de confidenţialitate a apărut, criptografia a fost calea aleasă pentru a rezolva problema confidenţialităţii. Odată cu trecerea timpului, noţiunea de "cel mai bun sistem criptografic" a suferit multe modificări şi adeseori civilii au fost cei care au adus îmbunătăţiri esenţiale acestei noţiuni. În următoarele pagini vom încerca să redăm o scurtă istorie a criptografiei. Istoria cunoscută a criptografiei începe acum aproximativ 4000 de ani când un scrib egiptean foloseşte pentru prima dată hieroglife uşor modificate pentru a ilustra povestea stăpânului său. Prin aceasta el deschide drumul către "scrierea secretă", deşi sistemul folosit de el pentru a scrie hieroglifele respective nu poate fi considerat un sistem criptografic în accepţiunea modernă a acestei noţiuni. Inscripţiile făcute de el în jurul anului 1900 î.e.n. în camera mormântului nobilului Khnumhotep se întind pe aproximativ 20 de coloane din cele 222, care sunt incluse într-o secţiune care enumera monumentele ridicate de stăpânul său în numele faraonului Amenemhet II. Este posibil ca intenţia sa să nu fi fost aceea de a folosi o scriere secretă ci mai degrabă de a ataşa o oarecare notă de importanţă lucrurilor înfăptuite de nobilul său stăpân. Totuşi prin faptul că a modificat forma hieroglifelor, scribul a produs o transformare deliberată a scrierii, aceasta fiind o trăsătură esenţială a criptografiei. Pe măsură ce a trecut timpul scrierea s-a dezvoltat şi mormintele ce venerau pe cei dispăruţi au devenit locuri unde hieroglifele transformate au devenit din ce în ce mai complicate. Uneori înlocuirea formelor uzuale ale hieroglifelor, cum ar fi o faţă reprezentând /r/ printr-o formă diferită cum ar fi o faţă din profil, era folosită. Uneori sunetele hieroglifelor erau diferite, dar imaginile lor se asemănau. Iar uneori era folosit principiul rebusului, şi anume o imagine reprezenta o literă, de
12
exemplu o navă cu pânze, "kenthey", reprezintă un alt cuvânt egiptean khentey care înseamnă "cel ce conduce la", aceasta făcând parte din titlul care i se dădea zeului Amon, "cel ce conduce la Karnak". Dacă se adaugă la aceasta elementul secretizării se obţine al doilea element al criptografiei. În cazul egiptenilor însă elementul secretizării venea din dorinţa lor de a face scrierea necunoscută trecătorilor şi de a-i opri pentru moment din drumul lor pentru a reflecta asupra epitafurilor înscrise pe pietrele mormintelor. În Egipt însă la acea vreme exista un interes sporit pentru viaţa de apoi, oamenii au început, după primele schimbări ale formelor hieroglifelor, să fie tot mai puţin interesaţi de acestea, astfel textele gravate pe pereţii mormintelor încep să devină uşor criptice, asemeni unor ghicitori. Desigur aceste prime semne ale criptografiei nu pot fi comparate cu ştiinţa exactă care este acum criptografia, însă toate lucrurile mari au un început modest. În Mesopotamia este găsită o tabliţă care datează din anul anul 1500 î.e.n. şi care conţine o formulă criptată pentru fabricarea sticlei pentru vase. Mesopotamia a mers pe un drum oarecum paralel cu Egiptul în ceea ce priveşte criptografia, urmând însă sa se desprindă odată cu primii scribi care îşi scriau numele folosind cifre. Aceasta se pare a fi însă mai degrabă o formă de amuzament sau de mândrie decât una de cifrare exactă. Primul sistem criptografic cu întrebuinţare militară a fost inventat însă de spartani, cei mai războinici dintre greci. În secolul 5 î.e.n. ei au inventat un dispozitiv denumit "skytale", primul aparat inventat pentru a fi folosit în criptarea prin transpoziţie. Modul de funcţionare era simplu, dar totuşi ingenios. Se folosea un cilindru pe care se înfăşura pergamentul sau pielea pe care se dorea să se scrie, scrierea se făcea normal de la stânga la dreapta de-a lungul înălţimii cilindrului, pergamentul era apoi îndepărtat şi mesajul trimis. Pentru recompunerea mesajului iniţial trebuia folosit un cilindru de aceeaşi grosime.
Figura 1.1: Skytale, dispozitivul folosit de spartani pentru criptarea mesajelor Polybius, un scriitor grec, a inventat un sistem care a fost mai apoi adoptat pentru transmiterea la distanţă a mesajelor folosind torţe. El a aranjat toate literele într-un pătrat, numerotând liniile şi coloanele. Pătratul său arăta în forma următoare, desigur el a folosit
13
literele greceşti: Fiecare literă este acum identificată prin 2 cifre, de exemplu f=21, b=12, aceste numere se doreau transmise prin intermediul torţelor, astfel 2 torţe în stânga şi una în dreapta ar fi însemnat f. Polybius nu a spus niciodată pentru ce anume era folosit acest sistem de criptare prin substituţie.
Figura 1.2: Pătratul lui Polybius Un sistem criptografic prin substituţie îi este atribuit lui Iulius Cezar, acest fapt ne este relatat de Suetonius care spune că Iulius Cezar obişnuia sa-i scrie lui Cicero şi altor apropiaţi ai săi folosind un cifru în care literele erau înlocuite cu alte litere care începeau cu 3 poziţii mai la dreapta în alfabet. Astfel a devenea d , b devenea e etc. Până şi astăzi un astfel de cifru se numeşte "cifrul lui Cezar" chiar dacă literele sunt deplasate cu mai mult de 3 poziţii. În următorii aproximativ 1000 de ani criptografia a stagnat, majoritatea textelor se limitau la substituţia literelor, scrierea lor pe verticală, înlocuirea punctelor cu vocale etc. Nici una dintre scrierile apărute în această perioadă nu conţinea o metodă complexă de cifrare. Anul 1518 aduce cu el apariţia primei cărţi tipărite de criptologie. Ea aparţinea unui călugăr benedictin ale cărui cercetări în ştiinţe oculte şi alchimie au făcut din el o figură marcantă a vremurilor în care a trăit. Numele său era Johannes Trithemius, iar cartea sa, Polygraphiae libri sex, loannis Trithemii abbatis Peapolitani, quondam Spanheimensis, ad Maximilianum Caesarem ("Şase volume despre poligrafie de Johannes Trithemius, abate de Wurzburg, fost de Spanheim, pentru Împăratul Maximilian"), tipărită cu caractere gotice, conţinea o formă elementară de substituţie polialfabetică, deoarece alfabetele după care se făcea criptarea erau expuse pe mai multe linii, fiecare rând oferind un nou alfabet de criptare. Fiecare linie alfabetul era deplasata la dreapta cu câte o poziţie, tabloul pe care îl forma era un pătrat deoarece nu puteau fi mai multe linii decât numărul de litere din alfabet. Tabloul inventat de Johannes Trithemius produce pentru fiecare literă criptată un nou alfabet, acest alfabet este însă la bază tot "cifru Cezar". Johannes Trithemius a folosit acest tabel în cea mai simplă formă posibilă, el codifica prima literă a textului în clar cu primul alfabet, a doua literă cu al doilea alfabet, etc.
14
Figura 1.3: Tabloul lui Johannes Trithemius Charles Wheatstone a fost unul din oamenii geniali ai secolului 19, lui i se datorează ceea ce e azi cunoscut sub numele de cifrul Playfair şi aceasta datorită faptului că prietenul său Lyon Playfair l-a prezentat mai multor oficiali în Ianuarie 1854. Cifrul este primul din istoria criptografiei care foloseşte două litere astfel încât rezultatul să depindă de ambele. Un pătrat care conţinea literele alfabetului a fost special construit pentru acest cifru, pătratul se bazează pe cuvântul PALMERSTON, acesta fiind numele unuia dintre oficialii cărora le-a fost prezentat cifrul. Pătratul conţinea 5x5 celule, iar după PALMERSTON literele rămase sunt aşezate alfabetic. Metoda de criptare este următoarea: mai întâi se desparte textul în clar în grupuri de câte 2 litere, acolo unde există 2 litere alăturate identice ele vor fi despărţite şi se
Figura 1.5: Aşezarea literelor în pătratul Playfair va scrie un x între ele. Literele i şi j sunt privite ca fiind aceeaşi literă. Perechile de litere pot fi în una din 3 situaţii: literele se află pe aceeaşi linie, coloană sau nu se întâmplă niciuna din cele
15
două. Pentru situaţia în care literele se află pe aceeaşi linie, ele vor fi înlocuite cu literele imediat următoare spre dreapta, spre exemplu a şi m , ele vor fi criptate prin L şi E, os = NT, le=MP Dacă literele se găsesc pe aceeaşi coloană ele vor fi înlocuite prin litere imediat următoare de sub ele, de exemplu ac=SI, fy=QM, br=HB, etc. Dacă literele textului în clar nu apar în niciuna din situaţiile anterioare atunci să presupunem că avem de textul în clar ao , se ia litera apărută la intersecţia liniei lui a cu coloana lui o , anume M, care va fi prima literă a textului criptat, a doua literă se obţine mergând pe coloana literei a şi pe linia lui o, vom avea a doua literă a textului criptat care este S. Decriptarea mesajului este asemănătoare criptării, daca ac=SI atunci SI=ac. Această nouă metodă introdusă de Playfair şi Wheatstone avea tot dreptul să genereze entuziasm atât autorilor cât şi diplomaţilor şi oficialilor care urmau să o utilizeze. Punctele forte erau: rezistenţa sporită la analiza frecvenţei literelor, prin criptare se înjumătăţea numărul elementelor disponibile analizei frecvenţei asupra textului criptat. De exemplu un text de 100 de litere producea 50 de diagrafe criptate. Sistemul ADFGVX este poate unul dintre cele mai faimoase sisteme criptografice din istoria criptografiei. Numele său provine de la faptul că numai acele 6 litere apăreau în textul criptat, deşi la început, când primele mesaje au fost interceptate, 5 martie 1918, codul nu conţinea decât 5 litere, ADFGX. Germania începuse să înţeleagă că dacă războiul avea să mai dureze un rezultat favorabil avea tot mai puţine şanse. Comandamentul German nu putea să nu recunoască valoarea incalculabilă a elementului surpriză, astfel pentru a-şi spori şansele de victorie într-o conferinţă a experţilor germani în criptologie cifrul ADFGVX avea să fie ales. Responsabilitatea spargerii lui i-a revenit lui Georges Painvin, cel mai bun criptograf al Bureau de Chiffre al Franţei, care a primit primele mesaje în varianta cu 5 caractere a codului. A pornit de la ideea că textul criptat nu putea fi rezultatul unui tablou polialfabetic, deoarece ar fi fost o abordare stângace, mai putea să verifice doar ideea unui tabel de substituţie supus unei transpoziţii. Painvin nu avea o cantitate satisfăcătoare de text criptat pentru a realiza o analiză a frecvenţei, pentru a determina dacă se folosea o cheie diferită în fiecare zi. Altfel spus nu avea nici una din informaţiile de bază asupra mesajelor criptate. Primele încercări de decriptare au fost descurajatoare, analiza frecvenţei indica schimbarea cheii tabelului în fiecare zi. După 1 aprilie francezii au interceptat un număr de 18 mesaje ADFGX totalizând 512 grupuri de câte 5 litere. Două dintre mesaje fuseseră transmise în câte 3 părţi, primele două părţi ale mesajelor aveau mici bucăţi de text identice, acest fapt fiind observat de Painvin în data de 4 aprilie. Această identitate putea proveni de la faptul că se utilizase aceeaşi cheie pentru tabelul de transpoziţie şi bucăţile de text erau literele de pe liniile de sus ale tabelului. Painvin a împărţit criptogramele în segmente care deveneau astfel coloanele tabelului de transpoziţie. Observând că unele coloane erau mai lungi Painvin a presupus că ele fuseseră aşezate în stânga tabelului şi
16
numerele indicate de coloanele respective trebuie să fi fost primele din cheia de transpoziţie. Se puteau face acum primele aproximări asupra cheii. Alăturând coloanele şi numărând perechile de litere, Painvin nu a putut distinge caracteristici importante în majoritatea cazurilor cercetate. Dar în unele cazuri rezultatele obţinute indicau o substituţie monoalfabetică, aceasta datorită faptului că unele coloane fuseseră alăturate. După 48 de ore Painvin a reuşit să decripteze primele mesaje. Din punctul de vedere al germanilor criptarea era foarte uşor de realizat şi deşi textul criptat era dublul celui în clar prin faptul că se utilizau doar 5 caractere viteza de transmisie a mesajelor creştea. Succesul repurtat de Painvin avea să fie întrerupt de o schimbare adusă de germani sistemului de criptare. Începând cu 1 iunie ei au adăugat o a 6-a literă extinzând tabloul de criptare la dimensiunea 6x6. Painvin a început să lucreze la noul cifru în aceeaşi zi de la ora 17:00, ocupându-se de trei mesaje aparţinând aceluiaşi interval orar şi care fuseseră transmise de acelaşi expeditor. Observând că două dintre mesaje diferă doar prin 2 caractere , unul având 106 caractere, celălalt 108, Painvin a presupus că textele în clar puteau fi identice, diferenţiindu-se doar prin o modificare asupra adresei interne a celui din urmă. În continuare era nevoie de un aranjament al coloanelor astfel încât din coloanele tabelului de criptare să rezulte identitatea criptogramelor. Painvin a terminat decriptarea mesajelor la ora 19:00 pe 2 iunie , dar "mesajul cel mare" nu fusese încă descifrat, el urma să apară pe 3 iunie.
Figura 1.7: Tabelul cifrului ADFGVX descoperit de Painvin Acesta a fost un succes însemnat pentru Painvin, el mărturisind bucuria pe care a simţito descifrând mesajul german şi recunoscând că nimic nu se compară cu momentul decriptării unui mesaj de o asemenea importanţă. Desigur un asemenea efort l-a lăsat pe Painvin extenuat, el slăbind aproximativ 15 kilograme în timpul evenimentelor mai sus menţionate, singurul efort depus fiind să stea la biroul său. Arthur Scherbius este inventatorul faimoasei maşini criptografice Enigma, folosită de-a lungul celui de-al doilea război mondial de către nazişti. Enigma era o maşină care îngloba atât componente mecanice cât şi electrice. Partea mecanică era compusă în primele versiuni din 3 rotoare care erau fixate pe un ax, iar mecanismul intern producea mişcarea celor 3 discuri, care
17
în funcţie de rotaţiile lor, stabilite după o formulă produceau diferite transformări criptografice după fiecare apăsare de tastă. Transformarea criptografică în sine era determinată prin intermediul unui circuit electric care atunci când era activat aprindea un led care indica litera rezultată în urma procesului de criptare. Spre exemplu dacă un operator dorea să cripteze cuvântul "an" el trebuia să apese A pe tastatura maşinii şi ca rezultat ledul corespunzător literei S putea să se aprindă. Totul depindea de cheia de intrare folosită, care era fixată de fiecare dată pe rotoare, înainte ca operatorul să înceapă tastarea mesajului. Fiecare rotor avea o cablare complexă, curentul circulând de la un rotor la altul către un dispozitiv denumite reflector responsabil cu devierea curentului înapoi prin rotoare, dar pe o altă rută, iar în final către un led care indica litera rezultată în urma criptării (primele aparate Enigma nu dispuneau de un reflector). Elementul principal al Enigmei era rotorul, mai precis
Figura 1.8: Funcţionarea mecanismului reflector sistemul de rotoare. Un rotor conţinea cele 26 de litere ale alfabetului şi era înconjurat de un inel pentru a se putea fixa uşor prima literă din cheie. Fiecare rotor avea aproximativ 10 cm diametru, fiind un disc făcut dintr-un material temo-rezistent care era traversat de o serie de pini. Pe cealaltă faţă a discului pinii formau contacte electrice. Rotoarele erau montate pe un ax astfel încât alăturate pinii să fie în contact cu celalalt disc şi să formeze un circuit electric. Enigma fusese proiectată să fie un dispozitiv sigur chiar dacă circuitul electric format de rotoare era cunoscut unui inamic.
18
Figura 1.9: Rotoarele Enigmei Pentru a se evita implementarea unui simplu algoritm de substituţie, unele rotoare se întorceau numai la apăsări consecutive ale tastelor. Se asigura astfel transformarea criptografică diferită pentru fiecare poziţie a rotoarelor producându-se o substituţie polialfabetică. Fiecare rotor avea un inel zimţat care în anumite momente era blocat, permiţând astfel ca următorul rotor să poată fi incrementat la apăsarea unei taste. La sistemele care aveau numai un inel zimţat rotirea celui de-al doilea rotor se producea după 26 de caractere ale rotorului din stânga sa, în mod similar se rotea şi rotorul din dreapta. Rotorul din mijloc se mai putea roti simultan cu rotorul din dreapta, deci rotorul din mijloc făcea "dublu pas" rezultând o perioadă redusă după care textul criptat putea începe să se repete. Istoric vorbind mesajele criptate cu Enigma s-au limitat la mai puţin de 200 de caractere, neexistând astfel posibilitatea de a se repeta textul criptat. Cu excepţia primelor 2 modele, ultimul rotor era urmat de un reflector invenţie brevetată şi prezentă doar la aparatele Enigma. Maşinile Enigma dispuneau şi de un panou vertical care conţinea intrări ce reprezentau literele alfabetului, astfel încât dacă două astfel de intrări erau conectate printr-un fir cele două litere erau transpuse. Spre exemplu dacă A şi B erau conectate atunci A şi B erau interschimbate atât la intrare cât şi la ieşire. În general 10 perechi de litere erau schimbate pentru a face mai grea munca criptanaliştilor care descoperiseră o metodă uşoară de spargere a cifrului aparatelor care nu dispuneau de acest panou. Folosirea Enigmei implica divizarea armatei naziste într-un anumit număr de reţele fiecare dispunând de propriile configurări ale aparatelor Enigma. Pentru fiecare astfel de reţea criptarea şi decriptarea mesajelor era stabilită de un cod special. Codul se refera la ordinea rotoarelor, modul lor de selectare, configurarea mesajelor (în unele reţele exista un rotor în plus a cărui poziţionare era schimbată la fiecare mesaj) şi conexiunile de pe panoul vertical al Enigmei.
19
Figura 1.10: Enigma Toate aceste caracteristici trebuiau să fie identice pentru ca expeditorul şi destinatarul să poată comunica. Operatorii aparatelor Enigma primeau în fiecare lună o carte care conţinea configurările necesare. Spre exemplu, unele reţele utilizau un sistem de 5 rotoare din care cu aparatul se foloseau doar 3, o astfel de carte ar fi putut conţine numerele rotoarelor şi ordinea în care trebuiau aşezate pe ax. O altă configurare s-ar fi putut referi la litera care trebuia să fie litera curentă de pe rotor în momentul începerii criptării sau decriptării. Toate aceste configurări pentru un aparat care avea în total 6 rotoare din care se utilizau numai 3 simultan şi care puteau fi aşezate în 6 poziţii diferite (permutări) conduceau la 105,456 posibile alfabete de criptare. Să nu uităm că fiecare rotor putea fi blocat de o setare a inelului, iar aceasta adăuga mai multe
20
variaţii. Descrierea matematică a algoritmului poate fi specificată prin intermediul permutărilor, transformările literelor fiind un produs de permutări. Considerăm un aparat Enigma cu 3 rotoare aparţinând forţelor armate aeriene naziste. Fie P transformarea produsă de panoul vertical, U transformarea produsă de reflector, S,M,D transformările produse de rotorul din stângă, mijloc, dreaptă. Atunci criptarea E poate avea următoarea formulă: E = PDMSUS-1M-1D-1P-1 După fiecare apăsare a unei taste rotoarele îşi modifică poziţia, schimbând transformarea. De exemplu dacă rotorul D se roteşte i poziţii transformarea devine piDp-i unde p este permutarea ciclică, ea transformă A în B , B în C şi aşa mai departe. În mod similar rotorul din stânga şi din mijloc pot fi reprezentate prin j şi k rotaţii, funcţia de criptare devenind: E = P(piDp-i)(pjMp-j)(pkSp-k)U(piD-1p-i)(pjM-1p-j)(pkS-1p-k)P-1 Utilizarea criptografiei în perioada interbelică nu s-a limitat numai la domeniul militar, primele exemple care susţin acest lucru pot fi cazurile anchetate de Paza de Coastă americană în timpul prohibiţiei din anii 1920, 1930. Criptografia a fost utilizată în acea perioadă de contrabandiştii de alcool ca element de ascundere a activităţilor lor ilegale. Începuturile criptografiei pe acest domeniu al contrabandei sunt modeste, iniţial se utilizau pentru codificarea mesajelor codurile comerciale uzuale cum ar fi ABC Code, ediţia 6. Pe măsură ce reţelele îşi sporeau activitatea era normal să fie adoptate alte proceduri de comunicaţie, astfel după 1930 aproape fiecare navă de pe coasta Pacificului avea propriul cod. Traficul de mesaje realizat în acei ani era foarte mare pentru perioada aceea de timp. Consolidated Exporters Corporation, o companie care reuşise să-şi elimine competiţia şi să stabilească filiale în locurile strategice din pacific, transmitea peste două sute de mesaje zilnic către navele sale. Pe coasta de est situaţia era asemănătoare, aici se înregistrau undeva între 20 şi 50 de mesaje zilnic în zonele portuare New York şi Florida. Modul de operare al contrabandiştilor presupunea criptarea mesajelor în 5 paşi: 1. Textul în clar era criptat folosind un cod comercial, ABC Code, sau Acme. 2. Se adăuga 1000 la valorile obţinute. 3. Valorile obţinute erau căutate în alt cod comercial 4. Erau transcrise noile valori. 5. Textul obţinut era criptat din nou folosind o substituţie monoalfabtică. Responsabilă cu descifrarea mesajelor contrabandiştilor era Elizabeth S. Friedman, soţia lui William Friedman, care intr-un raport menţionează: "Unele dintre acestea [criptograme] sunt de o complexitate care nu a fost nici încercată de nici un guvern pentru cele mai secrete mesaje ale sale". Pe de o parte complexitatea mesajelor se datora reţelelor complicate în care erau implicaţi contrabandiştii, iar pe cealaltă codurile folosite de ei erau de o diversitate demoralizantă.
21
Era criptografiei moderne începe cu adevărat odată cu publicarea lucrării "Communication Theory of Secrecy Systems" de către Claude Elwood Shannon în jurnalul tehnic al Bell Systems în anul 1949, cu această lucrare practic se pun bazele matematice ale criptografiei. La foarte scurt timp după apariţia acestei cărţi Shannon publică împreună cu Warren Weaver, "Mathematical Theory of Communication" şi cu aceasta criptografia dispare din privirile publicului, şi se mută pe terenul organizaţiilor guvernamentale şi al altor organizaţii care preferă să nu publice rezultatele muncii lor. Anii 1960 sunt marcaţi de lucrul echipei conduse de Dr. Horst Feistel la primul "block cipher", denumit Lucifer. Se pare că numele provenea de la un joc de cuvinte, sistemul la care lucra Feistel înaintea lui Lucifer se numea "Demon" şi era o prescurtare a cuvântului englezesc "Demonstration" deoarece sistemul de operare folosit nu accepta nume mai mari. Acest sistem criptografic a fost dezvoltat la laboratoarele Watson Research Lab din cadrul IBM şi mai târziu a dus la dezvoltarea DES. Lucifer face parte din grupul de criptosisteme care folosesc Feistel rounds pentru criptarea datelor, adică se aplică un pas de criptare de mai multe ori unui bloc de biţi. În principiu acest cifru este o reţea substituţiepermutare care foloseşte s-boxes de 4 biţi care sunt selectate în funcţie de cheia de criptare. S-a demonstrat că prima versiune a cifrului era susceptibilă atacurilor criptanalitice care foloseau texte în clar alese. O versiune ulterioară a fost propusă, aceasta folosea blocuri de 64 de biţi şi cheia de criptare de 56 de biţi, această versiune fiind special concepută pentru a rezista criptanalizei diferenţiale. Una din variantele propuse ale cifrului Lucifer este varianta propusă de Arthur Sorkin în Cryptologia 8 (1984). Aceasta foloseşte 16 runde de criptare, iar cheia şi blocul de text în clar au ambele 128 biţi. Funcţia Feistel corespunzătoare operează pe un bloc de 64 biţi ai textului în clar, 64 biţi ai cheii şi 8 biţi de control ai interschimbării. Blocul de 64 biţi corespunzător textului în clar este tratat ca o serie de 8 octeţi, iar dacă bitul de control corespunzător unu octet particular al blocului textului în clar este 0 atunci jumătăţile de câte 4 biţi ale octetului sunt interschimbate, altfel dacă bitul de control este 1 jumătăţile sunt lăsate neschimbate. Se operează apoi asupra fiecărui octet cu un s-box de dimensiuni 4x4 (4 biţi la intrare 4 la ieşire), pentru această operaţie este nevoie de două s-box-uri S0 şi S1, S0 operează pe primii 4 biţi ai octetului iar S1 pe ultimii 4. Rezultatele operaţiilor sunt apoi concatenate şi se aplică un XOR folosind subcheia. Urmează o etapă de permutări desfăşurată în două părţi, prima parte presupune permutarea fiecărui byte după o permutare fixată iar apoi biţii sunt schimbaţi intre octeţi. Folosirea de subchei presupune un algoritm de programare a cheii care este foarte simplu, cei 128 biţi ai cheii sunt introduşi într-un registru, iar la fiecare rundă se extrag din partea stângă primii 64 de biţi ai subcheii şi 8 biţi pentru biţii de control ai interschimbării, după încheierea rundei registrul este shiftat la stânga cu 56 de biţi. Urmaşul direct al algoritmului Lucifer este DES ( Data Encryption Standard ) care a fost
22
propus în urma unui studiu al National Bureau of Stan-dards (NBS) redenumit actualmente National Institute of Standards and Technology (NIST) studiu ce arăta că USA are nevoie de un standard pentru criptarea comunicaţiilor guvernului, comunicaţii ce aveau ca obiect informaţii sensibile însă nu strict secrete. Astfel pe 15 Mai 1973 după o consultare prealabilă cu National Security Agency (NSA), NBS a lansat o cerere oficială pentru propuneri din partea societăţii civile a unui cifru ce avea să îndeplinească cerinţe stricte, niciuna din propunerile primite nu s-a dovedit viabilă. Ca urmare o a doua cerere a fost lansată la 27 August 1974 , de această dată IBM a răspuns cererii cu un cifru bazat pe Lucifer, dezvoltat de o echipă de criptanalişti ce includea pe Dr. Horst Feistel, Walter Tuchman, Don Coppersmith, Alan Konheim, Carl Meyer, Mike Matyas, Roy Adler, Edna Grossman, Bill Notz, Lynn Smith, şi Bryant Tuckerman. Implicarea NSA în dezvoltarea DES a creat multe suspiciuni. Aceste suspiciuni au fost susţinute şi de către pionierii criptografiei cu cheie publică Martin Hellman şi Whitfield Diffie care susţineau că scurtarea cheii de criptare şi modificarea s-box-urilor de către NSA, dădea agenţiei americane posibilitatea de a citi mesajele criptate fără efort. Aceste afirmaţii erau susţinute de faptul că unul din membrii echipei IBM care crease algoritmul declarase că s-box-urile fuseseră trimise la Washington şi se întorseseră sub o cu totul altă formă. Pe de altă parte se căutau dovezi că algoritmul ar fi fost special modificat astfel încât sa nu reziste unui atac brute force din partea NSA despre care se credea că ar fi putut face acest lucru cu câţiva ani înaintea comunităţii academice. Spargerea DES a costat 220.000$, aceasta fiind realizată în anul 1998 cu ajutorul unui super-calculator care a reuşit să spargă cifrul în mai puţin de 3 zile. Acesta a fost momentul hotărâtor când NIST a solicitat algoritmi criptografici din partea publicului, deşi în paralel cu DES exista triple-DES o variantă îmbunătăţită care cripta de 3 ori textul în clar. Cererea NIST a avut ca rezultat, după doi ani de analiză şi dezbateri alegerea algoritmului Rijndael, care devenea Advanced Encryption Standard (AES), înlocuitorul DES. Anul 1976 avea sa marcheze începutul criptografiei cu cheie publică. Aşa cum s-a întâmplat în multe alte cazuri din lumea ştiinţifică mai mulţi cercetători lucrau în mod independent la un sistem criptografic prin care se urmărea schimbul de informaţii criptate fără a fi nevoie ca părţile comunicante să dispună de cunoştinţe anterioare. Echipele cunoscute în literatura de specialitate erau Whitfield Diffie şi Martin Hellman de la Universitatea Stanford şi Ralph Merkle de la Universitatea California din Berkeley. Cele două grupuri se ocupau fiecare de criptarea cu cheie publică respectiv distribuţia de chei publice când au aflat fiecare despre progresele celeilalte părţi au decis să conlucreze după cum spune Martin Hellmann: "Fiecare aveam o parte cheie a puzzle-ului şi este adevărat că atunci când unul din noi spunea prima dată X, altul spunea prima dată Y şi aşa mai departe, a fost combinaţia dintre avansări şi regrese care a permis apariţia descoperirii." Lucrarea care enunţă primele idei cu privire la criptografia cu
23
cheie publică sau criptografia asimetrică este "New directions în cryptogtaphy", îi avea ca autori pe Diffie şi Hellman şi a apărut în noiembrie 1976 în ediţia IEEE Transactions on Information Theory. Lucrarea conţinea referiri la ideile lui Merkle, concepte ale criptografiei cu cheie publică, incluzând semnăturile digitale şi exemple de algoritmi care urmau să fie implementaţi. Publicarea ideilor lor a revoluţionat cercetarea în criptografie care până la acea dată fusese supusă multor restricţii atât reale cât şi presupuse din partea guvernului american şi a agenţiilor guvernamentale. Implicarea guvernului în sistemele criptografice nu se limitează numai la statul american, un exemplu de astfel de implicare este reliefat într-un articol din ziarul New York Times. Conform unui document publicat pe site-ul său de internet de Government Communications Headquarters, o organizaţie britanică, descrie rolul pe care l-a avut în descoperirea sistemelor cu cheie publică. Documentul detaliază cum trei angajaţi ai guvernului britanic au descoperit sistemul de criptare cu cheie publică cu câţiva ani înaintea lui Hellman şi Diffie. James Ellis este autorul documentului, matematician şi criptograf, decedat cu mai puţin de o lună înaintea apariţiei articolului din New York Times. Ellis susţine că o abordare mai practică a fost propusă de Clifford Cocks, dar care în esenţă se asemăna mult cu algoritmul propus de Rivest, Shamir şi Adleman, de asemenea un algoritm asemănător cu cel propus de Diffie şi Hellman a fost descoperit de Malcolm Williamson. Cu siguranţă istoricii vor cerceta aceste afirmaţii, însă în ultimă instanţă scrierea unei cărţi corecte din punct de vedere istoric pe această temă ţine de declasificarea informaţiilor deţinute de mai multe guverne. Inspiraţi de ideile revoluţionare ale lucrării Diffie-Hellman, Ronald Rivest, Adi Shamir şi Len Adleman au discutat posibilitatea realizării unui sistem criptografic care să realizeze criptarea cu cheie publică. Într-o zi de aprilie Ronald Rivest a avut ideea criptosistemului, el a notat totul pe o foaie pe care a trimis-o în ziua următoare colegilor săi. Astfel a luat naştere criptosistemul RSA, conceput de ce trei care erau profesori la MIT la acea dată. RSA este un cifru ce utilizează o pereche de chei, una publică şi una privată (secretă) şi se bazează pe problema logaritmului discret, adică pe dificultatea extragerii logaritmului dintr-un număr foarte mare. Algoritmul i-a fost prezentat lui Martin Gardner pentru a fi publicat în revista Scientific American, articolul publicat includea şi o ofertă din partea autorilor, oricine era interesat de detaliile tehnice ale algoritmului era invitat să trimită un plic auto-adresat, timbrat pentru a primi un raport complet asupra algoritmului. S-au primit mii de cereri din toate colţurile lumii. NSA nu a fost desigur mulţumită de acest lucru deoarece îl considera o posibilă ameninţare la adresa siguranţei naţionale a SUA şi a cerut oprirea imediată a trimiterilor poştale. Însă ulterior s-a dovedit ca NSA nu avea nici o susţinere legală pentru cererea sa şi trimiterile au continuat.Ca răspuns din partea societăţii civile la acest incident au fost apoi înfiinţate două ziare internaţionale care aveau ca obiect noutăţile criptografice, Cryptologia şi
24
The Journal of Cryptology. Publicarea algoritmului RSA nu a avut ca scop evidenţierea constrângerilor ce veneau din partea agenţiilor guvernamentale ci mai degrabă faptul că autorii doreau să-şi facă ideea cunoscută, acest lucru având sa fie în detrimentul lor deoarece nu au putut obţine un brevet de invenţie internaţional asupra algoritmului.
25
Capitolul 2
Criptosisteme clasice 2.1 Cifrul lui Caezar 2.1.1
Descriere generală Pentru a putea comunica informaţii private, oamenii au găsit adesea metode de la cele
mai simple până la cele mai complexe. Pentru a face o astfel de metodă să funcţioneze este nevoie ca partenerii de comunicaţie să se pună deacord asupra unei metode de secretizare a informaţiei transmise. Spre exemplu dacă un mesaj codificat ajunge la destinatar şi acesta nu cunoaşte o metodă prin care să-l poată decodifica şi citi informaţia care îi este transmisă, atunci mesajul îi este complet inutil. Una dintre formele cele mai simple de codificare a mesajelor despre care se spune că ar fi fost folosită de împăratul roman, Iulius Caesar, pentru a comunica cu generalii săi este deplasarea la dreapta sau stânga a alfabetului cu un număr de poziţii, fiecare literă fiind transformată în litera anterior existentă pe poziţia respectivă. În cazul de faţă se spune că Iulius Caesar folosea o deplasare cu 3 poziţii la dreapta a alfabetului, producând astfel o transformare care a fost foarte eficientă în vremea aceea deoarece foarte puţini dintre inamicii săi puteau citi sau scrie, fără să mai luăm în calcul metodele criptanalitice. Presupunând că Caesar ar fi avut un duşman care nu ar fi fost analfabet, acesta ar fi avut destul de puţine şanse pentru a rezolva cifrul fiindcă din câte se ştie cele mai vechi metode criptanalitice descoperite în care se relatează despre metoda analizei frecvenţei datează din jurul anului 1000 e.n. şi au fost descoperite în lumea arabă. În ciuda faptului că este un cifru relativ uşor de "spart" a supravieţuit o perioadă destul de îndelungată, fiind folosit de armata rusă până în jurul anului 1915, aceasta refuzând înlocuirea lui cu alte metode mai complexe datorită faptului că soldaţii ruşi nu puteau stăpâni foarte bine aceste metode. Desigur, criptanaliştii germani şi austrieci nu au întâmpinat dificultăţi deosebite în descifrarea mesajelor secrete ale armatei ruse. O complicare a acestui cifru ar putea fi transformarea sa într-un cifru de tip substituţie polialfabetică în care după criptarea unei litere alfabetul folosit să fie din nou deplasat cu un număr de poziţii.
2.1.2
Descriere matematică Acest mod de criptare poate fi definit şi reprezentat în aritmetica modulo n,
transformând mai întâi literele alfabetului în cifre după cum urmează: A = 0, B = 1,..., Z = 25. Definiţia 2.1.1. Fie a şi b doi întregi şi n un întreg pozitiv. Atunci scriem a = b(mod n) daca n | (b — a). Fraza a = b(mod n) este numită congruenţă şi va fi citită "a este congruent cu b modulo n", întregul n fiind numit modul.
26
Dacă vom divide pe a şi b prin n, vom obţine un cât şi un rest unde restul va fi între 0, n − 1 , de aici stabilim următoarele relaţii a = q1 n + r1 şi b = q2n + r2, unde r1 şi r2 între 0, n − 1 , iar conform definiţiei, trebuie să aibă loc relaţia r1 = r2. Expresia a mod n este interpretată ca fiind reducerea lui a modulo n. Aritmetica modulo n (adunarea(+), multiplicarea(*)) este definită analog ca în Z cu diferenţa că rezultatul este redus modulo n. Următoarele proprietăţi pot fi demonstrate foarte uşor: 1.
∀ a, b∈ Zn, a + b∈ Zn
2.
∀ a, b∈ Zn, a + b = b+ a
3.
∀ a, b,c∈ Zn, (a + b) + c = a + (b + c)
4.
0 este element neutru pentru adunare, adică ∀ a∈ Zn, a + 0 = 0 + a = a
5.
există un invers pentru fiecare a∈ Zn care este m-a. Astfel a+(m-a) = (m- a) + a = 0
6.
∀ a,b∈ Zn, a*b∈ Zn
7.
∀ a, b∈ Zn, a * b= b * a
8.
∀ a, b,c∈ Zn, (a * b) * c = a * (b * c)
9.
1 este element neutru pentru multiplicare, adică ∀ a∈ Zn,a*1 = 1*a = a
10. multiplicarea este distributivă faţă de adunare ∀ a, b,c ∈ Zn, (a+b) *c = a * c + b * c Pentru a defini codul lui Caesar vom considera cazul alfabetului englezesc care conţine 26 de caractere şi din acest motiv se va lucra în Z26. Definiţia 2.1.2. Un sistem ciptografic bazat pe deplasare în Z26 este definit astfel: P = C = K = Z26. Pentru 0 < K < 25, definim: ek(x) = (x + K)mod 26 dk(y) = (y — K)mod 26 unde x,y e Z26 şi x reprezintă textul în clar şi y textul criptat.
2.1.3
Algoritm Pentru criptarea efectivă a unui text se va face mai întâi o conversie de forma a ↔ 0, b
↔ 1, c ↔ 2,..., z ↔ 25 şi trecerea valorilor într-un vector de întregi care va reprezenta mesajul, fie el în forma în clar sau forma criptată. Algoritmul 2.1.1. Criptarea cu cifrul lui Caezar 1.
criptare_Caesar(Mn,k)
2.
i←0
3. while (i<=n) 3.1. Ci ←Mi +k
3.2.
i++
4. return Cn
27
Algoritmul 2.1.2. Decriptarea cu cifrul lui Caezar 1.
decriptare_Caesar(Cn,k)
2. i ← 0 3. while (i<=n) 3.1.
Mi ←Ci -k
3.2.
i++
4. return Mn
2.1.4 Exemplu Exemplul 2.1.1. Criptarea cu cifrul lui Caezar Text în clar: ATACATI Cheie:
FLANCUL DREPT
+3
Text criptat: DWDFDWL IODQFXO GUHSW Exemplul 2.1.2. Decriptarea cu cifrul lui Caezar Text criptat: WULPLWH DUPDWD Cheie:
-3
Text în clar:
TRIMITE
ARMATA
2.2 Cifrarea afină 2.2.1
Descriere generală
Cifrarea afină este un caz particular al cifrării prin substituţie, fiind o cifrare monoalfabetică şi simetrică. Acest tip de cifrare este vulnerabil la toate tipurile de atacuri care sunt posibile pentru cifrarea prin substituţie precum şi la alte tipuri de atacuri. Principala slăbiciune a cifrului constă în faptul că dacă atacatorul poate descoperi textul în clar a două caractere (prin analiza frecvenţei, brute force, sau pur şi simplu ghicind) poate apoi obţine cheia rezolvând un sistem de două ecuaţii cu două necunoscute.
2.2.2
Descriere matematică
Teorema 2.2.1. Congruenţa ax ≡ b(mod n) are soluţie unică pentru x ∈ Zn pentru ∀ b e Zn dacă ş i numai dacă cmmdc(a, n) = 1. Definiţia 2.2.1. Fie a ≥ 1 şi m ≥ 2 două numere întregi. Dacă cmmdc(a,n)=1 spunem că a şi m sunt numere relativ prime între ele. Numărul de numere relativ prime între ele din Zn este definit ca fiind φ (m) (funcţia Euler) Definiţia 2.2.2. Fie a ∈ Zn, inversul lui a faţă de operaţia de multiplicare în Zn se notează cu a-
28
1
mod n şi este un element a' care satisface relaţia aa' = a'a = 1(mod n). Pentru m fixat se
foloseşte notaţia a-1 care înlocuieşte a-1 mod n. Definiţia 2.2.3. Un sistem criptografic afin cu n=26 (Z26) este definit ca fiind P = C = Z26 şi K = {(a, b) ∈ Z26 x Z26 : cmmdc(a, 26) = 1} Pentru k = (a, b) ∈ Z26 definim funcţia de criptare: ek(x) = (ax + b)mod26 şi funcţia pentru decriptare dk(y) = a-1 (y — b)mod26 unde x, y ∈ Z26
2.2.3
Algoritm Algoritmul criptării afine este o modificare trivială a algoritmului criptării prin metoda
lui Caesar. Şi în acest caz se cere o conversie prealabilă a textului identică metodei de criptare a lui Caesar. Vom presupune implementată procedura cmmdc pentru calcularea celui mai mare divizor comun, folosită pentru a verifica faptul că a şi lungimea alfabetului folosit sunt numere prime între ele, în caz contrar mesajul criptat nu va putea fi decriptat. Algoritmul 2.2.1. Criptare afină 1.
criptare_afina(Mn,k,lung_alfabet)
2. if (cmmdc(a,lung_alfabet)>1) 2.1 3.
incheie_procedura
i <— 0
4. while(i
Ci = a* Mi + b
4.2.
i++
5. return Ci Algoritmul 2.2.2. Decriptare afină 1.
decriptare_afina(Cn,k,lung_alfabet)
2.
A ← 1/a
3.
B ← -b/a
4. k ← (A, B) 5.
criptare_afina(Cn,k,lung_alfabet)
29
2.3 Codul Hill 2.3.1
Descriere generală Există două metode de bază prin care se poate evita un atac criptanalitic prin analiza
frecvenţei asupra unui text criptat. Prima metodă presupune criptarea polialfabetică a textului, şi anume pentru aceeaşi literă a alfabetului textului în clar să existe mai multe litere diferite în textul criptat. Această soluţie a fost oferită de criptosistemul Vigenere şi alte criptosisteme polialfabetice. A doua abordare este criptarea textului în clar prin împărţirea sa în grupuri de n litere şi criptarea grupului spre deosebire de criptarea literă cu literă. Sistemul Playfair ascunde relativ bine comportamentul specific al literelor, dar un sistem care să fie capabil să cripteze un număr variabil de litere ar fi fost de preferat. În 1929 Lester S. Hill a propus un sistem algebric capabil să cripteze grupuri de câte n litere, unde n este un întreg pozitiv. La vremea respectivă calculele aferente criptării şi decriptării ar fi putut fi făcute pe o foaie de hârtie fără prea multă greutate pentru grupuri de până la 5 litere. Dincolo de această cifră dificultatea calculelor ar fi devenit o povară. Odată cu dificultatea efectuării calculelor creşte şi dificultatea spargerii cifrului, se pare că un astfel de sistem care ar fi folosit grupuri de 10 litere ar fi destul de greu de spart. Se pare ca Hill împreună cu un partener, Weisner au depus o cerere de brevetare a unei maşini mecanice (denumită Message Protector) care folosea matrici involuntare (A = A-1) pentru a uşura munca criptării şi decriptării mesajelor. Dispozitivul inventat de ei este descris în specificaţiile tehnice ca fiind mai degrabă un identificator de authenticitate. Împreună cu maşina venea o metodă prin care inventatorii propuneau unităţilor bancare o modalitate prin care să verifice dacă datele de pe cecuri au fost modificate. Ideea lor nu a avut succes, majoritatea potenţialilor clienţi nefiind interesaţi de o maşină care putea să multiplice matrici. Codul Hill implementat de maşina pe care a brevetat-o presupune ca toate calculele să fie făcute modulo 26. Înainte de a începe criptarea efectivă literele alfabetului vor fi numerotate, fiecare primind numere de la 0 la 25 inclusiv. Pentru criptarea textului se alege aleator o matrice inversabilă (Kn ∈ K) de dimensiune n x n care va reprezenta cheia de criptare. Textul în clar va fi împărţit în grupuri de mărime n care vor fi considerate matrici (Mn ∈ P)de dimensiune n x 1. Pentru a cripta mesajul vom considera Cn ∈ C definită astfel: Cn = An x Mn(mod26). Decriptarea se va face calculând inversa matricii An astfel Dn = A-1 x Cn(mod 26)
2.3.2
Descriere matematică Acest mod de criptare se bazează pe aritmetica modulo-n a matricilior pătratice din Z26.
În cadrul aritmeticii modulo-n a matricilor pătratice adunarea şi multiplicarea (notate + şi respectiv, *) sunt definite analog operaţiilor din Mmxm(Z). Diferenţa constă în faptul că rezultatul
30
este redus modulo-n. La fel ca în cazul utilizării cifrului Caesar literele alfabetului trebuie transformate în cifre din intervalul [0, 25]. Înainte de a defini acest tip de criptosistem trebuie introduse câteva noţiuni din aritmetica matricilor modulo-n. Definiţia 2.3.1. Fie matricile A şi B aparţinând Mmxm(Zn) spunem că A ≡ B dacă între aij ∈ A şi bij ∈ B există relaţia aij = bij, cu i,j = 1, m. Definiţia 2.3.2. Fie A o matrice, A ∈ Mmxm(Zn) spunem despre matricea A că este inversabilă dacă există o matrice B ∈ Mmxm(Zn) astfel încât: AB ≡ BA ≡ I B se va numi inversa lui A şi vom nota acest lucru prin A-1 = B mod n. Definiţia 2.3.3. Fie A o matrice, A ∈ Mmxm(Zn) determinantul matricii A este: det(A) = a(mod n). Teorema 2.3.1. Daca A este o matrice aparţinând Mmxm(Zn), A este inversabilă dacă şi numai dacă cmmdc(det( A), n) = 1. Definiţia 2.3.4. Un criptosistem bazat pe cifrul Hill, unde lungimea alfabetului este n = 26(Z26), este definit pentru P = C = Z26 şi K = {A ∈ Mmxm(Z26) : cmmdc(det(A), 26) = 1} pentru cheia k = A ∈ K, textul în clar p ∈ P scris sub formă de vector cu m componente definim funcţia de criptare ek(x) = Ax(mod26) şi funcţia pentru decriptare dk(y) = A-1y(mod 26) unde x,y ∈ Mmx1(Zn).
2.3.3
Algoritm Pentru algoritmii de mai jos se presupune că literele textului în clar dar şi ale textului
criptat sunt puse intr-o corespondenţă cu cifrele de la 0 la 25 de forma: a ↔ 0, b ↔ 1, ... , z ↔ 25. După crearea acestei corespondenţe textul în clar trebuie scris sub forma a t vectori obţinuţi prin împărţirea textului în clar în grupuri de câte m elemente. Dacă pentru ultimul vector avem un număr de elemente mai mic decât m vom repeta ultima literă pentru completarea vectorului. Algoritmul pentru criptare este următorul, (toate operaţiile sunt modulo-n): Algoritmul 2.3.1. Criptare Hill 1. criptare_hill(Mn,k,n) 2. if cmmdc(det(Mn),n)>1 2.1 incheie_procedura
31
3. for(i = 1,m) 3.1 while(col
decriptare_hill(Cn,k,n)
2.
for(i = 1,m)
3. 3.1
while(col
3.1.1 3.2 4.
col++ return Mi,j
32
Capitolul 3
Criptosisteme simetrice Criptosistemele bazate pe cheie simetrică asigură confidenţialitatea mesajelor transmise între doi parteneri de comunicaţie prin folosirea aceleiaşi chei atât pentru criptare cât şi pentru decriptare. Acest fapt este motivul pentru care aceste criptosisteme sunt numite cu cheie simetrică sau criptosisteme cu cheie privată. Un presupus adversar, Eve, care va intercepta un mesaj transmis între cei doi parteneri de comunicaţie nu va putea obţine informaţii semnificative despre textul transmis chiar dacă cunoaşte detalii despre algoritmul folosit atât timp cât nu cunoaşte cheia folosită pentru criptare. Ne propunem în acest capitol să analizăm diferenţele dintre două categorii ce aparţin de criptosistemele cu cheie simetrică sau cheie privată. Diferenţele între cele două categorii pleacă de modul în care se face criptarea, şi anume dacă textul în clar este criptat caracter cu caracter sau bit cu bit este vorba de un cifru de tip stream sau flux. Dacă datele sunt criptate sub formă de blocuri de text sau biţi, atunci acest cifru este un cifru de tip block.
Schema de aplicare a unui algoritm simetric Definiţia 3.0.5. Un criptosistem cu cheie simetrică este un tuplu de forma (P,C,K,E,D) care îndeplineşte următoarele cerinţe: 1.
P este un set finit de posibile texte în clar
2. C este un set finit de posibile texte criptate 3. K este un set finit de posibile chei de criptare 4. Pentru fiecare cheie k ∈ K există o regulă de criptare ek ∈ E şi o regulă corespunzătoare de
33
decriptare dk ∈ D. Fiecare ek : P → C şi dk : C → P funcţionează astfel încât: dk(ek(x)) = x pentru orice text în clar x ∈ P. Algoritmii folosiţi pentru a calcula ek(x), unde x ∈ P este un text în clar, şi dk(y), unde y ∈ C este un text criptat, sunt făcuţi publici, deci oricine poate cripta sau decripta un mesaj dacă deţine cheia potrivită. Pentru a stabili un criptosistem cu cheie privată Alice şi Bob trebuie să folosească o cheie comună care va fi folosită atât pentru a cripta, dar şi pentru a decripta. Această cheie trebuie păstrată secretă astfel încât adversari precum Eve să nu o poată accesa. Desigur o cerinţă imperativă a unui astfel de criptosistem este ca atunci când se cunoaşte textul criptat, y ∈ P, să fie imposibil să se calculeze rezultatul funcţiei dk(y). Dintre toate criptosistemele cunoscute, cele cu cheie simetrică sunt printre cele mai rapide, acest fapt le face foarte potrivite pentru a cripta volume mari de date. Dacă Alice şi Bob vor dori să schimbe mai multe imagini fără ca Eve să poată să le vadă, ei vor trebui mai întâi să schimbe o cheie a unui algoritm de criptare cu cheie simetrică. Pentru aceasta trebuie mai întâi să stabilească un canal de comunicaţie securizat. Aşa cum se va arăta în capitolele următoare se pot folosi criptosisteme bazate pe cheie publică pentru transmiterea cheii simetrice pentru ca apoi cei doi să dispună de o posibilitate de criptare rapidă. Putem spune deci că cele două criptosisteme se complementează reciproc pentru a oferi modele de securitate pentru medii nesigure de comunicaţie.
3.1 Cifrare de tip flux (stream) Un cifru de tip stream este un algoritm de criptare cu cheie simetrică. Astfel de algoritmi pot fi concepuţi să fie extrem de rapizi, mult mai rapizi decât oricare alt algoritm te tip bloc. În timp de algoritmii de tip bloc lucrează cu blocuri de biţi, algoritmii de tip stream operează cu unităţi mai mici de date, de obicei la nivel de bit. Criptarea anumitor porţiuni de text în clar cu un algoritm de tip bloc va avea ca rezultat acelaşi text criptat atunci când se foloseşte aceeaşi cheie, cu un algoritm de tip flux de date aceste subdiviziuni ale textului vor varia în textul criptat, acest lucru depinzând de momentul în care vor fi întâlnite în textul în clar atunci când se desfăşoară procesul de criptare. Un cifru de tip flux generează ceea ce se cheamă un flux al cheii de criptare, iar criptarea este obţinută prin combinarea fluxului cheii de criptare cu textul în clar. De obicei se foloseşte operaţia XOR la nivel de bit. Generarea cheii de cifrare poate fi făcută independent de textul în clar sau de textul criptat, în acest caz se spune că cifrul de tip flux este sincron. În cazul în care generarea cheii de criptare se face dependent de mesaj cifrul se numeşte asincron. Majoritatea algoritmilor sunt de primul tip.
34
Definiţia 3.1.1. Fie K mulţimea de chei posibile şi P mulţimea mesajelor posibile. În acest caz elementele lui P se vor numi caractere. Un cifru de tip stream este definit prin ek : P x K → C unde ek are forma: ek(p, k) = c = c1c2c3 ... funcţia ek criptează mesajul p = p1p2p3 . . . ∈ P ca fiind un şir de caractere c = c1c2c3... ∈ C folosind o cheie k = k1k2k3. . . ∈ K. Inversa funcţiei ek este funcţia dk definită astfel: dk(c, k) = p1p2p3 . . . = p care pentru aceleaşi elemente enumerate va avea ca rezultat textul în clar. În mod tipic caracterele din P şi cheile din K sunt cifre binare sau octeţi, pentru a păstra compatibilitatea cu sistemele de operare, unde intrările şi ieşirile sunt realizate prin intermediul fluxurilor de date. Desigur fluxul cheii de criptare trebuie păstrat secret. Deseori nu cheia de criptare este cea care este cunoscută de ambele părţi implicate în comunicaţie ci o cheie secretă din care se poate genera cheia de criptare.
3.1.1
Codul Vernam sau One Time Pad
Descriere generală Este poate unul dintre cele mai faimoase exemple de cifru care este teoretic imposibil de "spart". Cifrul a fost inventat de Gilbert Vernam, inginer la AT&T, şi perfecţionat împreună cu Joseph Mauborgne, căpitan în cadrul armatei S.U.A.. În acest cifru textul în clar este combinat cu o cheie obţinută aleator. Mai precis fiecare caracter sau fiecare bit al mesajului, împreună cu fiecare bit al cheii, este supus operaţiei XOR pe biţi. Astfel lungimea cheii trebuie să fie cel puţin egală cu lungimea mesajului. Din punct de vedere teoretic nu există nici o posibilitate de a decripta mesajul fără a cunoaşte cheia. Cheia este deci un element de securitate important în cadrul acestui cifru, ea poate fi folosită o singură dată şi obţinută în mod complet aleator. Altfel cifrul poate fi compromis foarte uşor. Dacă în generarea cheii se foloseşte un algoritm care generează biţii cheii respectând o structură atunci securitatea cifrului este redusă considerabil, deoarece în acest caz criptograma rezultată respectă o structură şi poate fi supusă unor atacuri criptanalitice. Cheia este folosită numai o singură dată pentru a cripta şi decripta un mesaj, de aici numele de "one time pad". Spre exemplu dacă aceeaşi cheie ar fi folosită pentru două mesaje atunci un atacator care se presupune ar fi interceptat cele două mesaje ar putea foarte uşor calcula c ⊕ c din cele două criptograme şi ar obţine cheia, lucru care inevitabil conduce la obţinerea de informaţii despre textul în clar. Pe lângă aceasta sunt dezavantaje evidente ale cifrului Vernam în ceea ce priveşte generarea cheii de criptare şi transportul cheii între părţile comunicante. Totuşi cele mai practice metode de criptare folosesc conceptele prezente în acest cifru. Generatorul aleator este înlocuit cu un
35
generator pseudo-aleator, cheile obţinute în urma utilizării unui astfel de generator sunt asemănătoare cu cele ale generatoarelor aleatoare cu diferenţa că sunt obţinute în urma unui algoritm determinist. În practică astfel de generatoare se bazează pe modurile de operare ale cifrurilor de tip bloc şi pe regiştrii de deplasare cu feedback sau revenire. Avantajul acestui cifru constă în faptul că poate fi dovedit a fi sigur. Presupunând că un atacator poate intercepta un mesaj care conţine un bit. Alice şi Bob vor să schimbe mesajul da=1, nu=0. Anterior transmiterii mesajului Alice şi Bob au schimbat cheia k obţinută în urma unei experienţe aleatoare. Mai întâi se presupune că oricare din mesaje poate fi transmis, fie da, fie nu. Adversarul, Eve interceptează criptograma c care în mod evident criptează fie da, fie nu. Din moment ce cheia a fost aleasă aleator Eve nu poate decât să ghicească conţinutul mesajului deoarece exista ½ şanse ca mesajul să fie da şi ½ şanse ca mesajul să fie nu. Însă Eve ştia aceste lucruri înainte să intercepteze mesajul. Deci nu a obţinut nici o informaţie semnificativă în urma interceptării mesajului. Acest lucru rămâne valabil şi în cazul în care una din posibilităţi are probabilitate mai mare de a se întâmpla. Un mare dezavantaj al cifrului Vernam constă în faptul că nu protejează mesajul împotriva eventualelor modificări survenite pe parcursul transmisiei. Dacă un atacator va modifica mesajul astfel încât după decriptare să aibă sens, destinatarul nu va putea observa acest lucru. Descriere matematică Definiţia 3.1.2. Un criptosistem bazat pe cifrul Vernam este un tuplu de forma (P,C,K,E,D) care trebuie să îndeplinească următoarele condiţii: 1. P este un set finit de posibile texte în clar 2. C este un set finit de posibile texte criptate 3.
K este un set finit de posibile chei de criptare
4.
P=K=C={0,1} şi funcţia de criptare este definită astfel ek : {0,1} x {0,1} → {0,1} ek(p, k) = p ⊕ k unde p este un mesaj din P şi k este o cheie din K. Pentru funcţia de decriptare dk : {0,1} x {0,1} → {0,1} considerăm c din C si avem: dk(c, k) = c ⊕ k pentru aceste operaţii p este de forma p = p1p2p3 . . ., k este deforma k = k1k2k3... şi c este deforma c = c1c2c3.. .. Prin semnul ⊕ am simbolizat XOR pe biţi (sau exclusiv).
Algoritm Algoritmul 3.1.1. Algoritm criptare Vernam 1.
criptare_vernam(Pn, Kn)
2.
i←0
3. while(i<=n)
36
Ci ← Pi ⊕ Ki
3.1.
4. return C Algoritmul 3.1.2. Algoritm decriptare Vernam 1. decriptare_vernam(Cn, Kn) 2. i ← 0 3. while(i<=n) Pi ← Ci ⊕ Ki
3.1.
4. return P Algoritmul de mai sus ar putea fi înlocuit cu un apel al funcţiei de criptare pentru textul criptat şi cheia Kn, deoarece în principiu se fac acelaşi operaţii. Exemplu Înainte de a prezenta un exemplu vom presupune că literele alfabetului suferă o conversie de forma celor de la criptosistemele clasice: a ↔ 0, b ↔1, c ↔ 2,..., z↔ 25. Exemplul 3.1.1. Criptare Vernam Presupunem că Alice doreşte să transmită mesajul "TRIMIT AJUTOR" folosind un canal de comunicaţie nesigur. Atât ea cât şi Bob se presupune că au obţinut printr-o metodă necunoscută un set de chei generate absolut aleator şi că una dintre aceste chei este "AFVKGHOPERTS". Pentru a cripta mesajul ei vom proceda în felul următor, operaţiile sunt în aritmetica modulo-26. Text în clar
T
R I M I T A J U T O R
Cheie
A F V K G H O P E R T S
Text în clar
19 17 8 12 8 19 0 9 10 19 14 17
Cheie
0 5 21 10 6 7 14 15 4 17 19 18
Criptograma 19 22 3 22 14 0 14 24 14 10 7 9 Text criptat
T W D W O A O Y O K H J
Exemplul 3.1.2. Decriptare Vernam Pentru a obţine textul în clar din textul criptat de mai sus pur şi simplu scădem din valorile literelor criptogramei valorile literelor cheii. Acolo unde valorile vor fi negative, ţinând cont de faptul că lucrăm în aritmetica modulo-26 aceste valori for semnifica 26 — V, unde V este valoarea negativă. Text criptat
T
W
D
W
O
A
O
Y
O
K
H
J
Cheie
A
F
V
K
G
H
O
P
E
R
T
S
37
Criptograma 19 22
3
Cheie
21 10
0
5
22 14 6
0
14 24 14 10
7
14 15
7
9
4 17 19 18
Text în clar 19 17 -18 12
8 -7
0
9 10
-7 -12 -9
Text în clar
I
A
J
T
3.1.2
T
R
I
M
T
U
O
R
SEAL - Software Encryption Algorithm
Descriere generală Algoritmul prezentat în continuare se află la a treia versiune. Proiectul SEAL a început în vara anului 1992 şi creatorii săi au dorit să ofere un răspuns la cerinţele existente atunci pe piaţă cu privire la un algoritm sigur, rapid şi cu implementare software eficientă. În construcţia algoritmului s-a avut în vedere faptul că algoritmul trebuia să funcţioneze excepţional pe un set restrâns de cerinţe minime ale sistemului, mai degrabă decât sa funcţioneze acceptabil pentru o gamă largă de componente hardware. Singurul aspect important cu adevărat era viteza cu care se făcea criptarea, desigur neignorând elementul de securitate. În total au fost luate în considerare 9 propuneri pentru ce avea să fie cifrul SEAL. Pentru fiecare din cele 9 propuneri cei doi autori ai cifrului urmau un drum asemănător în ceea ce priveşte testarea securităţii cifrului. Phillip Rogaway pregătea specificaţiile criptosistemului după care i le prezenta lui Don Coppersmith, acesta încerca diverse atacuri criptanalitice împotriva cifrului. Atacurile erau concepute de aşa natură pentru a se putea pune deacord asupra ideilor principale pe care cifrul trebuia să le urmeze. Desigur rezultatele atacurilor erau analizate de Rogaway şi slăbiciunile cifrului eliminate. Prima versiune a cifrului a fost prezentată prima dată în decembrie 1993. Versiunea prezentată în continuare este versiunea 3.0, de aceea vom înţelege că acronimul SEAL desemnează versiunea 3.0 a acestui cifru. SEAL este o familie de funcţii pseudo-aleatoare: sub controlul unei chei, mai întâi preprocesată într-un set de tabele, algoritmul produce dintr-o secvenţă de 32 de biţi, denumită "index de poziţie", un flux de biţi al cheii de criptare, care în mod esenţial poate fi de lungime arbitrară. Criptarea se face apoi în maniera cifrului Vernam, aplicând operatorul XOR fluxului cheii şi mesajului în clar. La fel ca în cazul cifrului Vernam, fluxul cheii trebuie folosit o singură dată. SEAL este un cifru rapid în comparaţie cu alţi algoritmi din clasa sa. Pe un procesor pe 32 de biţi SEAL poate cripta un octet de text la fiecare 4 cicli de ceas. Acest fapt îl face de 10 ori mai rapid decât DES. În aplicaţiile tipice care au nevoie de criptografia implementată în software, criptarea datelor este necesară atunci când doi parteneri doresc să comunice pe durata unei sesiuni. În aceste cazuri cheia de criptare k este determinată în faza de stabilire a sesiunii. De obicei
38
această fază durează câteva milisecunde şi nu este o operaţie critică în ceea ce priveşte timpul trecut până la încheierea ei. Este deci acceptabil, în cazul majorităţii aplicaţiilor, ca în faza de stabilire a sesiunii să se piardă câteva milisecunde pentru stabilirea conexiunii dintre cheia k(varianta scurtă a cheii) şi o reprezentare a unei transformări criptografice specializate a acestei chei. Aplicaţiilor care au nevoie de o fază de stabilire a acestor parametri mai rapidă nu le este indicată folosirea acestui cifru. Descriere matematică Funcţia SEAL este un tip de obiect criptografic denumit familie de funcţii pseudoaleatoare(PRF). Sub controlul unei chei k de lungime 160 biţi, SEAL produce dintr-un un şir de caractere, n, de 32 de biţi, un şir de caractere de lungime L, SEAL(k, n, L). Şirul L poate fi oricât de mare, în funcţie de cerinţele aplicaţiei care implementează algoritmul, mărimi ale lui L cuprinse între câţiva octeţi şi câteva mii de octeţi sunt însă anticipate. Desigur mărimea cheii k poate fi mai mare, însă ea va fi adusă la forma k = SHA — 1(k'), unde k’ este cheia de mărime arbitrară, iar SHA-1 este funcţia de hash cu acelaşi nume. SEAL fiind parte a familiei de funcţii pseudo-aleatoare, SEAL(k, • , L) ar trebui să "arate ca o funcţie aleatoare". Afirmaţia precedentă se referă la faptul că alegând aleatoriu o cheie k din {0, 1}160, adversarul, Eve, va trebui să ghicească dacă outputul pe care îl deţine este rezultatul funcţiei SEAL(k, •, L) sau este rezultatul unei funcţii cu adevărat aleatoare R(•). Scopul algoritmului este acela de a obţine o probabilitate apropiată de ½ cu care Eve poate ghici corect. În cazul unu cifru de tip flux, criptarea unui mesaj nu depinde numai de cheia k şi mesajul p, dar şi de "poziţia" n a mesajului în cadrul fluxului de date. Criptarea mesajului p la poziţia n este dată de {n, x ⊕ SEAL(k, n, L)), unde L = | x |. În cadrul altor aplicaţii n ar putea fi indexul unor date de pe un disc. Cifrul este bazat pe tabele după care se va face criptarea. Cheia k va fi folosită doar pentru generarea acestor tabele. Tabelele vor fi specificate folosind o funcţie G. Pentru k un şir de caractere cu lungimea de 160 biţi şi i un întreg cuprins în intervalul 0 < i < 232, Ga(i) este o valoare pe 160 de biţi. Funcţia G este funcţia de compresie din Secure Hash Algorithm SHA-1. Reindexăm funcţia G pentru a construi o funcţie Γ a cărei imagine este un cuvânt de 32 de biţi. Funcţia Γ este definită astfel: Γa(i) = Hiimod5 unde H 05 j || H15 j +1 || H 25 j +2 || H 35 j +3 || H 45 j + 4
= Ga(j)
unde j = [i/5]. Astfel un tabel al valorilor funcţiei Γ este identic cu un tabel al valorilor funcţiei G citit de la dreapta la stânga şi de sus în jos. Definim: T[i] = Γa(i)
pentru 0 < i < 512
S[j] = Γa(0x1000 + j)
pentru 0 < j < 256
R[k] = Γa(0x2000 + k)
pentru 0 < k < 256.
39
Pentru a cripta un kilobyte din SEAL(k, n, L) sunt necesare 4 cuvinte din R, aşadar dacă cineva a dat variabilei Lmax valoarea maximă posibilă pentru L, atunci va calcula R[k] pentru 0 < k < 4[Lmax/8192]. Pentru mărimea maximă permisă de 64 Kiloocteţi vor fi necesare 207 apeluri ale funcţiei de compresie SHA-1. O rundă a acestui cifru se referă la execuţia liniilor 1 → 8 în timp ce o iteraţie presupune execuţia liniilor 1 → 11. Sunt deci 8 runde pentru fiecare iteraţie executată. Algoritm Exemplu
Figura 3.1: Funcţia de iniţializare a cifrului SEAL
40
Figura 3.2: Funcţia SEAL
41
Capitolul 4
Sisteme de criptare prin chei publice (asimetrice) Spre deosebire de sistemele de criptare bazate pe chei secrete, care presupun o singură cheie cunoscută de emiţător şi receptor, sistemele bazate pe chei publice folosesc două chei: una publică şi alta privată. Cheia publică este pusă la dispoziţia oricărei persoane care doreşte să transmită un mesaj criptat. Cheia privată este utilizată pentru decriptarea mesajului, iar nevoia de a face schimb de chei secrete este eliminată. Pentru înţelegerea sistemului, sunt necesare următoarele lămuriri: •
cheie publică nu poate decripta un mesaj criptat;
•
se recomandă ca o cheie privată să nu deriveze dintr-o cheie publică;
•
un mesaj care a fost criptat printr-o anumită cheie poate fi decriptat cu altă cheie;
•
cheia privată nu este făcută publică.
Dacă notăm cu C un text criptat şi cu P un text clar (P este notaţia consacrată pentru plain text), iar Kp este cheia publică şi Ks cheia privată (secretă), procesul este ilustrat astfel: C = Kp(P) şi P = Ks(C). Şi invers este adevărat: C = Ks(P) şi P = Kp(C). Criptografia prin chei publice este posibilă în aplicaţiile care funcţionează într-un singur sens. O funcţie în sens unic este aceea care este uşor de calculat într-o direcţie, dar este dificil de calculat în sens invers. Pentru o astfel de funcţie, dacă y = f(x), este simplu de determinat valoarea lui y dacă se cunoaşte x, dar este foarte dificil să-l determini pe x cunoscându-l pe y. Într-o astfel de situaţie se află căutările telefonice. Este uşor să găseşti numărul cuiva dacă ştii numele şi adresa, dar este foarte dificil să găseşti pe cineva într-o carte de telefon cunoscându-i doar numărul de telefon. Pentru ca funcţiile cu sens unic să fie utile în contextul criptografiei bazate pe chei publice ele trebuie să aibă o trapă, adică un mecanism secret care să permită realizarea cu uşurinţă a funcţiei inverse funcţiei în sens unic. Printr-o astfel de modalitate se poate obţine x dacă se dă y. În contextul criptografiei bazate pe chei publice este foarte dificil să se calculeze cheia privată din cheia publică dacă nu se ştie trapa. De-a lungul anilor s-au dezvoltat mai mulţi algoritmi pentru cheile publice. Unii dintre ei se folosesc pentru semnătura digitală, pentru criptare sau în ambele scopuri. Din cauza calculelor numeroase solicitate de criptarea prin chei publice, aceasta este de la 1.000 la 10.000 de ori mai înceată decât criptografia prin chei secrete. Astfel, au apărut
42
sistemele hibride care folosesc criptografia prin chei publice pentru transmiterea sigură a cheilor secrete utilizate în criptografia prin chei simetrice. Dintre algoritmii importanţi ai cheilor publice, amintim Diffie-Hellman, RSA, El Gamal Knapsak şi curba eliptică, foarte utilizaţi fiind primii doi algoritmi.
Schema de aplicare a unui algoritm asimetric
4.1 Schimbul de chei Diffie-Hellman Metoda schimbului de chei Diffie-Hellman, cunoscută şi ca metoda de distribuţie a cheilor publice, poartă numele a doi specialişti de la Standford University, Whitfield Diffie şi Martin Hellman. În anul 1976, ei au inventat o metodă prin care două părţi pot cădea de comun acord să comunice prin mesaje secrete fără să fie nevoie de o terţă parte, de un schimb off-line sau de transmiterea vreunei valori secrete între ele. Independent, Ralph Merkle a venit cu o soluţie de distribuţie a cheilor publice, numai că metoda propusă implica substanţiale cheltuieli pentru efectuarea calculelor şi a transmisiei. Varianta realizată de Diffie şi Hellman a fost numită sistemul distribuţiei cheilor publice sau al schimburilor de chei publice. Metoda Diffie-Hellman se bazează pe conceptul perechii de chei publică-privată. Protocolul începe cu fiecare parte care generează independent câte o cheie privată. În pasul următor, fiecare calculează câte o cheie publică, aceasta fiind o funcţie matematică a cheilor private respective. Urmează schimbul de chei publice. În final, fiecare dintre cele două persoane calculează o funcţie a propriei chei private şi a cheii publice a celeilalte persoane. Matematica este cea care va face să se ajungă la aceeaşi valoare, care este derivată din cheile lor private. Ele vor folosi valoarea ca pe cheie a mesajului. Diffie şi Hellman folosesc exponenţierea în aritmetica modulară pentru a calcula cheile
43
publice şi cheia mesajului. Aritmetica modulară este ca şi aritmetica standard, cu excepţia faptului că foloseşte numere numai în intervalul 0 la N, numit modulo. Atunci când o operaţie produce un rezultat care este mai mare sau egal cu N, N este scăzut repetat din rezultat până când valoarea se încadrează în intervalul 0 la N-1 (ca şi cum s-ar împărţi la N şi se ia în seamă restul). De exemplu, 3+4 mod 5 = 2. Dacă rezultatul este negativ, N se adaugă acestuia până când se va încadra în intervalul 0 la N-1. De exemplu, 3-8 mod 7 = -5 mod 7 = 2. În aritmetica modulară, exponenţierea este o funcţie într-un singur sens. Aceasta înseamnă că este uşor de calculat un număr y = gx mod N pentru o valoare secretă x, însă este mult mai dificil să se calculeze x din y, dacă numerele sunt suficient de mari, ca de exemplu o lungime de câteva sute de cifre (noi presupunem că g şi N sunt cunoscute). Aceasta este referită ca şi problema logaritmului discret pentru că x este logaritm din y în baza g (mod N), iar numerele sunt finite şi întregi. Cu metoda Diffie-Hellman a schimbului de chei publice, Alice şi Bob stabilesc cheia mesajului secret după cum urmează. Alice generează o cheie secretă xa şi Bob o cheie secretă xb. După aceasta, Alice calculează o cheie publică ya, care este g ridicat la puterea xa modulo p, unde p este un număr prim (adică nu poate fi descompus în produsul a două numere), g fiind mai mic decât p. Identic, Bob calculează o cheie publică yb, prin ridicarea lui g la puterea xb modulo p. Ei vor schimba valorile publice ale acestora. Apoi, Alice ridică cheia publică a lui Bob la puterea exponentului său, xa modulo p, în timp ce Bob ridică cheia publică a lui Alice la exponentul său, xb modulo p. Amândoi vor obţine acelaşi rezultat, g ridicat la puterea xa şi xb, iar rezultatul obţinut va fi folosit de amândoi drept cheia K a mesajului. Matematic, totul se va exprima astfel: ya = gxa mod p yb = gxb mod p K = yaxb mod p = ybxa mod p = gxa*xb mod p Deşi în practică se folosesc numere foarte lungi, de câteva sute de cifre, pentru a ajuta la înţelegerea modului de funcţionare, vom folosi numere mici. Exemplul 1 Să presupunem că p = 7, g = 3, cheia lui Alice xa = 1 şi a lui Bob xb = 2 Vom avea: •
Alice calculează cheia sa publică: ya = gxa mod p = 31 mod 7 = 3
•
Bob calculează cheia sa publică: yb = gxb mod p = 32 mod 7 = 2
•
Alice calculează K = ybxa mod p = 21 mod 7 = 2
•
Bob calculează K = yaxb mod p = 32 mod 7 = 2 sau
K = gxa*xb mod p = 32x1 mod 7 = 9 mod 7 = 2. Exemplul 2 Să presupunem că p = 5, g = 4, cheia lui Alice xa = 3 şi a lui Bob xb = 2 •
Alice calculează cheia sa publică: ya = gxa mod p = 43 mod 5 = 4
44
•
Bob calculează cheia sa publică: yb = gxb mod p = 42 mod 5 = 1
•
Alice calculează K = ybxa mod p = 13 mod 5 = 1
•
Bob calculează K = yaxb mod p = 42 mod 5 = 1 sau
K = gxa*xb mod p = 43x2 mod 5 = 4096 mod 5 = 1. Se observă că în ambele cazuri K ia valori identice, 2, respectiv 1. Metoda Diffie-Hellamn, precum şi variantele ei sunt utilizate în câteva protocoale de securitate a reţelelor şi în produse comerciale, inclusiv la AT&T 3600 Telephone Security Device, la Fortezza card – o variantă de carduri criptate, şi la Pretty Good Privacy pentru criptarea e-mail-urilor şi a unor fişiere.
4.2 Sistemul RSA RSA provine de la numele de familie ale inventatorilor săi, Rivest, Shamir şi Adleman. Pe vremea când Diffie şi Hellman au inventat metoda distribuţiei prin chei publice, aceştia au gândit şi la un alt concept mult mai performant, dar n-au găsit soluţia implementării lui – criptografia prin chei publice. Prin aceasta, fiecare persoană are o pereche de chei publică şi privată, unică, pe termen lung. Componenta publică, transmisibilă prin Internet şi partajată cu toată lumea, este folosită pentru criptarea datelor, în timp ce componenta privată, greu de calculat pe baza cheii publice, este folosită pentru decriptare. Criptografia prin chei publice este numită şi „criptografie prin două chei” şi „criptografie asimetrică”. Metodele convenţionale, descrise anterior, care apelează la o singură cheie, sunt referite ca şi „criptografie printr-o singură cheie”, „criptografie prin cheie privată”, „criptografie prin cheie secretă”, „criptografie simetrică” şi „criptografie convenţională”. La scurt timp după ce Diffie şi Hellman au lansat ideea revoluţionară a criptografierii prin chei publice, trei profesori de la MIT (Massachusetts Institute of Technology), Ronald Rivest, Adi Shamir şi Leonard Adleman, au venit cu soluţia implementării ei. Varianta propusă se numea RSA. Concomitent, Hellman şi Merkle au inventat o altă metodă, numită „trapdoor knapsacks”, bazată pe alt model matematic. Oricum, modelul lor a fost spart la începutul anilor 1980. Pentru a transmite un mesaj cu text clar către Bob, folosind sistemul cheilor publice, gen RSA, Alice generează cheia K a mesajului şi o foloseşte prin intermediul criptosistemului convenţional, cum ar fi DES, pentru criptarea mesajului. Utilizând criptografia prin chei publice, ea, de asemenea, criptează K, sub cheia publică a lui B, denumită KBobpub. Apoi, ea transmite atât cheia criptată, cât şi mesajul criptat către Bob. Bob, la rândul său, apelează la propria lui cheie privată, denumită KBobpriv, pentru a decripta cheia K a mesajului, apoi el foloseşte cheia K pentru decriptarea mesajului. Modelul este redat sub formă grafică în figura 4.1.
45
Teoretic, Alice poate să transmită textul către Bob folosind doar criptarea prin cheia publică a lui Bob, apelând doar la criptografia prin cheie publică. În practică, însă, nu se întâmplă aşa datorită încetinirii procesului de transmitere prin mulţimea calculelor de efectuat. E mult mai rapid să foloseşti o metodă convenţională de mare viteză pentru criptarea mesajului, rezervând metoda cheii publice doar pentru distribuţia cheii. În plus, nu se consideră o practică prea inspirată să foloseşti aceeaşi cheie pentru criptarea mesajelor de-a lungul unei mari perioade de timp, din cauza sporirii şanselor de a fi atacată. Perechea de chei publică şi privată este uneori numită „cheia cheii de criptare”, pentru a o deosebi de cheia mesajului (cheia datelor criptate).
Fig. 4.1 Alice transmite un mesaj lui Bob folosind o combinaţie de cheie singulară şi criptografiere prin cheie publică Ca şi Diffie-Hellman, sistemul RSA calculează exponenţierile în aritmetica modulară folosind numere cu lungimea de câteva sute de cifre. În RSA, totuşi, fiecare persoană are un modulo N personal, care este produsul a două numere prime secrete. Cheia K a mesajului este criptată prin ridicarea ei la puterea exponentului public a lui Bob (eb), modulo Nb, iar decriptarea se efectuează prin ridicarea ei la puterea exponentului privat al lui Bob (db), modulo Nb. presupunând că C va prelua valoarea cheii textului criptat, aceasta se va exprima matematic astfel: C = Keb mod Nb (criptarea lui K) K = Cdb mod Nb (decriptarea) Pentru ca exponentul folosit la decriptare (db) să poată reface exponenţierea cu eb la criptare, formula eb * db = 1 mod (pb-1)(qb-1) trebuie să fie realizată; în care Nb = pb * qb pentru numerele prime pb şi qb. În aceste condiţii, oricine ştie eb, pb şi qb poate să folosească formula pentru a deduce db. Din acest motiv, pb şi qb nu se divulgă, chiar dacă eb şi Nb sunt făcut publice. Calcularea factorilor primi ai lui Nb se consideră a fi, din punct de vedere matematic, nerezolvabilă pentru
46
numere foarte mari. Vom folosi valori mici ale numerelor din exemplul următor pentru a uşura înţelegerea mecanismului. Să presupunem că Bob a ales numerele prime secrete pb = 5 şi qb = 3, de unde rezultă că Nb = pb * qb = 5 * 3 = 15. Apoi alege exponentul secret db = 29 şi îl calculează pe eb după formula eb * db = 1 mod (pb-1)(qb-1), ceea ce va conduce la eb * 29 = 1 mod (4 * 2), 29 * eb = 1 mod 8. Prin încercări succesive rezultă eb = 5. Dacă Alice doreşte să transmită cheia K = 2 către Bob, ea o va cripta cu exponenţierea din cheia publică a lui Bob, efectuând calculele: C = Keb mod Nb = 25 mod 15 = 32 mod 15 = 2 Când Bob obţine cheia criptată o va decripta folosindu-şi cheia secretă drept exponent, prin calculul: K = Cdb mod Nb = 229 mod 15 = 2 (Se aplică mod (2 ** 29, 15)). Se observă că s-a obţinut valoarea K = 2 a cheii transmisă de Alice.
4.3 Semnătura digitală Inventarea criptografiei prin chei publice a adus două importante mutaţii valoroase. Prima, discutată anterior, permite transmiterea unui secret către o altă persoană fără să fie nevoie de o a treia persoană de încredere sau de un canal de comunicaţie off-line pentru a transmite cheia secretă. A doua mutaţie s-a produs pe planul calculării semnăturii digitale. O semnătură digitală este un bloc de date (alcătuit din cifre binare, ceea ce în engleză înseamnă binary digit, de unde şi digitală – exprimată printr-un şir de cifre) ce se ataşează unui mesaj sau document pentru a întări încrederea unei alte persoane sau entităţi, legându-le de un anumit emiţător. Legătura este astfel realizată încât semnătura digitală poate fi verificată de receptor sau de o terţă persoană şi nu se poate spune că a fost uitată. Dacă doar o cifră binară nu corespunde, semnătura va fi respinsă în procesul de validare. Semnătura digitală stabileşte autenticitatea sursei mesajului. Dacă o persoană nu-şi dă în vileag cheia personală privată nimeni nu poate să-i „imite” semnătura. O semnătură digitală nu înseamnă şi recunoaşterea dreptului de proprietate asupra textului transmis, ci ea atestă faptul că persoana semnatară a avut acces la el şi l-a semnat. Documentul poate fi şi sustras de undeva. Totuşi, atunci când semnarea este cuplată cu crearea documentului, semnătura poate oferi o probă evidentă a originii documentului. În această categorie intră fotografiile luate cu camere digitale bazate pe chei private. În acest caz, proba este de necontestat. Aşa se procedează când se intenţionează realizarea protecţiei împotriva manipulării imaginilor cu ajutorul calculatorului. La fel pot fi camerele video, radio-receptoarele şi alţi senzori care pot semna ieşirea pentru a-i certifica originea.
47
Deşi semnătura digitală este implementată prin sistemul criptografiei cu chei publice, transformările ce au loc sunt diferite de cele de la criptare. În timp ce la criptare fiecare parte are o pereche de chei publică-privată, în cazul semnăturii digitale, componenta privată este întrebuinţată pentru semnarea mesajelor, iar cea publică este folosită de o altă parte pentru a verifica semnătura. Modul de funcţionare este redat în figura 4.2. După prezentarea suplimentară a algoritmilor semnăturii digitale să parcurgem paşii „dialogului” purtat de Alice cu Bob. Alice intenţionează să semneze un mesaj. Ea va începe prin calcularea unei valori rezumat a mesajului, care este determinată printr-o funcţie publică de dispersie (hashing). În acest moment nu se folosesc chei. În pasul următor, ea va utiliza o cheie privată pentru semnătură KSAlicepriv, pentru a calcula o transformare criptografică a valorii rezumat a mesajului. Rezultatul, care este semnătura sa pe mesaj, se ataşează mesajului. Din acest moment, mesajul semnat poate fi transmis altei persoane, inclusiv Bob, sau poate fi stocat într-un fişier.
Fig. 4.2 Alice transmite către Bob un mesaj semnat şi criptat. Mesajul este criptat printr-o singură cheie de criptare, iar cheia prin criptarea cu cheie publică. Mesajul este semnat cu sistemul semnăturii digitale prin cheie publică Să presupunem că Bob va recepţiona mesajul ei. El poate să valideze semnătura lui Alice făcând apel la cheia ei publică pentru semnătură, KSAlicepub, ce va fi folosită ca intrare într-o funcţie criptografică prin care se va testa dacă valoarea rezumat determinată de el este aceeaşi cu valoarea codificată prin semnătura lui Alice. Dacă da, va accepta semnătura. Se observă că
48
nici o cheie de-a lui Bob nu este folosită în procesul de validare a semnăturii transmise de Alice, ci doar cheile ei. În schimb, când Alice transmite cheia unui mesaj secret către Bob, ea va folosi doar cheile lui Bob. Dacă Alice doreşte să transmită un mesaj către Bob, mesaj care să fie semnat şi criptat, procesul presupune utilizarea cheilor pentru semnătură ale lui Alice (KSAlicepriv, KSAlicepub), cheilor lui Bob de criptare a cheii (KBobpub) şi o cheie a mesajului, K. În sinteză, iată paşii: •
Alice generează o cheie aleatoare a mesajului, K. Alice criptează mesajul M cu cheia K, obţinând mesajul criptat, MC;
•
Alice criptează cheia K folosind cheia publică a lui Bob de criptare a cheii, KBobpub, rezultând cheia criptată, KC;
•
Alice procesează o semnătură S folosind cheia sa privată pentru semnătură, KSAlicepriv;
•
Alice transmite către Bob KC, MC şi S;
•
Bob foloseşte cheia sa privată de criptare a cheii, KBobpriv, pentru a decripta KC şi a obţine K;
•
Bob foloseşte K pentru decriptarea MC şi obţinerea textului-clar, M;
•
Bob foloseşte cheia publică pentru semnătură a lui Alice, KSAlicepub, pentru validarea semnăturii S.
Tot acest proces este folosit de sistemul de criptare e-mail-uri, aşa că Alice şi Bob nu vor efectua operaţiunile enunţate, ci le face calculatorul. Pentru a dispune de aceste servicii este necesară contactarea unor firme specializate. Microsoft recomandă Verisign, cu site-ul www.verisign.com, deşi sunt mai multe oferte. Oricum e necesară obţinerea unui ID digital. La click-ul pe Sign apare semnul sigiliului special pentru semnătură, iar la comanda Send, vi se oferă un meniu prin care puteţi începe dialogul pentru obţinerea ID-ului digital pentru semnătură, prin click pe butonul Get Digital ID. Pentru a studia cadrul legal al utilizării semnăturii electronice în România, puteţi obţine informaţiile dorite de pe site-ul www.legi.internet.ro/lgsemel.htm.
4.4 Sisteme de certificare a cheilor publice Un sistem criptografic bazat pe chei publice poate fi compromis de o persoană (A) care transmite o cheie publică altei persoane (B) către un alt partener (C). În acest caz (C) va folosi cheia publică a lui (B) pentru a cripta mesajul, cu intenţia de a ajunge înapoi la (B), numai că (A), folosindu-şi propria cheie privată, va face ca receptorul să fie el, reuşind astfel să decripteze mesajul care era adresat lui (B). Pentru a se evita o astfel de ciudăţenie, se recurge la procesul certificării, prin care
49
persoanele sunt legate de cheile lor publice. Documentul oferit de o Autoritate de Certificare acţionează ca orice alt act emis de un notar şi se efectuează după aceleaşi reguli, adică pe baza verificării identităţii persoanei solicitante, concretizându-se prin atribuirea unei chei publice pentru persoana respectivă. Unitatea de certificare semnează certificatul cu propria cheie privată. Din această cauză, persoana este verificată ca emiţător dacă este necesară cheia ei publică pentru deschiderea sesiunii de transmitere a mesajelor criptate şi/sau semnăturilor electronice. Certificatul conţine numele subiectului, cheia lui publică, numele autorităţii de certificare, perioada de valabilitate a certificatului. Pentru a verifica semnătura autorităţii de certificare, cheia ei publică trebuie să fie verificată încrucişat cu o altă autoritate de certificare. În SUA formatul certificatelor este reglementat prin standardul X.509. Certificatele sunt păstrate într-un Registru (Repository), alături de lista certificatelor revocate. În principiu, operaţiunile pentru obţinerea certificatelor digitale şi validarea tranzacţiilor sunt redate în figura 4.3.
Fig. 4.3 Prezentarea unei tranzacţii cu certificate digitale
4.5 Infrastructura cheilor publice (PKI) Infrastructura cheilor publice (PKI – Public Key Infrastructure) îşi propune să rezolve probleme manageriale din domeniul cheilor publice, integrând semnături şi certificate digitale cu o mare diversitate de alte servicii specifice comerţului electronic, prin care se solicită oferirea integrităţii, controlului accesului, confidenţialităţii, autentificării şi a nerepudierii tranzacţiilor electronice. Infrastructura cheilor publice cuprinde certificatele digitale, autorităţile de certificare, autorităţile de înregistrare, politici şi proceduri cu chei publice, revocarea certificatelor, nerepudierea, marcarea timpului, certificarea încrucişată, aplicaţii de securitate, LDAP (Lightweight Directory Acces Protocol). LDAP oferă un format standard de accesare a directoarelor certificatelor. Aceste directoare sunt stocate pe serverele LDAP dintr-o reţea, serverele de pe aceste reţele oferind chei publice
50
şi certificate X.509 pentru companii. În SUA, majoritatea certificatelor sunt emise de Verisign, Inc., recomandată şi de Microsoft. Compania oferă trei clase de certificate personale, numite digital IDs, toate legate de e-mail: •
clasa 1 de certificate verifică adresa e-mail a utilizatorului, fără să solicite alte elemente de autentificare. După exprimarea interesului pentru un certificat, sistemul trimite o confirmare cu un PIN pe adresa de e-mail a persoanei. Utilizatorul se întoarce la site-ul anterior (al companiei) şi oferă PIN-ul, după care este generat un ID digital şi se memorează în calculatorul utilizatorului.
•
clasa 2 de certificate cere utilizatorului să mai introducă şi Social Security Number (codul oferit de Internal Revenue Service), adresa şi seria carnetului de şofer;
•
clasa 3 de certificate digitale este destinată companiilor ce publică software, oferindule un grad mult mai mare de securitate, dar există şi o variantă pentru persoane fizice ocupate cu transferuri bancare, contracte ş.a. Este o clasă mult mai sigură.
Oricum, realizarea unei infrastructuri a cheilor publice la nivel internaţional, dar şi naţional, este o mare problemă, nu din punct de vedere tehnic sau managerial, ci al legislaţiei.
4.6 Algoritmi 4.6.1 Algoritmul DES Algoritmul DES (Data Encryption Standard) a fost dezvoltat pentru guvernul Statelor Unite şi pentru folosinţă publică. El a fost dezvoltat plecând de la algoritmul “Lucifer” conceput în Laboratoarele IBM. În mai 1973, revista Federal Register a sintetizat principiile care trebuie să stea la baza proiectării unui algoritm criptografic standard: -
algoritmul trebuie să asigure un înalt nivel de securitate;
-
algoritmul trebuie să fie complet specificat şi simplu de înţeles;
-
securitatea algoritmului trebuie să fie asigurată de cheie şi nu trebuie să depindă de păstrarea secretă a algoritmului;
-
algoritmul trebuie să fie disponibil tuturor utilizatorilor;
-
algoritmul trebuie să fie adaptabil pentru diverse aplicaţii;
-
algoritmul trebuie să fie implementabil pe dispozitivele electronice;
-
algoritmul trebuie să fie eficient în utilizare;
-
algoritmul trebuie să poată fi validat;
-
algoritmul trebuie să fie exportabil.
DES a fost oficial adoptat ca standard federal în 23 noiembrie 1976, iar în 1977 specificaţiile sale au fost făcute publice. Privire generală asupra algoritmului
51
Algoritmul DES este o combinaţie complexă folosind două blocuri fundamentale în criptografie: substituţia şi permutarea (transpoziţia). Acest cifru bloc acceptă un bloc de 64 de biţi la intrare şi generează un bloc cifrat de 64 de biţi. DES este un algoritm simetric. Acelaşi algoritm şi aceeaşi cheie sunt folosiţi atât la criptare cât şi la decriptare. Algoritmul este constituit din 16 cicluri repetate ale blocurilor fundamentale. Textul iniţial este descompus în blocuri de 64 de biţi. Cheia este de 64 biţi din care doar 56 sunt efectivi, ceilalţi fiind biţi de paritate. Folosirea substituţiei provoacă confuzie prin sistematica substituire a unor biţi cu alţii. Transpoziţiile provoacă difuzie prin re-ordonarea biţilor. Algoritmul foloseşte numai operaţii clasice aritmetice şi logice cu număr de până la 64 de biţi, ceea ce face relativ uşor de implementat atât software cât mai ales hardware: unul din scopurile declarate ale algoritmului fiind uşoara lui implementare hardware într-un cip specializat. Parcurgerea celor 16 cicluri are loc după schema din figura 4.6.1. La intrarea datele sunt împărţite în blocuri de 64 biţi, care sunt transformate folosind cheia de 64 de biţi. Cei 64 de biţi sunt permutaţi prin “permutarea iniţială”. În continuare, urmează operaţiile ce constituie un ciclu. Blocul de 64 de biţi este separat în două, “jumătatea stângă” şi “jumătatea dreaptă”, fiecare de 32 de biţi. Cheia este deplasată la stânga cu un număr de biţi şi permutată: ea se combină cu “partea dreaptă” care apoi se combină cu “partea stângă”; rezultatul devine noua “parte dreaptă”; vechea “parte dreaptă” devine noua “parte stângă” (vezi fig. 4.6.2). După repetarea acestui ciclu de 16 ori se face permutarea finală care este inversă permutării iniţiale. Pentru combinarea unei secvenţe de 32 biţi cu cheia de 64 biţi se folosesc expandări de la 32 biţi la 48 biţi şi reducerea cheii de la 64 biţi la 48 biţi prin alegerea anumitor biţi, operaţii ce le numim “permutare expandată” şi “permutare aleasă” (fig. 4.6.3). În fiecare ciclu practic au loc patru operaţii separate. Întâi partea dreaptă este expandată de la 32 la 48 biţi; apoi este combinată cu o formă a cheii; rezultatul este substituit şi condensat în 32 biţi, cei 32 biţi sunt permutaţi şi apoi combinaţi cu partea stângă pentru a da o nouă parte dreaptă (fig. 4.6.4).
52
Intrare permutare iniţială
Substituţie
Cheia
Permutare
Ciclul 1
Substituţie
Cheia
Permutare
Substituţie Permutare
Ciclul 16
Imaginea inversată a permutării iniţiale Ieşire
Fig. 4.6.1 Detalii pentru folosirea algoritmului DES
53
Cheia
Date permutate
Jumătatea stângă S
Cheie deplasată
Jumătatea dreaptă
Cheie permutată
Noua jumătatea stângă (vechea jumătate dreaptă)
Noua jumătatea dreaptă
Fig. 4.6.2 Manipularea cheii în algoritmul DES
Permutare
Permutare aleasă
Permutare expandată
Fig. 4.6.3 Manipularea permutării în algoritmul DES
Cheia este împărţită cu două părţi de 28 biţi deplasate la stânga cu un număr de biţi apoi reunite şi 48 din cei 56 de biţi sunt permutaţi şi folosiţi ca o cheie de 48 de biţi de-a lungul ciclului. Cheia dintr-un ciclu este combinată printr-o funcţie sau exclusiv cu “partea dreaptă” expandată. Rezultatul este operat în 8 “cutii-S” care efectuează substituţia. O “cutie-S” este o tabelă în care 6 biţi de date sunt înlocuiţi de 4 biţi. Permutările sunt efectuate de tabele numite “cutii-P”.
54
D
S
32 biţi
32 biţi
Cheia 28 biţi
Permutare expandată
Deplasare
28 biţi Deplasare
permutare aleasa de 58 biţi 48 biţi
4.6.4 Ciclul în algoritmul DES Permutarea expandată este definită în tabelul ce urmează: Bit se mută la Bit se mută la Bit se mută la Bit se mută la
1 2,48 9 12,14 17 24,26
2 3 10 15 18 27
3 4 11 16 19 28
4 5,7 12 17,19 20 29,31
5 6,8 13 18,20 21 30,32
6 9 14 21 22 33
7 10 15 22 23 34
8 11,13 16 23,25 24 35,37
25 36,38
26 39
27 40
28 41,43
29 42,44
30 45
31 46
32 47,1
Tabelul 4.6.1 Definirea permutării expandate în DES Consideraţii asupra algoritmului DES Cu algoritmul DES se poate face atât codificarea cât şi decodificarea unui mesaj. Rezultatul este adevărat pentru că ciclul j derivă din ciclul (j-1) astfel: S j = Dj −1
(1)
D j = S j −1 (+) f ( D j −1 ,k j )
(2)
unde (+) este operaţia sau exclusiv, f este funcţia rezultată din operaţiile dintr-un ciclu. Aceste ecuaţii arată că rezultatul fiecărui ciclu depinde numai de ciclul precedent. Descriind ecuaţiile pentru D j-1 şi S j-1 avem :
55
şi
Dj − 1 = S j
(3)
S j −1 = D j (+) f ( D j −1 ,k j )
(4)
înlocuind (3) în (4) avem: S j −1 = D j (+) f ( S j ,k j )
(5)
Ecuaţiile (3) şi (5) arată că aceleaşi valori pot fi obţinute în cicluri ulterioare. Această proprietate face algoritmul DES reversibil. Deci putem face codificarea unor date şi decodificarea lor folosind acelaşi algoritm făcând observaţia că la decodificare cheia se ia în ordine inversă. Datorită lungimii cheii de lucru şi a operaţiilor elementare pe care le foloseşte algoritmul, nu se ridică probleme deosebite într-o implementare software; singura observaţie este că, datorită modulului de lucru (cu secvenţe de date, cu tabele) practic algoritmul este lent într-o implementare software. Modul de concepere îl face însă perfect implementabil hard (într-un cip) ceea ce s-a şi realizat, existând multiple variante de maşini hard de codificare. Criptanaliza Deşi DES a fost cel mai celebru algoritm al secolului XX este considerat la această oră nesigur pentru multe aplicaţii. Pare paradoxal, dar aceasta este consecinţa măririi considerabile a puterii de calcul de la confirmarea DES – ului ca un standard criptografic şi până in anul 2000. Slăbiciunea pleacă de la lungimea prea mică a cheii de 56 de biţi. Varianta algoritmului cunoscută ca triplu-DES este cea care este considerată sigură şi la această oră. Insecuritatea DES-ului pleacă de la premiza că un atac “în forţă” are şanse de reuşită în condiţiile puterii de calcul disponibile astăzi ( a se vedea atacurile EFF1 ); până în 2004 cel mai eficient atac este datorat criptanalizei liniare care folosind 243 texte cunoscute generează o complexitate temporală de 239-43 (Junod 2001); în condiţiile unui atac cu text ales complexitatea poate fi redusă de patru ori (Knudsen şi Mathiassen, 2000).
1
Electronic Frontier Foundation
56
O istorie cronologică a DES – ului este prezentată în următorul tabel: Data
Anul
Evenimentul
15 mai
1973 NBS publică prima cerere pentru un algoritm standard pentru criptare
27 august
1974 NBS publică a doua cerere pentru un algoritm standard pentru criptare
17 martie
1975 DES este publicat în Federal Register2 pentru comentarii
august
1976 Se organizează primul workshop despre DES
septembrie
1976 Al doilea workshop despre fundamentele matematice ale DES-ului
noiembrie
1976 DES este aprobat ca un standard
15 ianuarie
1977 DES este publicat în FIPS PUB 46 1983 DES este reconfirmat pentru prima dată
22 ianuarie
1988 DES este reconfirmat pentru a doua oară ca FIPS 46-1 Biham şi Shamir publică primul atac teoretic cu o complexitate mai mică decât atacul 1992 ”în forţă brută” : criptanaliza diferenţială ; metoda cerea un număr nerealist (247) de texte alese
30 decembrie 1993 DES este reconfirmat pentru a treia oară ca FIPS 46-2 1994
Prima criptanaliză experimentală folosind criptanaliza liniară (Matsui, 1994)
iunie
1997
Proiectul DESCHALL sparge pentru prima dată în public un mesaj criptat cu DES
iulie
1998
EFF găseşte o cheie pentru DES în 56 de ore
ianuarie
1999
EFF folosind putere de calcul distribuită găseşte o cheie pentru DES în 22 de ore şi 15 minute
25 octombrie 1999
DES este reconfirmat pentru a patra oară ca FIPS 46-3 cu specificaţia preferinţei pentru Triplu DES
26 noiembrie 2001 AES este publicat în FIPS 197 26 mai
2002 Standardul AES devine efectiv
26 iulie
2004
Retragerea standardului FIPS 46-3 (şi a celor conexe) este propusă în Federal Register
Tabelul 4.6.2 Cronologia evenimentelor algoritmului DES
2
Publicaţie a NIST (National Institute of Standards and Technology)
57
4.6.2 Variante de DES DES multiplu Unele implementări de DES folosesc triplul-DES. Deoarece DES nu este un grup, textul cifrat rezultat este mult mai greu de spart folosind căutarea exhaustivă: 2112 încercări în loc de 256 încercări. DES cu sub-chei independente O altă variantă constă în folosirea unei sub-chei diferite pentru fiecare trecere, în loc de a o genera dintr-o singură cheie de 56 de biţi. Deoarece în fiecare din cele 16 treceri se foloseşte o cheie de 48 de biţi, rezultă că lungimea cheii pentru această variantă este de 768 biţi, ceea ce va creşte semnificativ dificultatea unui atac în forţă împotriva algoritmului, acesta având complexitatea de 2768. Totuşi, un atac de tip “întâlnire la mijloc” este posibil, ceea ce reduce complexitatea atacului la 2384; încă destul de lung pentru orice nevoie imaginabilă de securitate. Această variantă poate fi analizată folosind criptanaliza diferenţială şi poate fi spartă cu 261 texte în clar date. Se pare că nici o modificare în planificarea cheilor nu conduce la întărirea semnificativă a algoritmului DES. DESX DESX este o variantă DES dezvoltată de RSA Data Security, care a fost inclusă încă din 1968 în programul de securitate pentru poştă electronică MailSafe. DESX foloseşte o tehnică numită albire, pentru a ascunde intrările şi ieşirile DES. În plus faţă de cheia DES de 56 de biţi, DESX are o cheie suplimentară de albire de 64 de biţi. Aceşti 64 de biţi sunt operaţi XOR cu textul în clar înainte de prima trecere DES. 64 de biţi suplimentari, calculaţi ca o funcţie bijectivă de toţi cei 120 de biţi ai cheii DES, sunt operaţi XOR cu textul cifrat înaintea ultimei treceri. Albirea îl face pe DESX mult mai puternic decât DES faţă de un atac în forţă; atacul necesită (2120)/n operaţii cu n texte în clar cunoscute. De asemenea se îmbunătăţeşte securitatea împotriva criptanalizei liniare şi diferenţiale; atacul necesită 261 texte în clar date şi 260 de texte în clar cunoscute. CRYPT(3) CRYPT(3) este o variantă de DES întâlnită în sistemele UNIX. Este folosită în mod obişnuit pentru parole, dar uneori şi pentru criptare. Diferenţa între CRYPT(3) şi DES este că CRYPT(3) are o permutare de chei cu 212 posibilităţi, astfel încât să nu permită folosirea cipurilor DES la construcţia unui dispozitiv hardware de spart parole.
58
DES generalizat DES-ul generalizat (GDES) a fost proiectat să mărească viteza DES-ului şi să întărească algoritmul. Mărimea totală a blocului creşte, în timp ce suma calculelor rămâne constantă. GDES operează pe blocuri de text în clar de lungime variabilă. Blocurile criptate sunt împărţite în q sub-blocuri; numărul exact depinde de mărimea totală a blocului. În general q este egal cu lungimea blocului împărţită la 32. Funcţia f este calculată o dată la fiecare trecere, pe ultimul bloc din dreapta. Rezultatul este operat XOR cu toate celelalte părţi, care sunt apoi rotite spre dreapta. GDES are un număr variabil de treceri, n. Exista o mică modificare la ultima trecere, astfel încât procesele de criptare şi decriptare diferă doar prin ordinea sub-cheilor. De fapt, pentru q=2 şi n=16 se obţine algoritmul DES. Biham şi Shamir arată că, folosind criptanaliza diferenţială, GDES cu q=8 şi n=16 este vulnerabil cu doar şase texte în clar date. Dacă se folosesc şi sub-chei independente, sunt necesare 16 texte în clar date. Pentru q=8 şi n=64, GDES e mai slab decât DES; sunt necesare 249 texte în clar date pentru a-l sparge. De fapt, orice schemă GDES este mai rapidă decât DES, dar este de asemenea mai puţin sigură. RDES RDES este o variantă care înlocuieşte schimbarea stânga-dreapta de la sfârşitul fiecărei treceri cu o schimbare dependentă de cheie. Schimbările sunt fixe, depinzând doar de cheie. Aceasta înseamnă că cele 15 schimbări dependente de cheie se petrec cu 2 15 posibilităţi şi că această variantă nu rezistă la criptanaliza diferenţială. O idee mai bună este ca schimbarea să aibă loc doar în partea dreaptă, la începutul fiecărei treceri, iar schimbarea să depindă de datele de intrare şi nu de cheie. În RDES-1 se practică o schimbare dependentă de date de cuvinte pe 16 biţi la începutul fiecărei treceri. În RDES-2 există o schimbare de octeţi dependentă de date la începutul fiecărei treceri, după o schimbare ca în RDES-1. Se poate continua în acelaşi mod până la RDES-4. RDES-1 este sigură atât faţă de criptanaliza liniară cât şi faţă de cea diferenţială.
4.6.3 Algoritmul AES În ianuarie 1997, NIST3 a organizat un concurs de criptografie deschis cercetătorilor din întreaga lume, având ca subiect crearea unui nou standard, care urma să se numească AES4. Regulile concursului erau: - algoritmul să fie un cifru bloc simetric; 3 4
National Institute of Standards and Technology SUA Advanced Encryption Standard – Standard de Criptare Avansat
59
- proiectul trebuia să fie public; - AES trebuia să suporte chei de 128, 192 şi 256 biţi; - algoritmul trebuia să se poată implementa atât hardware cât şi software; - AES trebuia să fie un standard public sau oferit cu licenţă ne discriminatorie. În august 1998 NIST a selectat cinci finalişti pe criterii de securitate, eficienţă, flexibilitate şi cerinţe de memorie. Finaliştii au fost: 1.
Rijndael (Joan Daemen şi Vincent Rijmen, 86 de voturi)
2.
Serpent (Ross Anderson, Eli Biham, Lars Knudsen, 56 voturi)
3.
Twofish (echipa condusă de Bruce Schneier, 31 voturi)
4.
RC6 (RSA Laboratories, 23 voturi)
5.
MARS (IBM, 13 voturi) În octombrie 2000 NIST a stabilit câştigătorul. Acesta este algoritmul Rijndael, dezvoltat
de doi tineri cercetători belgieni, Joan Daemen şi Vincent Rijmen şi care devine standard guvernamental al SUA. Se speră ca Rjindael să devină standardul criptografic dominant în lume pentru următorii 10 ani. Rijndael permite lungimi de chei şi mărimi de blocuri de la 128 de biţi la 256 de biţi, în paşi de câte 32 de biţi. Lungimea cheii şi lungimea blocului pot fi alese în mod independent, dar în practică se vor folosi două variante: bloc de 128 biţi cu cheie de 128 biţi şi bloc de 128 biţi cu cheie de 256 biţi. Standardul comercial va deveni cel mai probabil varianta 128/128. O cheie de 128 biţi permite un spaţiu al cheilor de 2128 chei. Preliminarii matematice Rijndael se bazează pe teoria câmpului Galois, în sensul că anumite operaţiuni sunt definite la nivel de octet iar octeţii reprezintă elemente în câmpul finit GF(28). Cum toate reprezentările câmpului finit GF(28) sunt izomorfe, se poate alege reprezentarea clasică polinomială, cu impact pozitiv asupra complexităţii implementării. Octetul b, format din biţii b7, b6, b5, b4, b3, b2, b1 şi b0, este considerat ca fiind un polinom de gradul 7 cu coeficienţi 0 sau 1: b7 x7 + b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x + b0 Operaţiunea de adunare este definită ca suma a două polinoame în care coeficienţii se adună modulo 2 şi care corespunde operării XOR a celor doi octeţi corespondenţi. Sunt îndeplinite axiomele grupului abelian: operaţia este internă, asociativă, comutativă, există element neutru şi element invers
60
Operaţiunea de înmulţire corespunde produsului a două polinoame modulo, un polinom ireductibil de grad 8 şi care pentru AES este m(x) = x8 + x4 + x3 + x + 1 Înmulţirea este internă (rezultatul este un polinom de grad strict mai mic ca 8), asociativă şi există element neutru. Elementul invers se determină cu algoritmul lui Euclid, iar distributivitatea celor doua operaţii se verifică. Concluzia este că mulţimea celor 256 de valori posibile ale unui octet, împreună cu cele două operaţiuni definite mai sus formează un corp algebric finit, respectiv GF(28). Proiectarea AES În proiectarea AES s-a ţinut cont de trei criterii: - rezistenţa împotriva tuturor atacurilor cunoscute; - viteza şi compactitatea codului pe un mare număr de platforme; - simplicitatea proiectării. Ca şi DES, AES foloseşte substituţie şi permutări, ca şi runde multiple. Numărul de runde depinde de mărimea cheii şi de mărimea blocului, fiind 10 în cazul 128/128 şi mărindu-se până la 14 pentru cazul 256/128. Spre deosebire de DES, toate operaţiile sunt la nivel de octet, pentru a permite implementări eficient hardware şi software. Descrierea AES În algoritmul AES rezultatul cifrat intermediar este numit vector state, care poate fi reprezentat ca un tabel cu patru linii şi patru coloane, acestea fiind numerotate începând de la 0. Vectorul state se iniţializează cu blocul de 128 biţi de text în clar (în ordinea coloanelor, cu primii patru octeţi în coloana 0) şi va fi modificat la fiecare pas al calculului, prin substituţii, permutări şi alte transformări, rezultând în final blocul de 128 biţi de text cifrat. Cheia de 128 de biţi este expandată în 11 tabele 4x4 notate rk(0), rk(1),...., rk(10). Expandarea este realizată prin rotiri repetate şi operaţii XOR asupra unor grupuri de biţi din cheia originală. Înainte de a începe cele 10 runde, cheia rk(0) se operează XOR cu vectorul state. Calculul principal constă în execuţia a 10 runde, folosind cheia rk(i) la iteraţia i. Fiecare rundă constă în patru paşi. Pasul 1 realizează o substituţie octet cu octet asupra vectorului state folosind o cutie S. Pasul 2 roteşte la stânga fiecare din cele 4 rânduri ale vectorului state: rândul 0 este rotit
61
cu 0 octeţi, rândul 1 este rotit cu 1 octet, rândul 2 este rotit cu 2 octeţi şi rândul 3 este rotit cu 3 octeţi, realizând difuzia datelor. Pasul 3 amestecă fiecare coloană din vectorul state independent de celelalte, prin înmulţirea coloanei cu o matrice constantă, multiplicarea fiind realizată folosind câmpul finit Galois GF(28). În fine, pasul 4 operează XOR cheia rk din runda respectivă cu vectorul state. Deoarece fiecare pas este reversibil, decriptarea se poate realiza prin rularea algoritmului de la coadă la cap, sau prin rularea algoritmului de criptare nemodificat, dar folosind tabele diferite. Avantaje AES Avantajele AES relativ la implementare sunt: -
AES se poate implementa pe un procesor Pentium Pro şi va rula cu o viteză mai mare decât orice alt cifru bloc;
-
AES se poate implementa pe un dispozitiv Smart Card, folosind un spaţiu redus de memorie RAM şi un număr redus de cicluri;
-
transformarea din cadrul unei runde este paralelă prin proiectare, ceea ce constituie un avantaj pentru viitoarele procesoare;
-
AES nu foloseşte operaţiuni aritmetice, ci doar operaţii la nivel de şiruri de biţi.
Simplitatea proiectării AES: -
AES nu foloseşte componente criptografice externe, cum ar fi cutii S, biţi aleatori sau şiruri de cifre din dezvoltarea numărului π;
-
AES nu îşi bazează securitatea pe interacţiuni obscure sau greu de înţeles între operaţiuni aritmetice;
-
proiectarea clară a AES nu permite ascunderea unei “trape”.
Lungimea variabilă a blocului -
lungimile de bloc de 192 şi 256 biţi permit construirea unei funcţii hash iterative folosind AES ca funcţie de compresie.
Extensii: -
proiectarea permite specificarea de variante cu lungimi de blocuri şi lungimi de chei aflate între 128 şi 256 biţi, în paşi de câte 32 de biţi;
62
-
deşi numărul de runde în AES este fixat în specificaţiile algoritmului, el poate modificat ca un parametru în cazul unor probleme de securitate.
Limitările AES Limitările AES sunt în legătură cu algoritmul de decriptare: - algoritmul de decriptare este mai puţin pretabil la implementarea pe un dispozitiv Smart Card, deoarece necesită mai mult cod şi mai multe cicluri; - implementarea software a AES foloseşte cod şi/sau tabele diferite pentru algoritmul de criptare, respectiv decriptare; - implementarea hardware a AES a algoritmului de decriptare refoloseşte doar parţial circuitele care implementează algoritmul de criptare.
4.6.4 Algoritmul LUCIFER În 1960, IBM iniţiază un program de cercetare în criptografia computerizată numit Lucifer. Astfel se numeşte şi algoritmul cifru bloc dezvoltat în cadrul acestui program în 1970. În realitate există cel puţin doi algoritmi cu acest nume. Lucifer este o reţea de permutări şi substituţii, cu blocuri construite într-o manieră asemănătoare cu DES. În DES, ieşirea funcţiei f este operată XOR cu intrarea fazei anterioare pentru a forma intrarea fazei curente. În cazul lui Lucifer, “cutiile-S” au intrări şi ieşiri de 4 biţi; intrarea este o permutare a biţilor ieşirii din faza anterioară, iar intrarea din prima fază este chiar textul în clar. Un bit cheie este folosit pentru a alege între “cutia-S” actuală din două posibile Lucifer implementează aceasta printr-o “cutie-T” cu 9 biţi la intrare şi 8 la ieşire). Lucifer are 16 faze, blocuri de 128 de biţi şi o manipulare a cheii mai simplă decât DES-ul. Folosind criptografia diferenţială împotriva primei forme de Lucifer, Biham şi Shamir au arătat că Lucifer cu 8 faze şi 32 de biţi poate fi spart cu 40 de texte în clar alese şi 229 paşi; acelaşi atac poate sparge Lucifer cu 8 faze şi 128 biţi cu 60 de texte în clar alese şi 2 53 paşi. Aceste atacuri folosesc “cutii-S” DES tari. Folosind criptografia diferenţială împotriva celei de a doua forme de Lucifer, s-a arătat că “cutiile-S” sunt mai slabe decât în DES. Analize ulterioare au arătat că peste jumătate din chei nu sunt sigure, ceea ce conduce la posibilitatea de a sparge Lucifer cu 128 de biţi, cu orice număr de faze, cu 233 texte în clar alese, sau cu 265 texte în clar cunoscute cu chei alese. În concluzie, a doua formă de Lucifer este mai slabă. Sentimentul că Lucifer este mai sigur decât DES datorită lungimii mai mari a cheii şi lipsei de rezultate publicate este nejustificat.
63
4.6.5 Algoritmul Blowfish Blowfish este un algoritm proiectat pentru a fi implementat pe procesoare puternice, care încearcă să respecte următoarele criterii: 1.
Rapiditate – Blowfish criptează date pe procesoare de 32 de biţi la o rată de 26 de tacturi pe octet.
2.
Compact – Blowfish poate rula în mai puţin de 5K de memorie.
3.
Simplitate – Blowfish foloseşte doar operaţii simple: adunare, operare XOR şi căutare în tabelă, cu operanzi de 32 de biţi. Algoritmul este uşor de analizat, ceea ce evită erorile de implementare.
4.
Securitate variabilă – lungimea cheii este variabilă, putând creşte până la 448 de biţi.
Blowfish este optimizat pentru aplicaţii în care cheia nu trebuie să se schimbe des, cum ar fi legături de comunicaţie sau un criptor automat pentru fişiere. Este semnificativ mai rapid decât DES când este implementat pe procesoare de 32 de biţi dotate cu memorie cache mare, cum ar fi Pentium. Blowfish nu este potrivit pentru comutarea de pachete, cu schimbări dese de cheie, ca funcţie hash one-way sau în aplicaţii smart-card, unde memoria este insuficientă. Descrierea algoritmului Blowfish Blowfish este un cifru bloc care operează cu blocuri de 64 de biţi si are cheie de lungime variabilă. Algoritmul constă în două părţi: expandarea cheii şi criptarea datelor. Expandarea cheii converteşte o cheie de până la 448 de biţi în mai multe matrice de sub-chei totalizând 4168 de biţi. Criptarea datelor rezidă într-o funcţie simplă iterată de 16 ori. Fiecare ciclu este format dintr-o permutare dependentă de cheie şi o substituţie dependentă şi de cheie şi de date. Toate operaţiile sunt adunări şi operări XOR pe cuvinte de 32 de biţi. Singurele operaţii suplimentare sunt patru căutări într-un tabel indexat, pe ciclu. Blowfish foloseşte un număr mare de sub-chei. Aceste sub-chei trebuie precalculate înainte de orice criptare sau decriptare de date. Tabelul P este format din 16 chei de 32 de biţi: P1, P2, …, P18
64
Patru “cutii-S” de 32 de biţi are 256 de intrări fiecare: S1,0, S1,1, …. , S1,255 S2,0, S2,1, …. , S2,255 S3,0, S3,1, …. , S3,255 S4,0, S4,1, …. , S4,255 Blowfish este o reţea Feistel cu 16 cicluri. Intrarea este x, un element de 64 biţi de date. Pentru criptare: Se împarte x în două părţi de câte 32 de biţi: xL şi xR For i = 1 to 16: xL = xL ⊕ Pi xR = F(xL) ⊕ xR se schimbă xL şi xR între ele End for se schimbă xL şi xR între ele xR = xR ⊕ P17 xL = xL ⊕ P18 se recombină xL şi xR Funcţia F funcţionează astfel: Se împarte xL în patru sferturi a câte 8 biţi: a, b, c, d F(xL) = ((S1,a + S2,b mod 232) ⊕ S3,c) + S4,d mod 232 Decriptarea are loc similar cu criptarea, cu diferenţa că P1, P2, …, P18 sunt folosite în ordine inversă. O implementare a algoritmului Blowfish care să asigure o creştere de viteză trebuie să menţină toate cheile în memoria cache. Sub-cheile sunt calculate folosind algoritmul Blowfish, care constă în următorii paşi: 1.
Se iniţializează tabelul P şi cele patru “cutii-S”, în ordine, cu un şir fix. Acest şir este format din cifrele hexazecimale ale lui π.
65
2.
Se operează XOR P1 cu primii 32 de biţi ai cheii, se operează P2 cu următorii 32 de biţi ai cheii şi tot aşa până la P18, astfel încât întreg tabelul P să fie operat XOR cu biţii din cheie.
3.
Se criptează un şir format din zerouri cu algoritmul Blowfish, folosind subcheile descrise în paşii 1 şi 2.
4.
Se înlocuiesc P1 şi P2 cu ieşirea din pasul 3.
5.
Se criptează ieşirea din pasul 3 folosind algoritmul Blowfish cu sub-cheile modificate.
6.
Se înlocuiesc P3 şi P4 cu ieşirea din pasul 5.
7.
Se continuă procesul, înlocuind toate elementele din tabelul P şi apoi cele patru “cutii-S” în ordine, cu ieşirea algoritmului Blowfish.
În total, 521 de iteraţii sunt necesare pentru a genera toate sub-cheile necesare. Aplicaţiile pot memora sub-cheile pentru a nu trebui să le calculeze de fiecare dată. Securitatea algoritmului Blowfish În cazul algoritmului Blowfish cu “cutii-S” cunoscute şi r cicluri, tabelul P poate fi determinat cu 28r+1 texte în clar alese. Atacul funcţionează doar pe variantele cu un număr redus de cicluri şi este complet ineficient în cazul algoritmului Blowfish cu 16 cicluri.
4.6.6 Dubla criptare Un mod evident de îmbunătăţire a securităţii algoritmilor bloc este criptarea unui bloc de două ori, folosind două chei diferite. Mai întâi se criptează blocul cu prima cheie, apoi se criptează textul cifrat rezultat folosind a doua cheie. Decriptarea este procesul invers: C = EK2 (EK1 (P)) P = DK1 (DK2 (C)) Dacă algoritmul bloc este un grup, există întotdeauna un K3, astfel încât C = EK2 (EK1 (P)) = EK3 (P) În caz contrar, blocul de text cifrat rezultat dintr-o dublă criptare ar trebui să fie mult mai greu de decriptat folosind căutarea exhaustivă. În loc de 2n încercări (unde n este lungimea în
66
biţi a cheii), vor fi necesare 22n încercări. Dacă algoritmul are chei de 64 de biţi, vor fi necesare 2128 încercări pentru a găsi cheia. În cazul atacului cu texte în clar cunoscute, Merkle şi Hellman au demonstrat că schema cu dublă criptare poate fi spartă în 2n+1 criptări şi nu în 22n. Atacul se numeşte “întâlnire la mijloc”; el funcţionează prin criptarea de la un capăt, decriptarea la capătul celălalt şi potrivirea rezultatelor în mijlocul textului criptat. În acest atac, criptanalistul cunoaşte P1, C1, P2 şi C2, astfel încât C1 = EK2 (EK1 (P1)) C2 = EK2 (EK1 (P2)) Pentru fiecare K posibil, se calculează EK(P1) şi se memorează rezultatul. După terminarea tuturor calculelor, se calculează DK(C1) pentru fiecare K şi se caută un rezultat identic în memorie. Dacă se găseşte un astfel de rezultat, fie K2 cheia curentă şi K1 cheia folosită pentru rezultatul din memorie. Se criptează P2 cu K1 şi K2; dacă se obţine C2 este aproape sigur (cu o probabilitate de 1 din 22m-2n, unde m este mărimea blocului), că cele două chei sunt valide. Dacă nu, se continuă căutarea. Numărul maxim de căutări este 2 x 2n, adică 2n+1. Acest atac necesită un spaţiu mare de memorie: 2n blocuri. Pentru un algoritm de 56 de biţi, aceasta înseamnă 256 blocuri de 64 de biţi, adică 1017 octeţi. Este o cantitate considerabilă de memorie, dar demonstrează că dubla criptare nu duce la dublarea securităţii. În cazul însă al unei chei de 128 de biţi, cantitatea de memorie necesară este de 10 39 octeţi, ceea ce înseamnă că un atac de tip “întâlnire la mijloc” nu este fezabil. O altă metodă de dublă criptare, numită Davies-Price, este o variantă de CBC: Ci = EK1 (Pi ⊕ EK2(Ci-1)) Pi = DK2 (Ci ) ⊕ EK2(Ci-1)) care prezintă aceeaşi vulnerabilitate faţă de un atac de tip “întâlnire la mijloc”.
4.6.7 Tripla criptare Tripla criptare cu două chei O idee mai bună, propusă de Tuchman, operează pe un bloc de trei ori folosind două chei: se începe cu prima cheie, se continuă cu a doua cheie şi se termină folosind din nou prima cheie, în sensul că expeditorul criptează cu prima cheie, decriptează cu a doua cheie şi în final
67
criptează cu prima cheie. Destinatarul decriptează cu prima cheie, apoi criptează cu a doua cheie şi în final decriptează cu prima cheie: C = EK1 (DK2(EK1 (P))) P = DK1(EK2 (DK1 (C))) Aceasta poartă numele de mod EDE (encrypt-decrypt-encrypt); dacă algoritmul bloc are o cheie de n biţi, această schemă conduce la o cheie de 2n biţi. Această formă curioasă de criptare-decriptare-criptare a fost proiectată de IBM, pentru a păstra compatibilitatea cu implementarea convenţională a algoritmului: dacă cele două chei sunt identice, tripla criptare se reduce la o singură criptare cu o singură cheie. K1 şi K2 alternează, pentru a preveni posibilitatea de a folosi un atac de tip “întâlnire la mijloc”. Dacă C = EK2 (EK1 (EK1 (P ))), atunci criptanalistul poate calcula EK1 (EK1 (P )) pentru toate valorile K1 posibile, după care porneşte atacul. Ar fi necesare doar 2n+2 criptări. Tripla criptare cu două chei nu permite un atac de tip “întâlnire la mijloc” de genul celui întâlnit în cazul dublei criptări, dar Merkle şi Hellman au proiectat un alt gen de atac, care poate sparge tripla criptare cu două chei în 2n-1 paşi folosind 2n blocuri de memorie. Pentru fiecare K2 posibil, se decriptează 0 şi se memorează. Apoi, se decriptează cu fiecare K1 posibil, pentru a-l găsi pe P. Se criptează triplu P pentru a-l afla pe C, după care se decriptează C cu K1. Dacă această decriptare este o decriptare a lui 0 folosind K2 (din memorie) atunci perechea K1, K2 este o posibilă candidată. Dacă această posibilitate nu se verifică, se continuă căutarea. Acesta este un atac cu texte în clar alese, care necesită o mare cantitate de texte în clar alese şi anume 2m, în timp ce memoria şi durata sunt de ordinul 2n. Nu este foarte practic, dar subliniază o slăbiciune a algoritmului. Paul van Oorschot şi Michael Wiener au convertit aceasta la un atac cu 2p texte în clar cunoscute. Exemplul presupune modul EDE: 1.
Se ghiceşte valoarea intermediară a.
2.
Se calculează şi memorează pentru fiecare K1 posibilă, a doua valoare intermediară b, când prima valoare intermediară este a, folosind textul în clar cunoscut: b = DK1 (C)
3.
Se caută în tabelul memorat, pentru fiecare K2 posibil, elemente cu aceeaşi valoare intermediară b: b = EK2 (a)
68
4.
Probabilitatea de succes este p/m, unde p este numărul de texte în clar cunoscute şi m este mărimea blocului. Dacă nu se găsesc elementele căutate la pasul 3, se alege o nouă valoare pentru a şi se reia de la pasul 1.
Acest atac necesită 2n+m/p timp operaţional şi p spaţiu de memorie. Pentru DES, aceasta înseamnă 2120/p. Pentru p mai mare ca 256, acest atac este mai rapid decât căutarea exhaustivă. Tripla criptare cu trei chei Această variantă presupune o lungime totală a cheii mai mare, dar memorarea cheii nu constituie o problemă. C = EK3 (DK2(EK1 (P))) P = DK1(EK2 (DK3 (C))) Cel mai bun atac cere 22n paşi şi 2n blocuri de memorie si este de tip “întâlnire la mijloc”. Tripla criptare cu trei chei independente este echivalentă din punct de vedere al securităţii, cu dubla criptare.
4.6.8 Concluzii Criptografia cu chei simetrice şi cea cu chei publice prezintă diverse avantaje şi dezavantaje pe care le prezentăm în continuare: (i) Avantaje ale criptografiei cu chei simetrice 1.
Algoritmii folosiţi permit gestionarea unor volume mari de date, cu viteză relativ bună. În special atunci când este vorba de implementări hard.
2.
Cheile folosite pentru algoritmii simetrici sunt relativ scurte.
3.
Algoritmii simetrici pot fi folosiţi ca primitive pentru a construi soluţii criptografice incluzând generatoarele de numere pseudo-aleatoare şi funcţiile hash.
4.
Algoritmii cu chei simetrice se pot compune pentru a produce algoritmi mai puternici.
(ii) Dezavantajele criptografiei cu chei simetrice 1.
Într-o comunicaţie cheia trebuie să rămână secretă în ambele capete.
2.
Într-o reţea cu mulţi utilizatori numărul cheilor care trebuie gestionate devine o problemă majoră.
69
3.
Pentru o comunicaţie între două părţi, practica criptografică impune schimbul cheilor frecvent, uneori chiar la fiecare sesiune, ceea ce în condiţiile unui canal nesigur de comunicaţie este o altă problemă.
(iii) Avantajele criptografiei cu chei publice 1.
Dintre cele două chei folosite în algoritmii cu chei publice doar una trebuie ţinută secret.
2.
Administrarea cheilor într-o reţea poate fi făcută cu un singur administrator “de încredere”.
3.
În general perechile de chei publice/secrete pot fi folosite pe o perioada lungă de timp fără a fi schimbate.
4.
Într-o reţea de dimensiuni mari numărul de chei necesare este considerabil mai mic decât în cazul criptografiei simetrice.
(iv) Dezavantajele criptografiei cu chei publice 1.
Viteza algoritmilor cu chei publice (chiar şi a celor mai performanţi) este de câteva ori mai mică decât a celor cu chei secrete.
2.
Dimensiunea cheilor folosite este mai mare (1024 pentru RSA în comparaţie cu 64 sau 128 în cazul algorimilor de tip bloc).
3.
Pentru nici un algoritm cu chei publice nu s-a demonstrat că ar fi “sigur”; securitatea lor se bazează prezumţia de dificultate a unui set de probleme de teoria numerelor.
4.
Istoria criptografiei cu chei publice este relativ scurtă (din 1970) .
Utilizarea algoritmilor în sisteme de criptare disponibile în Internet Aplicaţiile şi protocoalele folosite în Internet au nevoi diferite de securitate, în funcţie de care se utilizează diverse sisteme criptografice. Se observă că nu există un algoritm unic bun pentru orice situaţie – în funcţie de noile rezultate obţinute în proiectarea criptografică, dar şi în criptanaliză, se renunţă la unii algoritmi sau se dezvoltă variante îmbunătăţite din punct de vedere al securităţii. În Internet, sistemele criptografice pot fi grupate în două mari categorii: protocoale de reţea şi programe/protocoale folosite pentru criptarea mesajelor trimise prin poşta electronică (tabelul 4.6.3). Nr. Sistem 1
PCT (Private Communications Technology)
Caracteristici Protocol criptare transmisii TCP/IP
70
Principalii algoritmi RSA RC4 MD5
2
SSL (Secure Socket Layer)
Protocol criptare transmisii TCP/IP
3
S-HTTP – SecureHyperText Transfer Protocol
Protocol pentru criptarea cererilor şi răspunsurilor HTML
4
SET (Secure Electronic Transaction)
Protocol criptare transmisii de instrucţiuni de platã prin Internet
5
CyberCash
Protocol criptare transmisii instrucţiuni de platã prin Internet
6
Ipsec, Ipv5
Protocol de nivel scăzut pentru criptarea pachetelor IP
7
DNSSEC (Domain Name System Security)
8
Kerberos
9
SSH (Secure Shell)
10
S/MIME – Secure Multipurpose Internet Mail Extension
11
PGP (Pretty Good Privacy)
Sistem pentru securizarea DNS Securitate în reţea pentru aplicaţiile de nivel înalt Protecţie pentru Telnet la transferul de fişiere Format pentru criptarea poştei electronice Aplicaţie pentru criptarea poştei electronice
Tabelul 4.6.3 Algoritmi de criptare utilizaţi în aplicaţiile din Internet
71
RSA RC4 MD5 RSA DES RSA MD5 RC2 RSA MD5 RC2 DiffieHellman RSA MD5 DES RSA DiffieHellman Des Triple DES Specificaţii utilizator MD5 IDEA RSA
Capitolul 5
Aplicaţie. Algoritmul Vigenere şi implementarea lui 5.1 Codul Vigenere 5.1.1
Descriere generală Cifrul a fost inventat de către Giovan Batista Belaso şi descris în cartea sa "La cifra del.
Sig. Giovan Batista Belaso" în 1553, fiind o versiune simplificată a unui cifru de substituţie polialfabetică, inventat de Leon Batista Alberti în jurul anului 1465. A fost atribuit eronat lui Blaise de Vigenere în secolul 19, care a inventat un cifru asemănător cu o singură diferenţă insă, şi anume modul în care cheia de criptare era generată. Aceasta începea cu un cuvânt scurt la care se adăuga textul în clar iar apoi procedura de criptare se aseamănă cu cea a lui Giovan Batista Belaso. Cifrul Vigenere aşa cum este el cunoscut a fost folosit din secolul 16 pentru a dezvolta criptosisteme până în epoca modernă, el stând la baza maşinii criptografice germane Enigma, folosită în cel de-al doilea război mondial. Combinat cu un sistem de criptare prin deplasare codul Vigenere este un sistem criptografic puternic, dar totuşi susceptibil la o analiză a frecventei codul poate fi spart. Puterea sa a stat în faptul că, utilizându-se substituţii polialfabetice mai multe litere din textul în clar puteau fi criptate cu aceeaşi literă în textul criptat. Aceasta a fost o trăsătură puternică a acestui cifru de-a lungul secolului 16. Codificarea prin acest cifru presupune existenţa unei chei de cifrare şi a unui tabel ce conţine literele alfabetului aşezate pe linii, în total 26 de linii, literele de pe linia n sunt deplasate cu o poziţie la dreapta faţă de literele de pe linia n—1, tabelul este prezentat în figura 2.1. Criptarea se realizează scriind textul în clar pe o linie, sub el se scrie cheia, repetând cheia dacă este mai mică decât textul în clar. Fiecare literă din textul în clar va fi criptată căutând în tabelul polialfabetic din figura 5.1 litera care se află la intersecţia liniei care începe cu litera din cheie şi coloanei care conţine ca primă literă, litera din textul în clar. Decriptarea mesajului se face găsind poziţia literei criptate pe linia indicată de cheia de criptare, prima literă de pe acea coloană fiind considerată literă a textului în clar.
5.1.2
Descriere matematică
Definiţia 5.1.1. Considerăm m un întreg pozitiv pentru care definim P = C = K = (Z26)m , iar pentru o cheie k = (k 1 , k2,..., km) funcţiile de criptare respectiv decriptare au următoarea formă ek(x1, x2, . . ., xm) = Pi + Ki(mod26) = (x1 + k1, x2 + k2,..., xm + km) şi dk(y1, y2, . . ., ym) = Ci - Ki(mod26) = (y1 - k1, y2 - k2, . . ., ym - km)
72
Figura 5.1: Tabelul folosit pentru criptarea Vigenere
5.1.3 Algoritm Algoritmul 5.1.1. Criptare prin metoda Vigenere 1. criptare_Vigenere(P,K) 2. while(i
for(j=0, lungime_cheie)
2.1.1.
Ci ←Pi +Ki
2.1.2.
i++
2.2.
i++
3. return Ci Algoritmul 5.1.2. Decriptare prin metoda Vigenere 1. decriptare_Vigenere(C,K) 2. while(i
for(j=0, lungime_cheie)
2.1.1.
Pi ← Ci — Ki
2.1.2.
i++ 2.2.
i++
3. return Pi
5.1.4
Exemplu
Să presupunem că vrem să criptăm fraza "HELLO WORLD" folosind cheia "SECRET". Se scrie textul în clar, şi anume "HELLO WORLD" pe o linie iar sub el cheia. Căutam apoi în
73
tabel linia care are pe prima poziţie litera din textul în clar şi la intersecţia sa cu coloana ce conţine litera textului cheii vom găsi litera corespunzătoare textului cifrat. Un exemplu de criptare este prezentat în figura 5.2.
Figura 5.2: Exemplu de text criptat prin metoda Vigenere
5.1.5
Implementarea algoritmului Vigenere
Programul criptează şi decriptează textul introdus de la tastatură sau dintr-un fişier.
Figura 5.3: Interfaţa programului
74
Figura 5.4: Meniul programului Utilizatorul poate alege din meniul programului una din opţiunile: 1.
Criptare fişier: Se cere cheia pentru criptarea textului. Utilizatorul apasă space pentru confirmarea cheii. După introducerea şi confirmarea cheii utilizatorul indică numele fişierului unde sunt datele de criptat şi numele fişierului în care vor fi înscrise datele criptate.
2.
Decriptare fişier: Este cerută cheia cu ajutorul căreia a fost criptat textul. Utilizatorul apasă space pentru confirmarea cheii. După introducerea şi confirmarea cheii utilizatorul indică numele fişierului unde sunt datele criptate şi numele fişierului în care vor fi înscrise datele decriptate.
3.
Criptare text de la tastatură: Este cerută cheia pentru criptarea textului. Utilizatorul apasă space pentru confirmarea cheii. După introducerea şi confirmarea cheii utilizatorul tastează textul care trebuie criptat, totodată văzând rezultatul criptării.
4.
Decriptare text de la tastatură: Este cerută cheia cu ajutorul căreia a fost criptat textul. Utilizatorul apasă space pentru confirmarea cheii. După introducerea şi confirmarea cheii utilizatorul tastează textul care trebuie decriptat, totodată văzând rezultatul decriptării
9. Informaţii despre program 0. Ieşire
75
În continuare este prezentat codul algoritmului Vigenere în limbajul C++. // Criptare si decriptare folosind algoritmul Vigenere // -- Mazurean Eugeniu -#include #include #include // pentru functiile isalpha() si islower() #include // pentru macro-ul toupper() #include // pentru masurarea timpului necesar prelucrarii #include // pentru functia memset() #define #define care se #define
TINDEX long int MAXBUFFERLENGTH 4096// lungimea maxima a unui buffer citeste din fisier KBBUFFER 1024
typedef char BUFFER[MAXBUFFERLENGTH]; char parola[20]; char lungimeParola=0; char indexParola=0; // reprezinta pozitia caracterului din cheia care va fi folosit pentru // prelucrarea urmatorului caracter din fisierul de intrare char numeFisierIntrare[20]; char numeFisierIesire[20]; void citireParola(void){ char ch; // caracterul citit de la tastatura int contor=0; // numarul de caractere in cheie printf("=========================\n"); printf("Introduceti cheia (space pentru confirmare): "); while(' ' != (ch=getch()) || contor==0) // daca caracterul citit e diferit de spatiu sau cheia are 0 caractere atunci { if(isalpha(ch)) // daca caracterul citit e litera { if(islower(ch)) ch = toupper(ch); // daca caracterul e litera mica o transformam in litera mare putch(ch); // se poate inlocui cu putc('*') pentru privacy parola[contor] = ch - 'A'; // atribuim caracterului ce se afla pe pozitia corespunzatoare valorii contorului // din cuvintul cheia caracterul citit -'A' contor++; // incrimentam numarul de caractere in cuvintul cheia
76
} } lungimeParola = contor; printf("\n"); printf("Ati introdus cheia: ["); for(int i=0;i
77
TINDEX bytes_read=0; // indica numarul de bytes utili din variabila [buffer] TINDEX bytes_to_write=0; // indica nr. de bytes care se vor scrie la iesire TINDEX i=0; signed char temp=0; time_t timp1, timp2; timp1 = time(NULL); do { bytes_read = fread(buffer, 1, MAXBUFFERLENGTH, fisierIntrare); /* S-au citit in variabila [buffer] un numar de maxim MAXBUFFERLENGTH bytes din fisierul de intrare. [bytes_read] indica numarul efectiv de bytes cititi in variabila [buffer]. Daca in fisier ramasesera mai putin de MAXBUFFERLENGTH bytes, atunci avem (bytes_read < MAXBUFFERLENGTH) */ bytes_to_write = 0; for ( i=0; i'Z')&&(temp<'a'||temp>'z') )) { // pt ca "<" e mai rapid decat "<=" // se iau in considerare doar octetii care reprezinta litere if(temp>'Z') temp -= 32; // pentru ca 'a' - 'A' == 32 // daca este caracter uppercase, se face conversia lui in lowercase // incepe zona specifica CRIPTARII temp += parola[indexParola]; /* parola[indexParola] este caracterul din cheia care este folosit pentru "criptarea caracterului din
78
temp" */ if(temp>'Z') temp -= 26; // se finalizeaza operatia de adunare modulo 26 cu "caracterParola" //s-a terminat zona specifica CRIPTARII // variabila [temp] contine acum "caracterul criptat" buffer[bytes_to_write]=temp; // adaug "caracterul criptat" in "bufferul de scriere la iesire" bytes_to_write++; /* se incrementeaza contorul care inregistreaza nr. de caractere "existente pana acum in bufferul de scriere la iesire" */ indexParola++; // pentru prelucrarea urmatoarei litere din mesaj se va folosi urmatoarea litera din cheie if(indexParola==lungimeParola) indexParola = 0; // daca a fost folosita ultima litera din cheie, // pentru prelucrarea urmatoarei litere din mesaj se va folosi prima litera din cheia } else if (temp == ' ') { buffer[bytes_to_write]=temp; bytes_to_write++; } } if(bytes_to_write!=0){ // daca in buffer au existat bytes ce reprezentau litere fwrite(buffer, 1, bytes_to_write, fisierIesire); // se scriu "caracterele prelucrate" in fisierul de iesire } } while (bytes_read == MAXBUFFERLENGTH); // daca a fost bytes_read < MAXBUFFERLENGTH inseamna ca s-a atins EOF. timp2 = time(NULL); printf("\nTimp prelucrare: %f secunde\n", difftime(timp2, timp1)); indexParola = 0; fclose(fisierIntrare); fclose(fisierIesire); return 0; }
79
int prelucrareDateD(){ // pentru decriptare // returneaza 1 daca s-a produs o eroare FILE *fisierIntrare, *fisierIesire; if((fisierIntrare=fopen(numeFisierIntrare, "rb")) == NULL){ afiseazaEroareDeDeschidereFisier(numeFisierIntrare); return 1; }; if((fisierIesire=fopen(numeFisierIesire, "wb")) == NULL){ afiseazaEroareDeDeschidereFisier(numeFisierIesire); return 1; }; BUFFER buffer; TINDEX bytes_read=0; // indica numarul de bytes utili din variabila [buffer] TINDEX bytes_to_write=0; // indica nr. de bytes care se vor scrie la iesire TINDEX i=0; signed char temp=0; time_t timp1, timp2; timp1 = time(NULL); do { bytes_read = fread(buffer, 1, MAXBUFFERLENGTH, fisierIntrare); /* S-au citit in variabila [buffer] un numar de maxim MAXBUFFERLENGTH bytes din fisierul de intrare. [bytes_read] indica numarul efectiv de bytes cititi in variabila [buffer]. Daca in fisier ramasesera mai putin de MAXBUFFERLENGTH bytes, atunci avem (bytes_read < MAXBUFFERLENGTH) */ bytes_to_write = 0; for ( i=0; i
80
if(!( (temp<'A'||temp>'Z')&&(temp<'a'||temp>'z') )) { // pt ca "<" e mai rapid decat "<=" // se iau in considerare doar octetii care reprezinta litere if(temp>'Z') temp -= 32; // pentru ca 'a' - 'A' == 32 // daca este caracter uppercase, se face conversia lui in lowercase
// incepe zona specifica DECRIPTARII temp -= parola[indexParola]; /* parola[indexParola] este caracterul din cheie care este folosit pentru "criptarea caracterului din temp" */ if(temp<'A') temp += 26; // se finalizeaza operatia de adunare modulo 26 cu "26 - caracterParola" // s-a terminat zona specifica DECRIPTARII // variabila [temp] contine acum "caracterul criptat" buffer[bytes_to_write]=temp; // adaug "caracterul criptat" in "bufferul de scriere la iesire"
bytes_to_write++; /* se incrementeaza contorul care inregistreaza nr. de caractere "existente pana acum in bufferul de scriere la iesire" */ indexParola++; // pentru prelucrarea urmatoarei litere din mesaj se va folosi urmatoarea litera din cheie if(indexParola==lungimeParola) indexParola = 0; // daca a fost folosita ultima litera din cheie, // pentru prelucrarea urmatoarei litere din mesaj se va folosi prima litera din cheie } else if (temp == ' ') { buffer[bytes_to_write]=temp;
81
bytes_to_write++; } } if(bytes_to_write!=0){ // daca in buffer au existat bytes ce reprezentau litere fwrite(buffer, 1, bytes_to_write, fisierIesire); // se scriu "caracterele prelucrate" in fisierul de iesire } } while (bytes_read == MAXBUFFERLENGTH); // daca a fost bytes_read < MAXBUFFERLENGTH inseamna ca s-a atins EOF. timp2 = time(NULL); printf("\nTimp prelucrare: %f secunde\n", difftime(timp2, timp1)); indexParola = 0; fclose(fisierIntrare); fclose(fisierIesire); return 0; } void afiseazaHelpul(void){ printf("=========================\n"); printf("Informatii despre program\n"); printf("\n"); printf("- Programul implementeaza algoritmul Vigenere pentru criptarea si decriptarea datelor.\n"); printf("- Datele se pot citi de la tastatura sau dintr-un fisier.\n"); printf("- Sunt luate in considerare doar caracterele a-z, AZ din textul de la intrare. Caracterele a-z sunt convertite in A-Z.\n"); printf("- Rezultatele sunt afisate la ecran sau sunt scrise intr-un fisier, in functie de modul in care s-a facut introducerea datelor (de la tastatura, respectiv dintr-un fisier).\n"); printf("\n"); printf("Apasati o tasta pentru a continua: "); getch(); } void criptare(void){ printf("===========================\n"); printf("Incepe functia de criptare.\n"); citireDateDeIntrare();
82
prelucrareDateC(); printf("\nS-a terminat functia de criptare.\n"); printf("\n"); printf("Apasati o tasta pentru a continua: "); getch(); } void decriptare(void){ printf("=============================\n"); printf("Incepe functia de decriptare.\n"); citireDateDeIntrare(); prelucrareDateD(); printf("\nS-a terminat functia de decriptare.\n"); printf("\n"); printf("Apasati o tasta pentru a continua: "); getch(); } char selMeniulPrincipal(void){ char ch=0; //clrscr(); printf("\n"); printf("***************************\n"); printf("VIGENERE - Meniul Principal\n"); printf("\n"); printf("1. Criptare fisier\n"); printf("2. Decriptare fisier\n"); printf("3. Criptare text de la tastatura\n"); printf("4. Decriptare text de la tastatura\n\n"); printf("9. Informatii despre program\n"); printf("0. Iesire\n"); printf("\n"); printf("Selectati optiunea: "); while(ch!='1'&&ch!='2'&&ch!='3'&&ch!='0'&&ch!='9'&&ch!='4'){ ch=getch(); } putch(ch); printf("\nAti selectat optiunea %c.\n", ch); return ch; } void demonstratie (int operatie) { // am variabilele parola, indexParola, lungimeParola // aici nu mai e necesara viteza int charcount = 0,i,buffindex=0; int pcount=0;
83
char ch; char readbuff[KBBUFFER],prelbuff[KBBUFFER],finbuff[KBBUFFER],pwdbuf f[KBBUFFER]; clrscr(); indexParola=0; memset(readbuff,0,KBBUFFER); memset(prelbuff,0,KBBUFFER); memset(finbuff,0,KBBUFFER); memset(pwdbuff,0,KBBUFFER); printf("Vom demonstra %scriptarea pe un text introdus de la tastatura\n",(operatie)?(char *)"de":(char *)""); citireParola(); //* scot cursorul clipitor asm { mov ah,0x01; mov cx,0x2020; int 0x10; } //*/ // voi scrie de la caracterul 20 printf("\nIntroduceti textul - apasati ENTER pentru a termina \n"); printf("Apasati sageata stanga-dreapta pentru a vedea tot textul introdus\n"); gotoxy(1,10);printf("Ati introdus:"); gotoxy(1,12);printf("Am preluat:"); gotoxy(1,14);printf("Cheia este:"); gotoxy(1,16);printf("Textul %scriptat:",(operatie)?(char *)"de":(char *)""); while ( ((ch = getch()) != '\r') && (charcount=50) buffindex=charcount-50; if (charcount > 0) { charcount--; readbuff[charcount]=0; prelbuff[charcount]=0; pwdbuff[charcount]=0; finbuff[charcount]=0; } if (indexParola>0) indexParola--; else indexParola=lungimeParola-1;
84
pcount--; indexParola %= lungimeParola;
// }
else if (ch == 0) { ch=getch(); if (ch == 75) //stanga if (buffindex>0) buffindex--; if (ch == 77) // dreapta if (buffindex
//
else if (isprint(ch)) { readbuff[charcount] = (char)ch; prelbuff[charcount] = (char) (isalpha(ch)) ? toupper(ch) : ' '; if((ch>='A' && ch<='Z')||(ch>='a' && ch<='z')) { if(ch>='A' && ch<='Z') ch-='A'; else ch-='a'; if (operatie==0) ch=(ch+parola[indexParola]+26)%26+'A'; else ch=(ch-parola[indexParola]+26)%26+'A'; pwdbuff[charcount]=parola[pcount % lungimeParola]+'A'; indexParola++; indexParola %= lungimeParola; pcount++; } else { ch=' '; // ca sa nu se vada pwdbuff[charcount] = ' '; } finbuff[charcount] = (char)ch; charcount++; if (charcount>=50) buffindex=charcount-50; }
85
gotoxy(20,10); for (i=0;i<50;i++) putch(readbuff[buffindex+i]); gotoxy(20,12); for (i=0;i<50;i++) putch(prelbuff[buffindex+i]); gotoxy(20,14); for (i=0;i<50;i++) putch(pwdbuff[buffindex+i]); gotoxy(20,16); for (i=0;i<50;i++) putch(finbuff[buffindex+i]); }// am iesit din bucla while printf("\n"); // pun cursorul clipitor asm { mov ah,0x01; mov cx,0x1D1F; int 0x10; } //*/ indexParola=0; } void main(void){ char optiune=0; clrscr(); while(optiune!='0'){ optiune = selMeniulPrincipal(); if(optiune=='1'){ criptare(); } if(optiune=='2'){ decriptare(); } if(optiune=='9'){ afiseazaHelpul(); } if (optiune == '3'){ demonstratie(0); } if (optiune == '4'){ demonstratie(1); } } printf("\n\nProgram terminat.\n\n"); }
86
Bibliografie [1]
Nicolae Constantinescu, Bazele Criptografiei.
[2]
Adrian. Atanasiu, Noţiuni de bază ale criptografiei, Revista de Informatică şi Matematică (RIM) nr. 4 (febr. 2002), 5 (iunie 2002); publicaţie on-line, adresa http://portal.ols.ro/hasdeu.
[3]
Dumitru OPREA, Protecţia şi securitatea informaţiilor, Polirom, Iaşi 2003.
[4]
Lars Klander, "Anti-hacker. Ghidul securităţii reţelelor de calculatoare", 679 p., ALL Educaţional, Bucureşti 1998.
[5]
Andrew S. Tanenbaum, "Reţele de calculatoare", Ed. Computer Press Agora, 1997.
[6]
Monica Ene-Pietrosanu, Microsoft România, Windows Security.
[7]
J. Daemen, R. Govaertes, J. Vandewalle, A Framework for the Design of the One-Way Hash Functions including Cryptanalysis of Damagard’s One-Way Function based on Cellular Automaton. Advances in Cryptology, ASIACRYPT ’91 82-98, 1991
[8]
Bruce Schneier, Applied Cryptography, Second Edition: Protocols, Algorthms, and Source Code in C (cloth), 1996.
[9]
G. Tsudik, Message authentication with one-way hash functions. Proceedings of Infocom 1992.
[10]
http://www.biblioteca.ase.ro/downres.php?tc=7316 Capitolul 5 – Criptografia modernă.
[11]
http://euro.ubbcluj.ro/~alina/cursuri/internet-teorie/5-3.htm criptografiei moderne.
87
Caracteristici
ale