Implementarea Unei Metode de Criptare Hardware Si Evaluarea Performantelor Sale

CUPRINS

INTRODUCERE

CAPITOLUL 1: CONSIDERENTE TEORETICE 13

1.1 CRIPTOGRAFIA 13

1.1.1 Descriere 14

1.1.2 Istoria criptografiei 15

1.2 MODURI DE CRIPTARE 19

1.2.1 Criptarea hardware 22

1.2.2 Criptarea software 26

1.3 Atacuri și modele de securitate în sistemele informatice 27

1.3.1 Atacarea sistemelor de criptografie 22

1.3.2 Atacuri criptanalitice 22

1.3.3 Securitatea algoritmilor 22

1.4 Clasificarea Criptosistemelor 32

1.4.1 Criptosisteme cu chei publice (asimetrică) 33

1.4.2 Criptosisteme cu chei secrete (simetrică) 35

CAPITOLUL 2: REALIZAREA PRACTICĂ 41

2.1 DESCRIERE COMPONENTE 41

2.1.1 Arduino/Genuino Uno 41

2.1.2 MicroSD Card Adaptor v1.1 43

2.1.3 44

2.2 PSEUDOCOD EXPLICAT 52

CONCLUZII 53

BIBLIOGRAFIE 55

ANEXE 57

Anexa 1 57

Anexa 2 61

LISTA ACRONIMELOR

INTRODUCERE

CAPITOLUL 1: CONSIDERENTE TEORETICE

1.1 Criptografia

Criptografia este utilizată pentru a codifica și decodifica informațiile, bazându-se pe aplicații matematice, cât și pe metode de criptare cuantică. Astfel informațiile se pot stoca și transmite de-a lungul unei rețele nesigure(de exemplu Internetul) și pot fi citite doar de cei ce posedă cheia de decriptare. Dacă criptografia este știința securizării informațiilor, criptanaliza este știința verificării și analizării securității comunicației, criptologia incluzându-le pe ambele. Criptanaliza clasică are la bază combinații interesante de judecăți analitice, aplicații ale metodelor matematice, căutarea șabloanelor, determinare și noroc.

Descriere

Prin Criptografie putem înțelege, știința ce se ocupă de scrierile secrete. Multe servicii de securitate precum și mecanisme folosite în internet folosesc Criptografia pentru a ascunde conținutul datelor și a se împotrivi modificărilor acestora, prin utilizarea metodelor matematice.

Din lunga istorie a criptografiei putem alege multe exemple, precum cifrul lui Cezar, având principiul substituției ca bază, principiu ce s-a menținut aproximativ două milenii.

Eforturile criptografilor de-a lungul vremii s-au concentrat asupra complicării și întăririi cifrurilor și algoritmilor combinând transpoziții și substituții asupra unor simboluri și blocuri de simboluri. Criptografia modernă a avut însă parte de multe inovații, două elemente marcând semnificativ metodele criptografice.

Dezvoltarea rețelelor de calculatoare reprezintă primul element, prin care tot mai mulți utilizatori doreau păstrarea secretă a informațiilor transmise prin poșta electronică, siguranța transferului de fonduri și alte aplicații. Calculatoarele au permis folosirea cheilor de dimensiuni mari, rezistența la atacuri fiind crescută. Dacă o cheie secretă este schimbată frecvent și are o dimensiune considerabilă, spargerea cifrului devine imposibilă cunoscându-se chiar și algoritmul de cifrare. Pe această idee se bazează DES(Data Encryption Standard), standardul american de cifrare a datelor, folosit de companii internaționale și de guvernul SUA.

DES a fost creat într-o formă inițială în 1975 de IBM, trecând peste evaluările făcute de NSA(U.S. National Security Agency), evaluatorii recomandând reproiectarea doar a anumitor componente. Doi ani mai târziu, în 1977, DES a fost adoptat ca standard federal și utilizat intens atingând viteze mari de cifrare, de peste 100 de milioane de biți/secundă. Nu se știe dacă vreo organizație a reușit să spargă DES, însă orice schemă criptografică are o durată de viață limitată de-a lungul timpului, avansul tehnologic reducând la un moment dat securitatea furnizată.

Utilizarea unui principiu diferit față de cel al cifrării simetrice a reprezentat un al doilea element important în evoluția criptografiei. Doi cercetători de la Universitatea Stanford, California, Whitfield Diffie și Martin Hellman, au pus bazele criptografiei asimetrice cu chei publice. Criptografia asimetrică folosește în locul unei singure chei secrete, două chei diferite, pentru cifrare și pentru descifrare. Deducerea unei chei din cealalta este imposibilă, așadar una din chei este făcută publică, oricine putând transmite un mesaj cifrat, însă doar destinatarul, deținătorul celei de-a doua chei îl poate utiliza. Tehnica cheilor publice a crescut în popularitatea și datorită faptului că poate fi folosită pentru autentificarea mesajelor. astfel guvernul SUA a inițiat adoptarea conceptului de cheie publică pentru un standard de semnatură digitală. Institutul Național de Standarde și Tehnologie al SUA (NIST) recomandă până în 1990 pentru adaptare ca standard, o metodă deja prezentă în industrie, RSA. Însă, nouă luni mai târziu NIST a avansat un alt algoritm bazat pe o metoda cu chei publice. Astfel, DSS (Digital Signature Standard), după cum era denumită metoda, a fost dezvoltată de Agenția de Securitate Națională a SUA (NSA). Metoda a dezamăgit nu datorită performanțelor ci datorită proiectantului care era și spărgător de cifruri, stârnind astfel suspiciuni. Cifrul este definit ca transformarea unui mesaj clar în mesaj cifrat sau critogramă.

Criptarea sau cifrarea reprezintă procesul de transformare a textului clar în text cifrat, iar operatiunea inversă, de transformare a criptogramei în text clar se numește decriptare sau descifrare. Controlarea cifrării și descifrării se realizează prin una sau mai multe chei criptografice. Exista două tipuri de sisteme: asimetrice, cu chei publice, care folosesc chei distincte, una dintre ele fiind ținută secretă de proprietarul ei, iar cealalta facută publică și sisteme simetrice, cu cheie secretă, ce folosesc aceeași cheie la cifrare și descifrare.

1.1.2 Istoria criptografiei

Criptarea informațiilor este foarte importantă deoarece este utilizată in tot mai multe domenii de legături secretizate: comunicații militare, comunicațiile serviciilor speciale, comunicațiile guvernamentale, diplomatice cât și din mediile financiar-bancare, a agenților economici și televiziunile companiilor private. De asemenea scopul lor este de a păstra confidențialitatea informațiilor și caracterul lor secret, atât la nivel politico-diplomatic cât și la nivel economico-financiar.

Sistemul de comunicații este format din componente diferite, distribuite spațial, ce permit cu ușurință efectuarea de atacuri sau operații ilegale, ceea ce duce la creșterea importanței existenței unui sistem de protecție. Pentru a proiecta securitatea unui sistem de comunicație trebuie să avem în vedere urmatoarele categorii:

Confidențialitatea – reprezintă protejarea informatiilor împotriva citirii sau copierii de către alți utilizatori ce nu au permisiune;

Integritatea datelor – reprezintă protejarea informațiilor împotriva ștergerii sau modificării realizate fără permisiunea celui ce deține informația;

Disponibilitatea – reprezintă protejarea unui serviciu astfel încât acesta sa nu fie inactivat fără autorizație din partea administratorului;

Controlul accesului – reprezintă gestionarea accesului la sistem, astfel încât sa nu permită utilizatorilor neautorizați să acceadă în sistem, compromițând astfel integritatea resurselor și confidențialitatea informațiilor;

Auditul – are rolul de a înregistra activitatea în sistem, având scopul de a oferii informații necesare administratorului legat de identificarea în egală măsură a utilizatorilor cât și a acțiunilor întreprinse de aceștia;

În funcție de cerințele și obiectivele de securitate, fiecare organizație decide importanța diferită a acestor aspecte astfel:

Domeniul militar, diplomatic, sau guvernamental – are pe primul plan confidențialitatea și în plan secund disponibilitatea;

Mediul bancar – cele mai importante categorii de protecție din acest domeniu sunt integritatea și auditul, iar pe următorul plan se află confidențialitatea și disponibilitatea;

Mediul universitar – aici integritatea și disponibilitatea joacă un rol important.

Înainte de epoca modernă, criptografia avea rolul de a asigura confidențialitatea mesajelor, conversia lor dintr-o formă comprehensibilă într-una incomprehensibilă cu scopul de a face mesajul cât mai imposibil de ințeles pentru cei ce interceptau mesajul și nu aveau cunoștinte de secrete adiționale. În vremea noastră domeniul s-a extins, iar pe langă problemele de confidențialitate au apărut și tehnici de verificare a integrității mesajului, autentificarea transmițătorului și a receptorului, semnături electronice, calcule securizate.

De-a lungul istoriei criptografia a devenit un lucru important în societate astfel încât producătorii de cifruri au ajuns la realizarea unor sisteme de cifrare cât mai rezistente. Problema operativității și a productivității nu a fost tratată de la începuturi, dar odată cu creșterea volumului de corespondență ce trebuia cifrată cât și a complexității metodelor de cifrare(implicit și creșterea riscului de a greși), aceste probleme au devenit foarte importante. Astfel a apărut necesitatea de a creea dispozitive cu ajutorul cărora activitatea de cifrare să se realizeze mai sigur și mai rapid, cum ar fi: rigle, discuri, abace, cu timpul acestea fiind perfecționate si s-a ajuns la adevărate mașini la început mecanice, apoi electromecanice, ca într-un final să se ajungă astăzi la realizarea unor sisteme de cifrare ce se bazeaza pe utilizarea calculatoarelor și a microprocesoarelor specializate.

Aceste dispozitive și mașini pot fi grupate în șase generații, urmărindu-se astfel evoluția dezvoltării tehnicii și tehnologiilor de realizare, cât și evoluția metodelor și principiilor de cifrare:

Prima generație apărută se pare prin anul 475 î.e.n. în care putem să includem dispozitive simple bazate pe principiul riglei;

În generația următoare, la sfârșitul secolului al XIX-lea, apar mașini mecanice bazate pe cilindri, tamburi, roți dințate și pârghii. Deoarece algoritmul de cifrare al acestor mașinării este mai complicat dar automatizat și utilizănd un număr de chei foarte mare și practic nerepetabil se elimină astfel greșelile de transcriere, iar siguranța și operativitatea cifrării crește, duce la dezvoltarea lor rapidă mai ales în perioada primului război mondial;

O a treia generație ce apare la mijlocul secolului al XIX-lea se dezvoltă paralel cu cea de-a doua, împrumutând multe din principiile și modalitățile practice de realizare. Apariția acesteia a fost determinata de realizarea telegrafului, iar metodele de cifrare și criptanaliză impuse de a treia generație duc la transformarea mașinilor mecanice în electromecanice;

În a patra generație sunt dezvoltate aparaturile electrice ce se impun cu puțin înainte de primul razboi mondial. Pentru început s-au utilizat sisteme cu relee sau transformări ale mașinilor de scris electrice și de asemenea și utilizarea roților de cod;

A cincea generație a aparut cu putin timp înaintea începerii celui de-al doilea război mondial, în același timp cu dezvoltarea accentuată a electronicii și apariția calculatoarelor cu memorii magnetice. Comunicațiile prin radio, alături de telegraf, au influențat foarte mult criptologia impunând o dezvoltare rapidă a criptoanalizei;

Generația șase a apărut după anii 50, fiind denumită generația microelectronicii, a informaticii și a procesoarelor specializate. Baza acestei generații o reprezintă algoritmii complecși, iterativi și utilizarea cheilor aleatoare și unice, cât și trecerea de la folosirea ca suporți de informație a benzilor sau a colilor de hârtie la dischete sau benzi magnetice.

Evoluția acestor mijloace continuă și în ziua de astăzi într-un ritm și mai alert. Principalii beneficiari de mijloace criptoanalitice pot fi casificați în cinci mari categorii:

Militari;

Diplomați;

Servicii de informație;

Oameni de afaceri;

Corespondenți particulari.

1.2 Moduri de criptare

1.2.1 Criptarea hardware

Chiar dacă criptarea software devine tot mai populară, în zilele noastre cel mai dorit mod de criptare o reprezintă cea hardware atât în aplicații militare cât și comerciale de mare importanță(de exemplu NSA autorizează doar criptări hardware).

Unul dintre motivele utilizării criptării hardware este viteza. Într-un calculator sunt simulate o multitudine de operații complicate asupra unui șir clar de biți. Algoritmii de criptare comuni, DES și RSA, nu lucrează eficient pe procesoare normale. Chiar dacă mai mulți criptografi și-au facut proprii algoritmi adaptați pentru sofware, hardware-ul castigă prin viteză. Intoducerea în procesor a sarcinii de criptare este deseori ineficientă, de aceea un sistem va fi mult mai rapid dacă operațiile se fac cu procesor sau chip dedicat.

Un alt motiv îl reprezintă securitatea. Pe un computer obișnuit un algoritm de criptare nu prezintă protecție fizică, în timp ce dispozitivele de criptare hardware sunt incapsulate, protecția facându-se destul de ușor. Spre exemplu chipurile VLSI, pot fi tratate chimic, iar prin orice încercare de pătrundere, chipul se poate distruge. Un sistem de cripatare a datelor și comunicațiilor pentru mainframe-uri, dezvoltat de IBM, include module inviolabile pentru păstrarea cheilor. Dispozitivele de criptare se pot ecrana, astfel radiațiile electromagnetice nu pot pătrunde în interiorul unei piese din echipament. Și calculatoarele obișnuite se pot ecrana, însă intervine o problemă mult mai complexă (program cunoscut cu numele de TEMPEST). Motivul final ar fi ușurința instalării.

Este posibil ca securizarea datelor să fie făcută pentru transmisii de fax, conversații telefonice sau legături de date. Decât să modificăm sistemul software al calculatorului este mai ușor de instalat un dispozitiv special. Criptarea nu trebuie să fie accesată de către utilizator, ea trebuie să fie invizibilă, astfel că singura cale este de a scrie criptarea în sistemul de operare, ceea ce nu este un lucru foarte simplu. Pe de altă parte, i se poate atașa un dispozitiv de criptare chiar și unui calculator slab, între el și modemul de comunicație.

Criptarea hardware oferă pe piață trei lucruri de bază: module de criptare, dispozitive de criptare pentru legături de comunicație sau plăci atașate în calculatorul personal. Între criptarea sincronă sau asincronă există diferențe majore. Spre exemplu niciun dispozitiv nu va accepta o viteză mai mare decât cea pentru care a fost proiectat. O problemă împortantă o reprezintă compatibilitatea între necesitățile propriei aplicații și caracteristicile dispozitivului de criptare oferit. Din ce în ce mai multe companii secretizează datele prin hardware specializat. Pentru aceste dispozitive administrarea cheilor este în general sigură deși se găsesc atâtea scheme echivalent cu numărul de producători.

1.2.2 Criptarea software

Se știe foarte bine că orice algoritm de criptare poate fi implementat software, dezavantajele acestor tipuri de implementări fiind viteza, costul și ușurința în manipulare și modificare. De asemenea avantajele lor, flexibilitatea și portabilitatea, ușurința în folosire cât și în efectuarea de upgrade-uri fac acest tip de implementare accesibil oricui, programele criptografice fiind copiate ușor și instalate pe orice mașină, încorporându-se în aplicații complexe, cum ar fi cele de comunicații și procesoare de texte.

Pentru majoritatea sistemelor programele de criptare software sunt foarte populare cât și valabile, destinația lor fiind să protejeze fișiere individuale. Criptarea și decriptarea fișierelor este realizată în general de către utilizator, important este ca schema de administrare a cheilor să fie sigură, iar cheile să nu fie păstrate oriunde pe disc. De asemenea textele clare criptate trebuiesc șterse după efectuarea operațiilor.

1.3 Atacuri și modele de securitate în sistemele informatice

1.3.1 Atacarea sistemelor de criptografie

Poate fi numită compromitere a securității unui sistem criptografic orice fel de acțiune care duce la lezarea algoritmilor de criptare, protocoalelor folosite în criptare sau care atacă tehnicile folosite pentru dezvoltarea algoritmilor.

Figura de mai jos prezintă principalele modele de metode de atacuri asupra unui sistem criptografic.

Fig. 1. Metode de atacuri asupra unui sistem criptografic

Putem clasifica atacurile în funcție de modelul de atacare, așa cum prezintă și desenul de mai sus, în atacuri de intercepție(pasive) și atacuri active.

Atacurile pasive sunt bazate pe intercepția informației ce sunt constituite în doua mari categorii: prima categorie are ca fundament interceptarea conținutului mesajului reușind astfel lezarea caracterului confidențial al comunicației în cazul in care mesajul nu este criptat, cea de-a doua categorie are ca fundament analiza traficului prin aceasta obținându-se o serie de informații importante precum lungimea mesajelor, frecvența lor sau identitatea părților comunicante.

Atacurile pasive sunt extrem de greu de depistat în timp real deoarece datele interceptate nu suferă modificări. Pentru prevenirea acestui tip de atacuri se pot lua un set de măsuri care duc la îngreunarea criptanalizei dar nu și la înlăturarea ei definitivă.

Cel de-al doilea tip de atacuri sunt cele de tip activ care lezează comportamentul normal al traficului dar și intervine în modificarea datelor inițiale sau crearea unor date false. Printre atacurile active întâlnim atacul la disponibilitate prin care un bloc funcțional este lezat sau i se alterează comportamentul normal. Un alt tip de atac activ implică modificarea mesajului inițial prin deteriorare, întârziere sau reordonare schimbându-i astfel comportamentul, setul de valori dar și mesajele transmise în interiorul rețelei. Printre atacurile active mai regăsim și atacuri care se fac răspunzătoare de lezarea autenticității mesajelor reușind astfel prin diferite procedee, precum mascarea(o entitate pretinde a fi o alta) sau reluarea să producă efecte neautorizate în sistem.

Spre deosebire de atacurile pasive, la care se preferă prevenirea, atacurile active se bazează pe detectarea în timp util, prevenirea fiind în unele cazuri imposibil de realizat.

1.3.2 Atacuri criptanalitice

Aceste atacuri sunt asupra textelor cifrate pentru a obține textul normal sau cheile folosite pentru decriptare.

Prezentăm astfel mai multe tipuri de atacuri de acest fel, precum:

Atac asupra textului cifrat(cipher text-only attack) explicația este: criptanalistul deține criptograma Ci = Ek (Mi) în vederea obținerii mesajului în clar (Mi) sau a cheii k

Atac asupra unui text cunoscut(chiper text-only attack) explicația este: criptanalistul deține criptogramele Ci și mesajele Mi necesare și trebuie să stabilească cheia k sau algoritmul de determinare a lui Mi+1 din Ci+1=Ek(Mi+1)

Atac cu text în clar ales(chosen plain-text attack) explicația este următoarea: se pot alege o serie de mesaje Mi cunoscându-se criptogramele corespondende: Cj=Ek(Mi), astfel criptanalistul are datoria de a determina cheia k sau algoritmul de determinare a lui Mi+1 din Ci+1=Ek(Mi+1)

Atac cu text clar ales adaptiv(adaptive chosen plain-text attack) explicația este următoarea: se aleg mesajele Mi în clar și se adaptează în funcție de rezultatele criptanalizelor anterioare cunoscându-se criptogramele Ci=Ek(Mi), astfel rămâne cheia k sau algoritmul de determinare a lui Mi+1 din Ci+1=Ek(Mi+1) care trebuie stabilite.

1.3.3 Securitatea algoritmilor

În anul 1944 s-au clasificat categoriile de spargere a unui algoritm de către Lars Knudsen, acestea fiind:

Spargerea totală(total break) constă în găsirea cheii de către un criptanalist, ceea ce înseamnă că orice criptogramă poate fi decriptată: Dk(C)=M

Deducția globală(global deduction) constă în găsirea unui algoritm alternativ echivalent cu Dk(C) fără a știi cheia k

Deducția locală(local deduction) constă în găsirea textului în clar al unui text cifrat interceptat de către criptanalist

Deducția informațională(informational deduction) constă în găsirea de către criptanalist a unor informații legate de cheie sau de textul în clar

Algoritmul computațional puternic(computational strong) poate fi spart acum, dar și în viitor doar cu resursele deja existente

Algoritmul necondiționat sigur(unconditional secure) este mai greu de spart deoarece criptanalistul poate ave;a oricât text cifrat, dar informația nu este suficientă pentru a deduce textul în clar.

1.4 Clasificarea Criptosistemelor

În funcție de tipul cheilor folosite pentru criptare/decriptare, criptosistemele se clasifică în două categorii și anume sisteme: cu chei publice și cu chei simetrice

1.4.1 Criptosisteme cu chei publice (asimetrică)

Într-un sistem cu chei simetrice, pentru un criptanalist nu există nici un fel de dificultăți în procesul de decriptare. Cheile de criptare și decriptare sunt aceleași, chiar și în cele mai sofisticate sisteme, cum ar fi DES-ul. Există criptosisteme în care metoda de criptare poate fi făcută publică. Aceasta înseamnă că și criptanalistul cunoaște metoda de criptare și, totuși, el nu este în măsură să decripteze criptotextul. În aceasta constă ceea ce este cunoscut sub numele de criptografie cu chei publice: metoda de criptare poate fi făcută publică.

Conceptul a fost realizat de Diffie și Hellman, și deși revoluționară, ea este cât se poate de simplă. O astfel de idee simplă a fost luată în considerare târziu – la mijlocul anilor ’70 datorită complexității calculului. Teoria dă informații privind complexitatea diferitelor calcule, de pildă privind timpul de calcul necesar atunci când se folosesc cele mai bune calculatoare. O astfel de informație este crucială în criptografie.

Criptarea se poate face într-o singură direcție (“sens unic”). Deși este ușor de mers în această direcție, totuși este imposibil de urmat direcția opusă: decriptarea. Pentru exemplificare să considerăm cartea de telefon dintr-un mare oraș. Este foarte ușor să stabilim numărul de telefon al unei persoane precizate. Pe de altă parte, este foarte greu (chiar imposibil) de stabilit persoana care are un număr de telefon specificat. Acest exemplu oferă și o idee pentru un criptosistem cu chei publice.

Criptarea este de tip context-free: literă cu literă. Pentru fiecare literă a textului clar este ales, din cartea de telefon, în mod aleator, un nume care începe cu acea literă. Numărul de telefon corespunzător constituie criptarea apariției respective a literei în cauză. O astfel de listă de numere face ca decriptarea să fie mai simplă. Lista numerelor de telefon ordonate crescător constituie trapa secretă, cunoscută numai de utilizatorii legali ai acestui sistem.

Fără cunoașterea acestei trape, adică fără a poseda o copie a cărții de telefon, criptanalistul va avea nevoie de un timp foarte mare pentru decriptare. Aceasta în ciuda faptului că metoda de criptare a fost făcută publică și astfel criptanalistul cunoaște, în principiu, cum trebuie să intercepteze secvența numerică interceptată.

O altă metodă de a rezolva este ca criptanalistul să apeleze numerele din criptotext și să ceară numele corespunzătoare acestora. Succesul metodei este cel puțin discutabil în foarte multe cazuri, criptanalistul poate primi un răspuns curios sau nici un răspuns. De fapt metoda devine de neaplicat dacă se folosește o carte de telefon mai veche.

Principiul acestui sistem este ilustrat în figura 2:

Fig. 2. Schema bloc a unui sistem de criptare cu cheie publică

Fiecare utilizator are o transformare de cifrare publică Ek1 care poate fi memorată într-un fișier public și o transformare de cifrare critică Dk2.

Proprietățile unui sistem de criptare cu cheie publică sunt:

1. pentru orice pereche de chei (K1,K2) algoritmul de descifrare cu cheia K2 : Dk2 este inversul algoritmului de descifrare cu cheia K1 : Ek1;

2. pentru orice K1, K2 și orice M, algoritmii de calcul pentru Ek1 și Dk2 sunt simpli și rapizi

3. pentru orice K1,K2 algoritmul de calcul al lui Dk2 nu poate fi obținut într-un interval de timp rezonabil plecând de la Ek1

4. orice pereche K1,K2 trebuie să fie calculabilă ușor plecând de la o cheie unică și secretă.

În sistemele cu cheie publică, protecția și autentificarea sunt realizate prin transformări distincte.

Fig. 3. Protecția criptosistemului cu chei publice

Spre exemplu : presupunem că utilizatorul A dorește să transmită un mesaj M unui utilizator B. În acest caz, A, cunoscând cheia publică a lui B (EB), transmite criptograma C=EB(M), asigurând astfel funcția de protecție (Fig. 5.2).

La recepție, B descifrează criptograma C utilizând transformarea DB: DB(C)=DB(EB(M))=M.

Pentru autentificare se aplică lui M transformarea secretă DA. Către B se va transmite: C=DA(M). La recepție, B va aplica transformarea publică EA corespunzătoare lui A: EA(C)=EA(DA(M)=M.

Fig. 4. Autentificarea în criptosisteme cu chei publice

Autentificarea este realizată deoarece către B nu pot fi transmise mesaje false C′=DA(M′), deoarece numai A cunoaște DA (cheia secretă). În acest caz nu se realizează însă și protecția, pentru că M poate fi obținut de orice apelant EA a lui C, EA fiind publică.

Pentru a realiza simultan protecția și autentificarea (Fig. 5.4), spațiul M trebuie să fie echivalent spațiului C, astfel încât orice pereche (EA,DA), (EB,DB) să fie mutual inverse: EA(DA(M))=DA(EA(M))=M

EB(DB(M))=DB(EB(M))=M

Fig. 5. Protecție și autentificare în criptosistemele cu chei publice

Utilizatorul A va aplica mai întâi transformarea secretă DA asupra mesajului M, după care va transmite lui B criptograma : C=EB(DA(M)). Receptorul B obține mesajul în clar aplicând criptogramei propria-i funcție de descifrare DB și apoi transformare publică a lui A, EA: EA(DB(C)=EA(DB(EB(DA(M))))=EA(DA(M))=M.

1.4.1.1. Semnătura digitală în criptosistemele cu chei publice

Fie mesajul semnat de A, transmis către receptorul B. Semnătura lui A trebuie să aibă următoarele proprietăți:

• B trebuie să fie capabil să valideze semnătura lui A;

• să fie imposibil pentru oricine, inclusiv B, să falsifice semnătura lui A;

• în cazul în care A nu recunoaște semnătura unui mesaj M, să existe un „judecător” care să rezolve disputa dintre A și B.

Implementarea semnăturii digitale este extrem de simplă în cazul sistemelor cu chei publice. În acest caz, DA poate servi ca semnătura digitală pentru A. Receptorul B al mesajului M, semnat de A, este sigur atât de autenticitatea emițătorului cât și a datelor.

Protocolul semnăturii digitale se desfășoară astfel:

• A semnează pe M : S=DA(M);

• A trimite lui B criptograma : C=EB(S);

• B validează semnătura lui A, verificând dacă EA(S)=M; DB(C)=DB(EB(S))=S; EA(S)=EA(DA(M))=M;

Un „judecător” rezolvă eventualele dispute dintre A și B, controlând dacă EA(S) conduce la M, în același mod ca și B.

1.4.1.2. Sisteme de cifrare cu chei publice exponențiale

Sistemele criptografice cu chei publice sunt sisteme de tip asimetric.Ideea care stă la baza acestui concept constă în faptul că, cheia de cifrare este făcută publică de fiecare utilizator și poate fi folosită de către toți ceilalți utilizatori pentru cifrarea mesajelor ce îi sunt adresate. În schimb, procedura (cheia) de descifrare este ținută secretă. În Fig. 3.5 se prezintă sistemul cu chei publice, în paralel cu un sistem clasic.

Fig. 6. Criptosistem cu chei publice a) și convențional b)

Dacă notăm cu {m} –mulțimea mesajelor, {c} –mulțimea receptoarelor, E-procedura de cifrare și D-procedura de descifrare, un criptosistem cu chei publice trebuie să satisfacă următoarele:

(1) dacă C=E(M), atunci M=D(C) sau D(E(M))=M, ∀ M∈{M};

(2) E și D sunt ușor și rapid aplicabile

(3) dezvăluirea publică a lui E nu trebuie să compromită pe D, ceea ce înseamnă că obținerea lui D din E este matematic imposibil sau presupune un consum enorm de resurse.

Metoda propusă permite comunicații sigure între utilizatorii care nu au stabilit contacte prealabile. De exemplu, dacă utilizatorul A dorește să transmită un mesaj confidențial utilizatorului B, A va căuta în fișierul public EB și se va transmite la B: C=EB(M). Conform proprietății a treia, B este singurul utilizator care știe să descifreze criptograma C aplicând cheia DB ținută secretă.

În plus, pentru ridicarea gradului de securitate al transmisiei s-a propus ca E și D să îndeplinească și următoarea proprietate adițională:

(4) dacă S=D(M), atunci M=E(S) sau E(D(M))=M pentru ∀ M ∈{M}.

Varianta S este numită semnătură digitală și reprezintă o metodă de autentificare reciprocă. În timp ce B poate fi sigur că mesajul recepționat a venit de la adevăratul A, A poate fi sigur că nimeni nu va putea să-i atribuie un mesaj fals. Utilizatorul A poate semna mesajul către B astfel: S=DA(M), apoi, trimițând criptograma: C=EB(S).

În aceste condiții numai B poate recunoaște pe S din C calculând: DB(C)=DB(EB(S))=S. Apoi mesajul se poate obține calculând : EA(S)=EA(DA(M))=M.

Diffie și Hellman sugerează o metodă de implementare practică a conceptului propus. Se indică utilizarea unor funcții greu inversabile. O funcție este greu inversabilă dacă este inversabilă și ușor de calculat, dar pentru aproape toate valorile y din codomeniu este imposibil computațional să se calculeze

x=f-1(y).

Cu alte cuvinte este imposibil să se calculeze f-1 dacă se dispune de o descriere completă a lui f. În concluzie, o funcție este greu inversabilă dacă:

• este ușor să se calculeze y din x, y=f(x);

• există inversa funcției;

• este computațional imposibilă determinarea inversei funcției.

O funcție greu inversabilă se spune că este cu trapă atunci când f-1 este ușor de calculat numai dacă se dispune de o informație numită trapă; necunoașterea acestei informații face ca funcția să fie greu inversabilă. O astfel de pereche de funcții (f, f-1) poate constitui perechea (E, D) a unui criptosistem cu chei publice. În general pentru procedurile E și D se indică scheme bazate pe operații modulo n cu elemente din inelul claselor de resturi modulo n. Securitatea algoritmilor implementați prin metoda cifrării asimetrice au la bază dificultatea calculului logaritmului modulo număr prim.

Fie q un număr prim și un întreg X, X∈[1, q-1]. Se pot calcula: Y=ax (mod q), unde a este un element primitiv al câmpului Galois GF(q).

După cum se știe, clasele de resturi modulo q formează un inel; dacă q este un număr prim acesta formează un câmp Galois GF(q). Într-un câmp Galois GF(q) există (q-1) numere care se numesc elemente primitive ale câmpului. Dacă a,a2 ,…,aФ(q) sunt puterile lui a, acestea au ca resturi modulo q pe 1,2,…,Ф(q), unde Ф(q) este indicatorul lui Euler, Ф(q)=q-1.

Fiecare utilizator A alege în mod aleator un număr XA, XA={1,2,…,q-1} și se calculează YA=aXA(mod q). Numărul XA este ținut secret în timp ce YA se face public. Dacă utilizatorii A și B doresc să comunice, ei utilizează următoarea cheie de comunicație: KAB=Y XBA=Y XAB=Y XAXB B (mod q).

În timp ce utilizatorii A și B pot calcula cheia KAB pornind de la x propriu(secret) și y public al partenerului, un criptanalist trebuie să calculeze KAB pornind de la YA și YB, singurele făcute publice; se procedează astfel: KAB=YA logYB(mod q). Acest lucru face ca sistemul să fie deosebit de greu de spart datorită imposibilității calculului logaritmului modulo q.

1.4.1.3. Cifrul Rivest-Shamir Adleman (RSA)

Cel mai larg utilizat și verificat criptosistem cu chei publice a fost cel introdus de Rivest, Shamir și Adleman, care este acum cunoscut ca RSA.

Acest cifru reprezintă standardul în domeniul semnăturilor digitale și al confidențialității cu chei publice. Sub diferite forme de implementare, prin programe sau dispozitive hardware speciale, RSA este astăzi recunoscută ca cea mai sigură metodă de cifrare și autentificare disponibilă comercial.

Acest cifru se bazează pe o idee uimitor de simplă din teoria numerelor și totuși a rezistat la toate atacurile criptanaliștilor de până acum. Ideea se bazează pe faptul că, deși este ușor să înmulțești două numere prime mari, este însă extrem de greu să se factorizeze produsul lor. Astfel, produsul poate fi făcut cunoscut și utilizat ca o cheie de criptare. Numerele prime însele nu pot fi reconstituite din produsul lor. Pe de altă parte, numerele prime sunt necesare pentru decriptare.

În continuare voi prezenta detalii despre sistemul RSA. Fie p și q două numere prime mari distincte și aleatoare(având aproximativ 100 cifre zecimale fiecare). Se notează :

n = pq și Ф(n) = (p-1)(q-1)

unde Ф este funcția Euler.Se alege un număr aleator mare D>1 astfel încât (D,Ф(n)) = 1 și se calculează numărul E,1<E <Ф(n) care să satisfacă congruența:

ED = 1(modФ(n)).

Numărul n este modulul, E este exponentul de criptare și D exponentul de decriptare.Numerele n și E formează cheia publică de criptare, iar p, q, Ф(n) și D formează trapa secretă.Evident că informația despre trapa secretă nu constă în patru parametri independenți. De exemplu, cunoașterea lui p conduce imediat la aflarea și a celorlalți trei parametri.

Metoda de criptare implică calcul exponențial într-un câmp finit(modulo n). Mesajul cifrat se obține din mesajul în clar printr-o transformare(codare) bloc. Fie unul din aceste blocuri din mesaj M, bloc ce are proprietatea M∈(0, n-1); proprietate care se obține prin modul de împărțire a mesajului în blocuri. Blocul cifrat, C, corespunzător blocului în clar, se obține calculând exponențiala: C=ME(mod n), E și n reprezentând astfel cheia secretă de decriptare.

Decriptarea se face prin operația: M=CD(mod n), unde D este cheia secretă de decriptare.

Cele două chei E și D trebuie să satisfacă relația:

M=CD(mod n)=MED(mod n), pentru ca algoritmul să poată fi într-adevăr folosit. Pentru aceasta plecăm de la teorema Euler-Fermat: P este un număr prim dacă ap-1=1(mod p) oricare ar fi a, a∈[1,p]. Astfel, dacă am ales un număr prim n, pentru orice bloc n∈(0,1) avem proprietatea de la care pornim MФ(n)(mod n)=1.

Dacă E și D satisfac relația ED(mod Ф(n))=1, putem scrie:

ED=KФ(n)+1=Ф(n)+Ф(n)+Ф(n)+…+Ф(n)+1, MED=MФ(n)+Ф(n)+Ф(n)+…+Ф(n)+1=

MФ(n)MФ(n)MФ(n)…M(mod n). Deci ED(mod Ф(n))=1⇒MED=M(mod n)

Astfel am asigurat o transformare reversibilă de criptare pe baza unei exponențiale într-un câmp finit. Mai rămâne să asigurăm securitatea cheii de criptare, iar în cazul de mai sus este ușor de determinat având la dispoziție E și n, știind că ED(mod Ф(n))=1 și Ф(n)=n-1.

Securitatea se bazează pe ideea de factorizare a unui număr mare. Pornind de la această idee numărul n se poate obține prin produsul a două numere prime mari p și q: n=pq, astfel încât indicatorul lui Euler, Ф(n)=(p-1)(q-1), devine mult mai greu de determinat având la dispoziție n.

Folosind această schemă se poate obține un sistem performant de criptare cu chei publice. Un sistem care asigură confidențialitatea va avea ca elemente următoarele perechi:

• (E, n) cheia publică;

• (D, n) cheia secretă;

Un criptanalist care are la dispoziție perechea (E, n) va trebui să determine D ținând cont că ED(mod Ф(n))=1. Pentru aceasta trebuie determinat Ф(n)=(p-1)(q-1), deci implicit p și q, problemă care se reduce la a factoriza numărul n, problemă practic imposibilă pentru un număr n mare.

1.4.1.4. Cifrul EL GAMAL (EG)

El Gamal propune în o nouă metodă de semnătură bazată pe schema de distribuție a cheilor a lui Diffie și Hellman. Schema presupune că A și B doreau stabilirea unei chei secrete kAB, A folosind informația secretă xA iar B pe xB. De asemenea există un întreg prim mare p și un element a primitiv modulo p. A va calcula yA=axA mod p și va emite la B pe yA. Similar B va emite la A: yB=axB mod p.

Ca urmare fiecare poate acum calcula cheia secretă comună:

kAB=(axA) xB mod p=(yA) xB mod p=(axB) xA mod p=(yB) xA mod p.

Pentru ca A să transmită un mesaj m cifrat la B, 0≤m≤p-1, A va putea alege un k∈[0, p-1] care va servi drept cheie secretă xA. El va calcula apoi cheia: kAB=yB k mod p, unde yB a fost obținut direct de la B sau dintr-un fișier cu chei publice. A va putea emite la B perechea (c1, c2), unde: c1=ak mod p, și c2=kAB m mod p.

Descifrarea se face și ea în două etape. Mai întâi se obține kAB:

kAB=(ak ) xB=(c1) xB mod p.

Apoi se va obține mesajul clar prin împărțirea lui c2 la kAB. El Gamal propune pe baza acestei scheme o nouă metodă de semnătură. Fie m un document semnat, 0≤m≤p-1. Fișierul public va conține cheia y=ax mod p pentru fiecare utilizator. Pentru a semna un document, A va folosi cheia 35 sa secretă xA într-o astfel de manieră încât semnătura să poate fi verificată de orice alt utilizator pe baza cheii publice yA.

1) Procedura de semnare

a) Se alege aleator un întreg k, k∈[0, p-1], astfel ca c.m.m.d.c.(k, p-1) = 1;

b) Se calculează: r=ak mod p.

Semnătura lui m este perechea (r,s), 0≤r, s≤p-1, care satisface condiția: m=yr r s (mod p) (*);

c) acum condiția (*) poate fi scrisă: am=axra ks mod p, prin rezolvarea ecuației m=xr+ks mod p, care are soluție dacă se respectă procedura a).

2) Verificarea semnăturii

Fiind dați m, r, s, este ușor să se verifice autenticitatea semnăturii calculând am (mod p), yr r s (mod p) și verificând apoi dacă sunt egale. Este indicat ca valoarea lui k, aleasă aleator, să fie folosită o singură dată. Se poate folosi în acest scop un generator de k bazat pe un model DES (generator cu contor).

1.4.1.5. Sisteme de cifrare cu chei publice de tip rucsac

Metoda de cifrare cu cheie publică MH este bazată pe cunoscuta problemă a rucsacului, care constă în a determina într-o mulțime de numere întregi, o submulțime de o sumă dată. Merkle și Hellman propun o metodă a cărei securitate depinde de dificultatea rezolvării următoarei probleme: fiind dat un întreg pozitiv C și un vector A=(a1,a2,…,an) de întregi pozitivi, să se găsească o submulțime a lui A a cărei sumă să fie C. Cu alte cuvinte este necesar să se determine un vector binar M=(m1,…,mn), astfel că C=AM sau: i C = ∑aim .

Intuitiv problema este următoarea: cunoscând greutatea unui rucsac închis și greutățile mai multor obiecte care s-ar putea afla în interiorul său, să se determine setul de obiecte aflate în rucsac, fără a se face deschiderea lui.

Cel mai bun algoritm cunoscut pentru rezolvarea ei – în cazul în care dimensiunea rucsacului este n – cere (2n/2) timp și o memorie de (2n/2).

1.4.1.6. Avantajele evidente ale cheilor publice

Avantajele criptografiei cu chei publice sunt numeroase, cu condiția ca aceasta să poată fi realizată practic fără nici un fel de urmări secundare negative. O inovație adusă de cheile publice privește gestiunea cheilor.

Să considerăm un criptosistem clasic (simetric). Cheia de criptare o furnizează și pe cea de decriptare și, prin urmare, prima nu poate fi făcută publică. Aceasta înseamnă că cele două părți legale (emițătorul și receptorul) trebuie să cadă de acord în avans asupra metodei de criptare. Aceasta poate avea loc fie prin întâlnirea dintre cele două părți, fie prin transmiterea cheii de criptare pe un anumit canal sigur.

Dacă se folosește un criptosistem cu chei publice, nu este obligatoriu ca cele două părți să se fi întâlnit – ele pot chiar să nu se cunoască una cu alta sau chiar să nu fi comunicat între ele vreodată. Aceasta este un avantaj uriaș, de exemplu, în cazul unei mari bănci de date, unde există numeroși utilizatori și unul dintre ei vrea să comunice numai cu un anumit utilizator. Atunci el poate realiza acest lucru introducând informații în însăși baza de date.

O altă diferență între criptosistemele cu chei publice și cele clasice este și lungimea cheii. Deoarece fiecare cheie trebuie descrisă într-un fel sau altul, descrierea fiind o secvență de litere ale unui anumit alfabet. Există o diferență considerabilă între criptosistemele cu chei publice și cele clasice.

1.4.2 Criptosisteme cu chei secrete (simetrică)

Dacă funcția ek este bijectivă atunci sistemul este simetric , iar dacă funcția ek nu este bijectivă atunci sistemul este asimetric.

Există două tipuri de sisteme simetrice (cunoscute și sub denumirea de sisteme cu cheie secretă): sisteme care se bazează pe algoritmi de tip bloc și sisteme care se bazează algoritmi de tip șir. Algoritmii de tip bloc acționează asupra blocurilor de text în clar și text cifrat. Algoritmii de tip șir se aplică șirurilor de text în clar și text cifrat, la nivel de bit sau octet.

1.4.2.1. Algoritmi simetrici de tip bloc

Algoritmii de tip bloc criptează mesajul în blocuri de 64 sau 128 de biți. Se aplică o funcție matematică între un bloc de biți ai mesajului în clar și cheie (care poate varia ca mărime), rezultând același număr de biți pentru mesajul criptat. Funcția de criptare este realizată astfel încât să îndeplinească următoarele cerințe:

– știind un bloc de biți ai textului în clar și cheia de criptare, sistemul să poată genera rapid un bloc al textului criptat;

– știind un bloc de biți ai textului criptat și cheia de criptare/decriptare, sistemul să poată genera rapid un bloc al textului în clar;

– știind blocurile textului în clar și ale textului criptat, sistemului să-i fie dificil să genereze cheia.

Acest tip de algoritmi este foarte folosit în criptografia modernă; de aceea în acest capitol vom prezenta cîțiva algoritmi care “au făcut carieră”, după prezentarea modurilor criptografice care stau la baza funcționării algoritmilor de tip bloc.

1.4.2.2. Algoritmul DES

Algoritmul DES (Data Encryption Standard), creat pentru guvernul Statelor Unite și pentru folosință publică, a fost dezvoltat plecând de la algoritmul “Lucifer” conceput în Laboratoarele IBM. Revista Federal Register a sintetizat, in mai 1973, principiile care stau 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.

In noiembrie 1976, DES a fost oficial adoptat ca standard federal, pentru ca in 1977 specificațiile sale sa fie făcute publice.

Privire generală asupra algoritmului

Algoritmul DES este definit ca o combinație complexă ce foloseste 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 fiind un algoritm simetric ce are aceeași cheie ce este folosita atât la criptare cât și la decriptare.

Algoritmul fiind constituit din 16 cicluri repetate ale blocurilor fundamentale are textul inițial este descompus în blocuri de 64 de biți. Cheia este de 64 biți dintre care doar 56 sunt efectivi, iar ceilalți sunt biți de paritate. Cele doua blocuri fundamentale in criptografie provoacă confuzie prin sistematica de substituire a unor biți cu alții, cât și difuzie prin re-ordonarea biților.

Folosindu-se numai operații clasice aritmetice și logice ce au un număr de până la 64 de biți, duce la un mod ușor de implementare atât software cât mai ales hardware, scopul algoritmului este implementarea hardware într-un cip specializat.

Parcurgerea celor 16 cicluri are loc după schema din figura 7:

Fig. 7. Detalii pentru folosirea algoritmului DES

Datele de intrare, fiind împărțite în blocuri de 64 biți, sunt transformate folosind cheia de 64 de biți. Dupa ce cei 64 de biți sunt permutați prin “permutarea inițială”, urmează operațiile ce constituie un ciclu, blocul de 64 de biți se separa în două, “jumătatea stângă” și “jumătatea dreaptă”, fiecare de 32 de biți. Cheia se deplaseaza la stânga cu un număr de biți și permutată, combinandu-se cu “partea dreaptă” si apoi cu “partea stângă”, rezultatul fiind noua “parte dreaptă”; vechea “parte dreaptă” devine noua “parte stângă” (vezi fig. 8).

Fig. 8. Manipularea cheii în algoritmul DES

Acest ciclu se repeta de 16 ori si dupa se realizeaza permutarea finală, fiind inversă permutării inițiale.

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, pentru combinarea unei secvențe de 32 biți cu cheia de 64 biți, aceste operații le denumim “permutare expandată” și “permutare aleasă” (fig. 9).

Fig. 9. Manipularea permutării în algoritmul DES

Fiecare ciclu conține practic patru operații separate. Prima dată partea dreaptă este expandată de la 32 la 48 biți, apoi fiind combinată cu o formă a cheii, ceea ce face ca rezultatul sa fie substituit și condensat în 32 biți, cei 32 biți fiind permutați și apoi combinați cu partea stângă pentru a realiz noua parte dreaptă (fig. 10).

Fig 10. Ciclul în algoritmul DES

Permutarea expandată este definită în tabelul ce urmează:

Tabelul 1. Definirea permutării expandate în DES

Împărțirea cheii este realizată cu două părți de 28 biți ce sunt deplasate la stânga cu un număr de biți, apoi reunite. Cei 48 de biți din 56 sunt permutați și în final se folosesc ca și cheie de 48 de biți de-a lungul ciclului.

Cheia unui singur ciclu este combinată printr-o funcție sau exclusiv cu “partea dreaptă” expandată, generându-se un rezultat ce este operat în 8 “cutii-S” și 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”.

Considerații asupra algoritmului DES

Codificarea și decodificarea unui mesaj se poate realiza usor cuu algoritmul DES, rezultatul devenind adevărat pentru ciclul j care se derivă din ciclul (j-1) astfel:

(1)

(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 :

(3)

și (4)

înlocuind (3) în (4) avem:

(5)

Ecuațiile (3) și (5) arată că aceleași valori pot fi obținute în cicluri ulterioare. Această proprietate face algoritmul DES reversibil.

Asadar codificarea și decodificarea unor date se poate realiza folosindu-se același algoritm, dar cu observația că la decodificare cheia se ia în ordine inversă.

Într-o implementare software nu apar probleme deosebite deoarece lungimea cheii de lucru dar și a operațiilor elementare pe care le folosește algoritmul sunt ușor de gestionat, singura problemă ar fi că, algoritmul este lent datorită modulului de lucru (cu secvențe de date, cu tabele). Pentru o implementare pe hardware(într-un cip), modul său de concepere este perfect, existând multiple variante de mașini hard de codificare.

1.4.2.3. Algoritmul AES

Deoarece DES devenise vulnerabil din cauza lungimii prea mici a cheii, NIST a recomandat utilizarea 3DES, un algoritm care constă în esență în aplicarea de trei ori a DES. Deși 3DES s-a dovedit a fi un algoritm puternic, el este relativ lent în implementările software, motiv pentru care NIST a lansat în 1997 o cerere de propuneri pentru un algoritm care să-l înlocuiască. S-a pornit de la 21 de propuneri acceptate inițial, apoi prin eliminări numărul lor a fost redus la 15, și apoi la 5, din care a fost ales în cele din urmă algoritmul propus de doi criptografi belgieni, Joan Daemen și Vincent Rijmen. La votarea finală, algoritmul, denumit de autorii săi Rijndael, a învins la vot patru alte propuneri, printre care și algoritmul RC6, propus de o echipă de criptografi.

Criteriile pe baza cărora au fost evaluate propunerile pentru AES au fost securitatea (rezistența la atacuri criptanalitice), costurile (eficiența computațională, complexitatea spațială, precum și licențierea liberă și gratuită) și particularitățile algoritmului (flexibilitatea, simplitatea, și ușurința de realizare a implementărilor atât software cât și hardware)

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

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 4×4 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 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;

– 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.

CAPITOLUL 2: REALIZAREA PRACTICĂ

2.1 DESCRIERE COMPONENTE

Arduino/Genuino Uno

Arduino/Genuino Uno este un microcontroler bazat pe ATmega328P având 14 pini digitali de intrare/ieșire(dintre care 6 pot fi utilizați ca ieșiri PWM), 6 intrări analogice, un cristal de cuarț de 16MHz, o conexiune USB, o mufă de alimentare, un ICSP și un buton de resetare.

Figura 2.1. Arduino/Genuino Uno

Placa Arduino/GENUINO Uno poate fi alimentată prin intermediul conexiunii USB sau cu o sursă de alimentare externă, sursa de energie fiind selectată automat. Alimentarea externă(Non-USB) poate veni fie de la un adaptor AC-DC sau de la o baterie. Placa poate opera pe o sursă externă de la 6 la 20 de volți(pentru o tensiune mai mică de 7 volți pinul 5V poate furniza mai puțin de 5 volți și astfel placa devenine instabilă). Dacă se utilizează o tensiune mai mare de 12 volți, regulatorul de tensiune se poate supraîncălzi și poate dauna plăcii astfel că intervalul de tensiune recomandat este între 7 volți și 12 volți.

Figura 2.2. Componentele plăcuței Arduino

Pinii de alimentare sunt aranjați astfel:

– Vin: tensiunea de intrare la placa Arduino/GENUINO atunci când se folosește o sursă de alimentare externă(diferită de 5 volți de la conexiunea USB sau altă sursă de energie reglementată);

– Pin 5V: acesta emite o tensiune de 5 volți reglementată de autoritatea de reglementare de pe placă, astfel încât aceasta să poată fi alimentată atât de la mufa de alimentare DC(7-12 volți) cât și de la acest pin;

– GND: pinul de împământare;

– IOREF: acest pin de pe placă oferă referința de tensiune cu care operează microcontrolerul. Un scut configurat corect poate citi tensiunea din pinul IOREF și selectează susrsa de alimentare corespunzătoare sau traductorii de tensiune pentru a lucra cu 5 sau 3.3 volți.

Figura 2.3. Specificații tehnice

ATmega328 are o memorie de 32KB(cu 0.5 KB ocupate de bootloader) și de asemenea, are o memorie de SRAM de 2 KB cât și o memorie EEPROM de 1 KB.

Fiecare dintre cei 14 pini digitali ai plăcuței pot fi utilizați atât ca intrare cât și ca ieșire folosind funcțiile pinMode(), digitalWrite() și digitalRead(). Pinii funcționează pe 5 volți, fiecare pin putând să furnizeze sau să primească 20mA și având un rezistor intern de 20-50 kohmi. Pentru a evita deteriorarea permanentă a microcontrolerului este indicat să nu se folosească un curent mai mare de 40mA în niciun pin de intrare sau ieșire. De asemenea fiecare pin are câte o funcție specializată: 0(RX) folosit pentru a primi date seriale și 1(TX) pentru a transmite date seriale, fiind conectați la USB-ul serial ATmega8U2; întreruperile externe 2 și 3 sunt configurate pentru a declanșa o întrerupere pe o valoare scazută sau o modificare a valorii; pinii 3, 5, 6, 9, 10 și 11 reprezintă adaptarea pe 8 Biți PWM a ieșirii funcției analogice analogWrite(); 10(SS), 11(MOSI), 12(MISO), 13(SCK) sunt pini de sprijin pentru comunicarea SPI; LED-ul 13 este aprins când codul PIN are valoare ridicată și stins atunci când codul PIN are valoare scăzută sau este oprit; pinii A4 sau SDA și A5 sau SCL reprezintă suportul de comunicare TWI folosind biblioteaca Wire. UNO are de asemenea 6 intrări analogice, etichetate de la A0 la A5, fiecare oferind 10 biți de rezoluție. Placa mai conține și alte tipuri de pini cum ar fi: AREF folosit cu funcția analogReference() pentru tensiunea de referință a intrărilor analogice, RESET folosit pentru resetarea microcontrolerului.

Arduino/GENUINO Uno are o serie de facilități pentru comunicarea cu un calculator sau cu un alt microcontroler, ATmega328 oferind pentru comunicare un UART TTL(5V) serial, disponibil pe pinii 0(RX) si 1(TX).

Figura 2.4. Caracteristicile fizice ale plăcuței

Software-ul Arduino include un monitor serial ce permite ca datele textuale simple să fie trimise de la și către plăcuța Arduino. Led-urile de pe placă, TX si RX, clipesc atunci când datele sunt transmise prin intermediul USB-ului și când este realizată conexiunea dintre USB și calculator. O bibliotecă SoftwareSerial permite comunicația serială pe oricare dintre pini digitali ai plăcuței. ATmega328 suportă o comunicare I2C ( DST) cât și SPI, soft-ul având inclusă și o librărie a firelor de comunicare pentru a simplifica transmisia.

Programarea plăcuței Arduino Uno se realizează cu ajutorul softer-ului Arduino. ATmega328 pe Arduino Uno este presetat cu un bootloader ce permite încărcarea codului nou utilizat în programarea externă a hard-ului. Acesta comunică folosind un protocol STK500 original, dar se pot programa aât bootloader-ul cât și microcontroler-ul cu ajutorul protocolului ICSP(In-Circuit Serial Programming). ATmega8U2 este încărcat cu un bootloader DFU, care poate fi activat prin conectarea jumper-ului pe partea din spate a plăcuței.

Figura 2.5 Software Arduino

Arduino Uno este proiectat astfel încât să fie evitată apăsarea butonului de reset înainte de o încărcare și folosirea reset-ului din software-ul ce rulează pe calculator. Una dintre liniile de control al debitului hardware(DTR) ale ATmega8U2 este conectat la linia de resetare a ATmega328 printr-un condensator de 100 nanofarazi. Soft-ul Arduino folosește această capacitate pentru a permite să se încarce codul prin simpla apăsare a butonului Upload din mediul Arduino. Aceasta înseamnă că bootloader-ul poate avea un timp de expirare mai mic, astfel încât scăderea DTR-ului să fie bine coordonată cu începerea încărcării.

Arduino Uno are o siguranță ce protejează USB-ul de fluctuațiile de curent. Deși cele mai multe calculatoare au propria lor protecție internă, siguranța oferă un strat suplimentar de protecție. Dacă este aplicat portului USB un curent mai mare de 500mA siguranța va rupe în mod automat conexiunea până la suprasarcină sau până când scurtul va fi eliminat.

Figura 2.6. Arduino Uno

Lungimea și lățimea maximă a plăcuței Arduino Uno este de aproximativ 7 respectiv 5 centimetri, cu conectorul USB și jack-ul de putere ce ar putea să depășească această dimensiune. În cazul în care se dorește, plăcuța conține trei șuruburi ce pot permite acesteia să fie atașată unei suprafete.

Figura 2.7. Dimensiunile plăcuței Arduino

MicroSD Card Adaptor v1.1

Figura 2.8. MicroSD Card Adaptor

Adaptorul de carduri Micro SD este potrivit pentru utilizarea în comunicarea cu plăcile Arduino printr-un protocol SPI disponibil. Acest tip de adaptor este format din:

– Interfața de control: conține un total de 6 pini(GND, VCC, MISO, MOSI, SCK, CS) GND fiind conectat la împământare, VCC reprezintă sursa de alimentare, MISO, MOSI, SCK reprezintă conexiunea de tip SPI, iar CS este pinul ce primește semnalul cod de la cip;

– Regulatorul de tensiune de 3.3V: este un cip de nivel de 3.3V și reprezintă alimentarea cardului Micro SD;

– Nivelul de conversie al circuitului: cardul Micro SD în direcția semnalului este convertit la 3.3V, la fel ca și interfețele acestuia ce controlează direcția semnalului MISO, iar AVR-ul microcontrolerului este sistemul ce poate citi semnalul;

– Conectorul cardului micro SD: reprezintă o punte în care este introdus cardul;

– Poziționarea găurilor: adaptorul conține 4 șuruburi M2 de diametru 2.2mm, poziționarea modulului fiind ușor de realizat pentru a obține o combinație între modulele adaptorului.

Figura 2.9. Componentele Adaptorului MicroSD

Interfața perifericelor seriale(SPI) reprezintă un protocol sincron de date seriale ce sunt folosite de microcontroler pentru a comunica rapid cu unul sau mai multe dispozitive periferice pe distanțe scurte. De asemenea, poate fi utilizat ca și comunicare între 2 microcontrolere. Într-o conexiune SPI există întotdeauna un dispozitiv master(de obicei, un microcontroler) ce controlează perifericele.

De obicei, există trei linii comune tuturor dispozitivelor:

– MISO (Master In Slave Out): linia slave ce trimite date la master;

– MOSI (Master Out Slave In): linia master ce trimite date la periferice;

– SCK (Serial Clock): reprezintă impulsurile de ceas care sincronizează transmiterea de date generate de către master.

De asemenea pentru fiecare dispozitiv există o linie specifică denumită SS (Slave Select) și reprezintă pinul de pe fiecare dispozitiv pe care master-ul o poate utiliza pentru a activa sau dezactiva dispozitivele specifice.

Figura 2.10. MicroSD Card

Cardurile SD pot lucra numai la 3.3V și atât puterea de intrare/ieșire cât și nivelele lor trebuie să fie reglate corect. Acest modul foloseste FETs pentru nivelele de deplasare și un regulator de 3.3 volți pentru putere, atunci când funcționează pe 5 volți. Un comutator permite modulului să fie utilizat cu Arduino rulând la 3.3 volți. Acest modul are, de asemenea, o priză MicroSD pe partea din spate și lucrează foarte bine cu biblioteca SdFAT, aceste carduri fiind formatate FAT32 și SD/HC.

Figura 2.11. MicroSD Card Adaptor

2.2 PSEUDOCOD EXPLICAT

#include <SPI.h> //include libraria pentru comunicatia SPI folosita de card

#include <SD.h> // include libraria de scrire / citire de pe card

#include <DES.h> // libraria pentru criptarea DES

#include "./printf.h"// librarie folosita de DES pentru a afisa in Serial Monitor anumite date

DES des; // declaralea criptarii

unsigned long ms;// timpul

File root; //fisier dupa card

File myFile; // fisier dupa card

void setup() // functia de start pentru arduino executata o singura data

{

Serial.begin(9600); // deschiderea serialului pe o viteza de 9600 bit

printf_begin();// afisare des start

des.init("012345677654321001234567\0",(unsigned long long int)0);

Serial.print("Initializing SD card…");

// On the Ethernet Shield, CS is pin 4. It's set as an output by default.

// Note that even if it's not used as the CS pin, the hardware SS pin

// (10 on most Arduino boards, 53 on the Mega) must be left as an output

// or the SD library functions will not work.

pinMode(10, OUTPUT);

// iniatializare card

if (!SD.begin(4)) {

Serial.println("initialization failed!");

return;

}

Serial.println("initialization done.");

}

String content = "";

void loop() // arduino functia loop executata repetitive la infinit

{

content = Serial.readString(); // citirea unui string din serial

if(content != "") // daca acesta detecteaza ceva scris va active functia “Do something” cu stringul primit din serial ( in cazul nostru trimis de programul creat in visual studio)

{

Serial.println(content);

DoSomthing(content);

}

}

void DoSomthing(String WhatToDo)

{

String Files = WhatToDo.substring(0,5); // taierea stringului la fix 5 caractere

if(WhatToDo == "FileList") // pentru comanda FileList se vor afisa toate fisierele din card

{

root = SD.open("/");

printDirectory(root, 0);

Serial.println("done!");

content = "";

}

if(Files == "Read:") // citirea unui fisier

{

ReadFile(WhatToDo.substring(5));

}

}

void printDirectory(File dir, int numTabs) {

while(true) {

File entry = dir.openNextFile();

if (! entry) {

// no more files

break;

}

for (uint8_t i=0; i<numTabs; i++) {

Serial.print('\t');

}

Serial.print(entry.name());

if (entry.isDirectory()) {

Serial.println("/");

printDirectory(entry, numTabs+1);

} else {

// files have sizes, directories do not

Serial.print("\t\t");

Serial.println(entry.size(), DEC);

}

entry.close();

}

}

void ReadFile(String FileName) // citirea fisierului

{

char fileNameCharArray[10];

FileName.toCharArray(fileNameCharArray, 10);

File dataFile = SD.open(fileNameCharArray);

Serial.println(fileNameCharArray);

if (dataFile) {

Serial.println("FileName:");

// read from the file until there's nothing else in it:

while (dataFile.available()) {

Cripteaza(dataFile.readString());

}

// close the file:

dataFile.close();

} else {

// if the file didn't open, print an error:

Serial.println("error opening");

}

}

void Cripteaza(String message) // criptarea continutului unui fisier ales

{

ms = micros();

des.iv_inc();

// String message = "Hello World";

byte plaintext[message.length()+1];

message.getBytes(plaintext, message.length() +1);

des.calc_size_n_pad(sizeof(plaintext));

byte plaintext_p[des.get_size()];

des.padPlaintext(plaintext,plaintext_p);

byte cyphertext[des.get_size()];

des.tdesCbcEncipher(plaintext_p,cyphertext);

printf(" Encryption took %lu micros\n",(micros() – ms));

ms = micros();

des.calc_size_n_pad(sizeof(cyphertext));

des.tdesCbcDecipher(cyphertext,plaintext_p);

bool ok = des.CheckPad(plaintext_p,sizeof(plaintext_p));

if (ok)

printf("padding ok!");

else

printf("padding corrupted!");

printf(" Decryption took %lu micros",(micros() – ms));

delay(2000);

}

CONCLUZII

BIBLIOGRAFIE

ANEXE

Anexa 1

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace Arduino_Criptare

{

public partial class Cript : Form

{

public Cript()

{

InitializeComponent();

}

private string in_data; //variabila string in care stocam datele primate de la arduino

void Arduino_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) // functie de citire date seriale din arduino

{

in_data = Arduino.ReadLine(); // citirea liniilor din arduino

this.Invoke(new EventHandler(Display_data));// daca apare date citite se face invoke catre fucunctia Display_data

}

private void Display_data(object sender, EventArgs e)

{

richTextBox1.Text += in_data; // adaugarea informatiilor in formul richTextbox1

}

private void button1_Click(object sender, EventArgs e)

{

Arduino.Write("FileList"); //aceasta functie apratie butonului filelist care trimite comanda “FileList” catre ardunio, unde se interpreteaza si returneaza toate numele fisierelor existente pe card

}

private void button2_Click(object sender, EventArgs e)

{

// functie pentru criptare aceasta trimite textul “Read:” unde arduino va sti ca trebuie sa citeasca numele fisierului dupa “:”

String File;

File = "Read:" + textBox1.Text;

Arduino.Write(File);

}

private void button4_Click(object sender, EventArgs e)

{

//functia de conectare serial

Try // incercarea de a se conecta

{

Arduino.PortName = textBox2.Text; // portul scris in Textbox

Arduino.Open(); // deschiderea portului

Arduino.DataReceived += Arduino_DataReceived; // specificarea functiei de receptarea date

if (Arduino.IsOpen) // afisarea daca arduino s-a conectat

{

label3.Text = "Conectat";

label3.ForeColor = Color.Green;

}

}

Catch // acest catch a fost pus pentru in cazul in care nu s-a conectat, va afisa un mesaj de erroare

{

MessageBox.Show("Nu s-a putut cunecta! Verificati portul!");

}

}

}

}

Anexa 2

Similar Posts