Retelele de Calculatoare

Introducere

Domeniul și contextul temei

O data cu extinderea domeniilor de aplicare a calculatoarelor, a crescut si numărul utilizatorilor ce doreau să aibă acces la mijloace eficiente de prelucrare si stocare a unor informații comune. Echipamentele care se pot conecta la o retea s-a diversificat foarte mult in ultimi anii. Intr-o retea de comunicati pot face parte calculatoare, laptopuri, imprimante, telefoane, PDA-uri …..

Colectarea, prelucrarea si distribuția informației sunt elemente de baza care indruma dezvoltarea tehnologică din ziua de azi , făcând ca cele mai multe domeni sa se imbine intr-un tot unitar. Instituți cu sute de birouri raspandite pe o larga suprafață geografică sa-și poate examina echipamentele de la distanță printr-o apasare de buton.O rețea de calculatoare reprezintă rezolvarea problemei de conectare prin intermediul unor medii de comunicație.

Un alt aspect important a fi acela de fiabilitate mare. Datele vor putea fii stocate pe mai multe masini in acelasi timp. In cazul defectarii unor componente singulare reteaua trebuie sa fie in continuare disponibila. Funcțiile componentelor defecte sunt preluate de alte componente.

Fig.1 Retea de calculatoare si resurse partajate [1]

Pentru a se putea efectua acest schimb de date, utilizatorii trebuie sa fie interconectați prin intermediul unei retele. Deci problema securitații sistemelor IT se confrunta cu problema securitații rețelelor de calculatoare. Importanța aspectelor de securitate in rețelele de calculatoare a crescut odata cu extinderea prelucrarilor electronice de date si a transmiterii acestora prin intermediul rețelelor. In cazul operarii asupra unor informații confidențiale, este important ca avantajele de partajare si comunicare aduse de rețelele de calculatoare sa fie susținute de facilitați de securitate substanțiale. Acest aspect este esențial in condițile in care rețelele de calculatoare au ajuns sa fie folosite inclusiv pentru realizarea de operațiuni bancare, cumpăraturi sau plata unor taxe.

Fig.2 Necesitatea securități informaților [1]

În urma implementării unor mecanisme de securitate într-o rețea de calculatoare, informațiile nu vor putea fi accesate sau interceptate de persoane neautorizate și se va împiedica falsificarea informațiilor transmise sau utilizarea clandestină a anumitor servicii destinate unor categorii specifice de utilizatori ai rețelelor.

Pentru asigurarea securitătii rețelei este importantă implementarea unor mecanisme specifice pornind de la nivelul fizic (protecția fizică a liniilor de transmisie ), continuând cu proceduri de blocare a accesului la nivelul rețelei (firewall), până la aplicarea unor tehnici de criptare a datelor, metodă specifică pentru protecția comunicării între procesele de tip aplicație care rulează pe diverse calculatoare din rețea.

Capitolul I

I.1 Noțiuni teoretice despre retelele de calculatoare

Rețelele de calculatoare permit accesarea unor baze informaționale cu localizări geografice diverse si constituie un mediu de comunicare între persoanele aflate la distanță. Într-o instituție cu mai multe compartimente, instalarea unei rețele de calculatoare faciliteazã schimbul si corelarea informațiilor (între diverse departamente sau în cadrul aceluiași departament). Importanța rețelelor de calculatoare ca medii de comunicare va creste tot mai mult în viitor.

Rețelele de calculatoare asigură partajarea resurselor de calcul fizice si logice, astfel încât programele, echipamentele si mai ales datele să fie disponibile pentru orice utilizator conectat la rețea, indiferent de localizarea lui. Această facilitate este foarte importantă în cadrul unei firme fiindcă permite, de exemplu, mai multor persoane aflate în puncte geografice diferite, să întocmească împreună un raport. O schimbare efectuată de un angajat într-un document poate fi vizibilă instantaneu si celorlalți angajati. Astfel, colaborarea dintre grupuri de oameni aflați la distantă devine foarte simplă.

Fig.3 Comunicarea prin rețele de calculatoare [1]

Rețelele asigură o fiabilitate mare prin accesul la mai multe echipamente de stocare alternative (de exemplu, fișierele pot fi copiate pe două sau trei calculatoare astfel încât, dacă unul din ele nu este disponibil, să fie utilizate copiile fisierelor). Dacă un procesor se defectează, sarcina sa poate fi preluată de celelalte, astfel încât activitatea să nu fie întreruptă ci dusă la bun sfârșit, chiar dacă cu performanțe reduse. Acest lucru este esențial pentru activități strategice din domeniile militar, bancar, controlul traficului aerian, siguranța reactoarelor nucleare etc.

O rețea de calculatoare poate să se dezvolte în etape succesive, prin adăugare de noi procesoare: pe măsură ce se face simțită această necesitate, se pot introduce noi calculatoare server sau client. Prin comparație, performanțele sistemelor de calcul mari, centralizate, nu se pot îmbunătăți decât prin înlocuirea cu un sistem mai mare, operație care produce neplăceri utilizatorilor si implică costuri mari.

Fig.4 Rețea client-server [1]

Noile aplicații de acces la Internet sunt extrem de prietenoase, astfel încât încep să fie utilizate nu numai în sferele de cercetare, industriale sau comerciale, în care aduc o îmbunătățire calitativă a proceselor de prelucrare si transmitere a informației, ci si de către publicul larg, pentru care se deschide astfel accesul la Internet.

Aceste facilități se referă la:

accesul la baze informaționale aflate la distanță

comunicare între persoanele conectate la o rețea de calculatoare

divertisment interactiv.

1. Prin intermediul rețelelor de calculatoare se pot accesa informații de natură diversă cea mai eficientă modalitate de consultare a informațiilor din domenii diverse este sistemul World Wide Web. Aceste informații aparțin unor domenii foarte variate: artă, afaceri, politică, sănătate, istorie, recreere, știință, sport, călătorii, hobby-uri etc.

2. Posta electronică sau e-mail-ul este un sistem de comunicare electronic bazat pe mesaje scrise, care se adaugă astăzi la mijlocul clasic de comunicare verbală, prin intermediul telefonului. Mesajele electronice contin deja în mod curent secvente audio si video.

3. Divertismentul reprezintă la ora actuală o industrie în plină dezvoltare, în care se dezvoltă noi tehnologii. Aplicația cu cel mai mare succes până acum este video-ul la cerere, prin care se va putea selecta orice film sau program de televiziune iar acesta să apară imediat pe ecran.

Fig.5 Beneficile rețelelelor de calculatoare [1]

I.2. Clasificarea rețelelor de calculatoare

Clasificarea rețelelor trebuie să ia in considerare doua aspecte foarte importante: tehnologia de transmisie și scara la care opereaza rețeaua.

Din punct de vedere al tehnologiei de transmisie, rețelele sunt de doua feluri:

1. Rețele cu difuzare:

un singur canal de comunicație este partajat de toate mașinile din retea

comunicația se realizeaza prin intermediul unor mesaje scurte, numite pachete

2. Rețele punct-la-punct

dispun de numeroase conexiuni intre perechile de mașini individuale ce formeaza

Rețeaua pentru a ajunge la destinație, un pachet de date trebuie sa treaca prin mai multe mașini intermediare, fiind nevoie de algoritmi pentru dirijarea pachetelor pe un drum optim este un model folosit pentru rețelele mari, in timp ce difuzarea se folosește pentru rețelele mici

Fig.6 Rețele din punct de vedere al transmisiei [1]

I.3. Protocoale, modele de referință

Pentru o comunicare cu succes intre calculatoarele dintr-o retea, trebuiesc stabilite anumite protocoale. Prin protocol intelegem un set de reguli si convenții stabilite intre participanții la o activitate comună. Deoarece protocoalele utilizate in cadrul retelor s-au dovedit a fi deosebit de complexe, s-a hotarât proiectarea lor pe niveluri sau straturi. Fiecare nivel defineste anumite servicii si eventual anumite protocoale corespunzatoare acelor servicii. Astfel rezulta modele de referinta pentru protocoale. Modele de referinta OSI si TCP/IP care vor fi descrise pe scurt in continuare.

Modelul de referință OSI: permite vizualizarea traseului parcurs de informații sau pachete de date, de la un program de aplicații la un alt program de aplicații localizat într-un alt computer din rețea, chiar dacă expeditorul și destinatarul fac parte din rețele cu topologii diferite.

Acest model este conceput ca având șapte straturi (sau niveluri), fiecare având funcții specifice, realizând împreună comunicarea în rețea. Această separare a funcțiilor într-o rețea se numeste stratificare (layering). Proiectarea arhitecturii pe nivele determină extinderea sau îmbunătățirea facilă a sistemului. De exemplu, schimbarea mediului de comunicație nu determină decât modificarea nivelului fizic, lăsând intacte celelalte nivele.

Fig.7 Nivelurile modelului OSI

Descrierea celor 7 nivele ale modelului OSI

Nivelul Aplicație : toate programele care utilizeaza comunicarea prin rețea fac parte din acest nivel. Exemplele de aplicații de rețea includ clienții si serverele de poșta electronică (e-mail), clienții si serverele de http (web), bazele de date etc.

Nivelul Prezentare : nivelul prezentare reunește funcții folosite in mod repetat in comunicațiile in rețea. Acest nivel se ocupa de formatarea si codificarea datelor

Nivelul Sesiune : Se ocupa de stabilirea,mentinerea si terminarea sesiunilor. Acest nivel gestioneaza detalii precum: nume de cont, parole si autorizarea utilizatorilor.

Nivelul Transport : nivelul transport asigura livrarea in siguranta (sau nu) a datelor intre doua calculatoare gazda (host).

Nivelul Retea : nivelul retea asigura livrarea pachetelor si alegerea optima a cailor de transmitere (rutarea – routing). Ca atare, nivelul retea trebuie sa gestioneze traficul in retea.

Nivelul Legaturii de date (Data Link) : nivelul legaturii de date asigura partiționarea unitaților de informatie si verificarea erorilor. Placa de retea reprezinta nivelul legaturii de date a unui calculator.

Nivelul Fizic : nivelul fizic asigura transmiterea biților prin canalul de comunicație. Ca atare, liniile de transmisie din retea – cablurile care conecteaza toate calculatoarele din retea – fac parte din nivelul fizic.[3,4,7 ]

Modelul TCP/IP: deși modelul de referință OSI a fost creat pentru asigurarea interoperabilității echipamentelor de rețea, modelul TCP/IP a fost conceput pentru a oferi o referință pentru dezvoltarea de protocoale compatibile. Protocolul TCP/IP are avantajul că nu depinde de configurația hardware, de mediile de transmisie, și este suportat de majoritatea sistemelor de operare.

Fig.8 Comparație intre modelul OSI și TCP/IP

Descriere celor 4 nivele ale modelului TCP/IP

Nivelul Aplicație: Proiectanții TCP/IP au considerat că protocoalele de nivel superior trebuie să includă detaliile nivelurilor prezentării și sesiunii ale modelului OSI. Au creat un nivel aplicație care manevreaza protocoalele de nivel superior, problemele de reprezentare, codificările și controlul dialogurilor.

Nivelul transport al modelului TCP/IP administrează transmisia de date de la un computer la altul, asigurând calitatea serviciului de comunicare, siguranța liniei de transport, controlul fluxului și detecția și corecția erorilor.

Inițial nivelul rețea trebuia să asigure rutarea pachetelor în interiorul unei singure rețele. Cu timpul a apărut posibilitatea interconexiunii între rețele, astfel încât acestui nivel i-au fost adăugate funcționalități de comunicare între o rețea sursă și o rețea destinație.

Nivelul Acces rețea: Pe acest nivel sunt definite Standardele și tehnologiile Ethernet IEEE 802.3, precum CSMA/CD și 10BASE-T. Acest strat se ocupă cu toate serviciile pe care le necesită un pachet IP pentru a realiza o legatură fizică, incluzând și detalii legate de tehnologiile LAN și WAN, de medii de transmisie, adică ceea ce fac nivelurile OSI Legătură de date și Fizic. [3,6,7]

I.4. Modelul client-server

In general, un server este o aplicatie care ofera servicii utilizatorilor internetului; un client este o alta aplicatie care solicita un serviciu.

Exista aplicatii alcatuite atât dintr-o parte client cât si dintr-o parte server, care pot rula pe același sistem sau pe sisteme diferite. Utilizatorii invoca partea client a aplicatiei, care efectueaza o cerere referitoare la un serviciu pe care o trimite partii de server a aplicatiei folosind protocolul TCP/IP pe post de vehicul de transport.

Clientul, de obicei, rulează pe calculatorul utilizatorului și este folosit pentru a accesa informații sau alte aplicații din cadrul rețelei si are actiuni tipice:

emite cereri si receptioneaza datele cerute

afiseaza datele receptionate

Fig.9. Retea cu doi clienti si un server

Serverul este un program care primeste o cerere, indeplineste serviciul cerut si transmite rezultatul drept raspuns. Un server poate rezolva, de regula, mai multe cereri (deservi mai multi clienti) in acelasi timp.

Fig.10. Modelul client-server

Clientul și serverul se pot găsi în același nod, când se utilizează mecanisme de comunicație locală sau în noduri diferite, când se utilizează mecanisme de comunicație în rețea.[3,5,6]

Capitolul II

II.1 Securitatea rețelei

Securitatea rețelelor de calculatoare este în acest moment parte integrantă a domeniului rețelelor de calculatoare și ea implică protocoale, tehnologii, sisteme, instrumente și tehnici pentru a securiza și opri atacurile rău intenționate.
Problemele securitati retelelor se poate imparti in urmatoarele domeni :

Confidențialitatea se referă la accesul la informație doar pentru utilizatori autorizați

Integritatea se referă la asigurarea consistenței informațiilor

Autentificarea asigurã determinarea identitãtii persoanei cu care se comunicã

Ne-repudierea se referă la autenticitatea unor mesaje sau comenzi.

Pentru asigurarea securității rețelei este importantă implementarea unor mecanisme specifice pornind de la nivelul fizic (protecția fizică a liniilor de transmisie ), continuând cu proceduri de blocare a accesului la nivelul rețelei (firewall), până la aplicarea unor tehnici de criptare a datelor, metodă specifică pentru protecția comunicării între procesele de tip aplicație care rulează pe diverse calculatoare din rețea.

Fig.11. Blocarea accesului cu ajutorul unui firewall [1]

Împiedicarea interceptării fizice este în general costisitoare și dificilă. De aceea, se preferă implementarea unor mecanisme de asigurare a securitătii la nivel logic, prin tehnici de codificare/criptare a datelor transmise care urmăresc transformarea mesajelor astfel încât să fie înțelese numai de destinatar; aceste tehnici devin mijlocul principal de protecție a rețelelor.

La nivelul legaturilor de date, pachetele transmise pot fii codificate la parasirea unui calculator si decodificate cand ajug la destinatie Acest lucru se poate realiza la nivelul legaturilor de date fara ca nivelurile superioare sa stie ce se petrece. Cu toate acestea cand pachetele de date traverseaza mai multe rutere, ele devin vulnerabile la atacurile din interiorul ruterelor putand fii decodificate in interiorul fiecarui ruter. Aceasta metoda este denumita criptarea legaturii fiind usor de adaugat si utila.

Fig.12. Criptare la nivelul legaturilor de date [1]

La nivelul rețea se pot instala ziduri de protecție (firewalls) pentru a pastra pachetele in interior sau in exteriorul acestuia.

La nivelul transport conexiuni intregi pot fii criptate de la un capat la celalant, sau de la un proces la altul.

Aceste soluți ajuta doar la realizarea confidentialitați dar nu solutioneaza problema autenticitați sau a ne-repudieri intr-un mod suficient de general.

Pentru asigurarea confidentialitati datelor acestea sunt criptate cu ajutorul unui algoritm, generanduse un text cifrat, receptorul autorizat poate recupera textul clar aplicand acelasi algoritm asupra textului cifrat. Emițatorul transforma textul clar in text cifrat prin criptare, iar receptorul obținand textul clar din text cifrat prin decriptare. [2]

II.2. Elemente de criptografie traditionala

Dorința de ascundere a informatilor și de a comunica codificat este una din preocuparile umane mergând chiar cu mii de ani in urmă. Cele mai cunoscute categorii de oameni care au contribuit la dezvoltarea criptografiei au fost : indrăgostiți, corpul diplomaților, persoanele care țineau jurnale și cel mai important dintre ele, cu cel mai mare aport adus criptografiei este armata.

Mesajele ce trebuiesc criptate, cunoscute si sub numele de text clar (plain text) sunt transformate printr-o funcție dependenta de o cheie (key) . Rezultatul procesului de criptare este denumit text cifrat (cyphertext. În acest caz avem de-a face cu un intrus pasiv. În cazul in care intrusul nu numai ca ascultă canalu de comunicație ci să si inregistreze mesajele și să le retransmita mai tarziu, sau chiar sa modifice conținutul înainte ca acestea să fie preluate de catre receptor, in acest caz intrusul se numește intrus activ.

Domeniul care se ocupa cu conceperea cifrurilor se numește criptografie (cryptography), iar spargerea cifrurilor se numeste criptanaliză (cryptanalysis). Împreună sunt cunoscute sub numele de criptologie (cryptology). Încercarea de formalizare matematica a proceselor de criptare si decriptare se utilizează urmatoarele notați: S – textul clar, CK – funcția de criptare, dependenta de cheia K, R – codul rezultat, DK – funcția de decriptare. Criptarea este exprimata prin formula: R = CK(S), iar decriptarea S = DK(R). Se observa ca DK(CK(S)) = S.

Fig.13. Model de criptare

O regula fundamentala a criptografiei este aceea că trebuie presupusa cunoașterea de catre orice criptanalist a metodei generale utilizate pentru criptare. Cel mai important element devine cheia de criptare, chiar mai mult ea trebuie facută publică. Cheia constă intr-un șir de caractere care definește / selectează una sau mai multe criptari potentiale. Lungimea cheii este foarte importantă, cu cât cheia este mai lunga , cu atât elementele ei sunt mai greu de determinat. Pentru o secvența de 6 cifre ar trebui parcurse 1 milion de posibilitați. Dacă cheia ar conține si litere, numarul de alternative ar crește fiindcă in alfabet sunt 26 de litere. Cu cat cheia este mai lunga cu atât este mai mare volumul de muncă cu care are de-a face criptanalistul

Când un criptanalist trebuie să decodifice un text, el se confrunta cu una din urmatoarele probleme:

problema textului cifrat, când are la dispozitie o cantitate de text cifrat si nici un fel de text sursă;

problema textului sursă cunoscut, când are la dispozitie un text sursă si textul cifrat corespunzător;

problema textului sursă ales , dacă poate cripta la alegere zone din textul sursă (poate afla criptarea unui anumit text).

In unele situați, criptanalistul poate ghici părți din textul sursă. Novicii in domeniul criptografiei presupun adeseori că dacă un cifru poate rezista unui atac ,, ciphertext only” el este sigur. Inițierea unei sesiuni de lucru intr-un sistem multiutilizator va conține uzual cuvantul ,,LOGIN”. Pentru a asigura securitatea, criptograful trebuie să se asigure că metoda propusă este sigură, chiar dacă inamicul său poate cripta cantități arbitrare de text ales.

In continuare vom studia pe scurt cele două metode de criptare cunoscute din istoria criptografiei: cifruri cu substituție și cifruri cu transpoziție. Aceste tehnici de baza sunt folosite, in forme evoluate, și in sistemele moderne de cripta

II.3 Cifrurile cu substitutie

Cifrul de substituție este cifrul bloc la care fiecare caracter sau grup de caractere ale textului clar este substituit cu un alt caracter sau grup de caractere in textul cifrat, descifrarea făcandu-se prin aplicarea substituției inverse asupra textului cifrat.

În criptografia clasică există patru tipuri de cifruri de substituție:

1. Cifruri de substituție monoalfabetică sunt cifrurile în care fiecare caracter al textului în clar este înlocuit cu un caracter corespondent în textul cifrat. Vom aminti câteva dintre cifrurile de substituție cele mai cunoscute:

Cifrul lui Ceasar

Cifrul lui Polybius

Fig.14. Model de substituție

2. Cifruri de substituție omofonică (homophonic substitution ciphers) sunt cifrurile de substituție în care un caracter al alfabetului mesajului în clar (alfabet primar) poate să aibă mai multe reprezentări.

3. Cifruri de substituție poligramică (polygram substitution ciphers) se obțin substituind blocuri de caractere ale alfabetului primar – numite poligrame – cu alte blocuri de caractere.

4. Cifruri de substituție polialfabetice sunt formate din mai multe cifruri de substituție simple. Au fost inventate de Leon Battista, în 1568. Cele mai cunoscute sunt ale lui Trithemius și Vigenere

II.3 Cifrurile cu transpozitie

Cifrarea prin transpoziție este o transformare a textului clar prin care se modifică poziția caracterelor în mesaj.O metodă des folosită pentru implementarea acestui tip de transformare este scrierea mesajului într-o anumită matrice după care textul cifrat se obține prin citirea caracterelor pe linie, pe coloană sau după un anumit traseu în matrice.

Cele mai simple transpoziții se obțin prin împărțirea textului clar în două jumătăți care se scriu una sub alta, după care se citesc coloanele de la stânga la dreapta.

O simpla transpoziție permite păstrarea proprietăților statice ale textului in clar si in textul cifrat,o nouă transpoziție a textului cifrat mareste securitatea cifrului.

Fig.15 Cifru cu transpoziție

Spargerea unui cifru cu transpoziție începe cu verificarea dacă acesta este într-adevăr de acest tip prin calcularea frecvenței literelor și compararea acestora cu statisticile cunoscute. Dacă aceste valori coincid, se deduce că fiecare literă este "ea însăși", deci este vorba de un cifru cu transpoziție.Următorul pas este emiterea unei presupuneri în legătură cu numărul de coloane. Acesta se poate deduce pe baza unui cuvânt sau expresii ghicite ca făcând parte din text. Considerând sintagma "să prezinte", cu grupurile de litere (luate pe coloane) "si", "ăn", "pt", "re", se poate deduce numărul de litere care le separă, deci numărul de coloane.

II.4 Cheie acoperitoare

Problema construirii unui cifru imposibil de spart ia preocupat îndelung pe criptanaliști; ei au dat o rezolvare teoretică simplă încă de acum câteva decenii dar metoda nu s-a dovedit fiabilă din punct de vedere practic, dupã cum se va vedea în continuare.

Tehnica propusă presupune alegerea unui șir aleator de biți pe post de cheie si aducerea textului sursă în forma unei succesiuni de biți prin înlocuirea fiecărui caracter cu codul său ASCII. Apoi se aplică o operație logică – de tip Sau exclusiv. Textul cifrat rezultat nu poate fi spart pentru că nu există indicii asupra textului sursă si nici textul cifrat nu oferă criptanalistului informații. Pentru un esantion de text cifrat suficient de mare, orice literă sau grup de litere va apărea la fel de des.

Fig.16. Criptare folosind operația logică sau exclusiv

Acest procedeu este cunoscut sub numele de metoda cheilor acoperitoare. Deși este perfectă din punct de vedere teoretic, metoda are, din păcate, câteva dezavantaje practice:

cheia nu poate fi memorată, astfel încât transmițătorul si receptorul să poarte câte o copie scrisă a ei fiindcă în caz că ar fi "capturati", adversarul ar obtine cheia;

cantitatea totală de date care poate fi transmisă este determinată de dimensiunea cheii disponibile;

o nesincronizare a transmițătorului si receptorului care generează o pierdere sau o inserare de caractere poate compromite întreaga transmisie fiindcă toate datele ulterioare incidentului vor apărea ca eronate.

II.5 Două principii criptografice fundamentale

În paginile ce vor urma vom studia diferite sisteme criptografice, pentru toate acestea există două principii de bază a caror intelegere este importantă.

Primul principiu este acela ca toate mesajele criptate trebuie sa conțină informație ce nu este necesara pentru ințelegerea mesajului.

La prima vedere sistemul pare sigur, intr-un anumit sens, chiar este, deoarece intrușii pasivi nu pot decripta mesajele. Dar exista o slabiciune a acestui sistem, care il face de neutralizat. Să presupunem ca o functionară recent concediata vrea sa se razbune pentru ca a fost concediată. Chiar inainte de a pleca, ea sustrage lista clienților. Ea lucreaza in timpul nopții si scrie un program care generează comenzi fictive folosind nume de clienți reali. Deoarece nu poseda lista cheilor, ea pune numere aleatorii in ultimii 3 octeti si trimite sute de comenzi.

Principiul criptografic numarul unu este că toate mesajele să conțină informație redundantă pentru a impiedica intrusii activi să inșele receptorul trimițându-i mesaje false. Aceeasi redundanță facilitează intrușilor pasivi spargerea sistemului. Mai mult decât atât, redundanța nu trebuie niciodata să fie folosită sub forma an zerouri la inceputul sau sfarsitul unui mesaj, deoarece trecerea unor astfel de mesaje prin anumiți algoritmi criptografici dă rezultate predictibile, simplificând criptanaliza. Un sir aleatoriu de cuvinte englezesti ar fi o alegere mult mai buna pentru redundanță.

Al doilea principiu criptografic este acela că trebuie luate măsuri pentru a impiedica intrușii activi sa retransmită mesaje mai vechi. O astfel de masura este de a include in fiecare mesaj o amprentă de timp validă doar pentru, 5 minute. Receptorul trebuie doar sa pastreze mesajele primite in ultimele 5 minute, pentru a compara mesajele nou sosite cu anterioarele si pentru a filtra duplicatele. Mesajele mai vechi de 5 minute pot fi aruncate, deoarece orice raspuns trimis mai tarziu de 5 minute va fi refuzat ca fiind prea vechi. Pe parcurs vom studia și alte măsuri in afara amprentelor de timp. [10]

II.6 Algoritmi cu cheie secretă

În criptografia moderna, o cheie este aleasă între participanți și este folosită pentru criptarea și decriptarea mesajelor. Criptografia cu chei secrete se mai numește criptografie simetrică. Criptografia cu chei secrete se folosesc de mii de ani într-o varietate de forme. Implementările moderne iau de obicei forma unui algoritm care se execută în hardware, firmware sau software.Majoritatea de astfel de criptosisteme se bazează pe operații simple cum ar fi permutări și transpoziții, dar este extrem de dificil să se creeze un sistem rezistent la atacuri, în ciuda faptului că istoria eșecurilor este lungă și bogată.

Exemple de sisteme de criptografie cu chei secrete utilizate pe scară largă în lume sunt: AES2, DES3, triple DES, IDEA4, RC2, RC4, RC55.

Fig.17. Algoritm cu cheie secretă

Cheia secreta constituie punctul vulnerabil al sistemului deoarece odată aflată, securitatea tuturor informaților transmise este compromisă. Criptanalistul aplică funcția inversă pentru deducerea secvenței originale

După tipul algoritmului folosit, criptosistemele cu chei simetrice se clasifică în două categorii:

-cu cifruri bloc (block ciphers) sunt cifrurile care acționează asupra unei diviziuni a textului în clar; blocurile de la intrare se cifrează independent. Transformările de bază folosite pentru criptare și decriptare sunt substituțiile și transpozițiile, repetate iterativ.

cu cifruri secvențiale (stream ciphers): mesajul de la intrare este considerat ca o succesiune (șir) de simboluri. Criptarea operează asupra textului în clar simbol cu simbol.

Fig.18 Criptosisteme cu chei simetrice

Capitolul III

III.1 Algoritmi de criptare, DES Standard pentru criptarea datelor

Algoritmul DES 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; să fie complet specificat și simplu de înțeles; să fie disponibil tuturor utilizatorilor; să fie adaptabil pentru diverse aplicații; să fie implementabil pe dispozitivele electronice; să fie eficient în utilizare; să poată fi validat; să fie exportabil.

Fig.19. Cifrul DES schema generala

Caracteristicii ale algoritmului DES:

lungimea unui bloc este de 64 de biți;

cheia este pe 64 de biți dintre care 8 sunt biți de paritate;

flexibilitatea implementării și utilizării în diferite aplicații;

fiecare bloc cifrat este independent de celelalte;

nu este necesară sincronizarea între operațiile de criptare/decriptare ale unui bloc;

pentru creșterea securității se poate aplica algoritmul T-DES (triplu DES) care constă în iterarea de trei ori a algoritmului DES.

Înainte de a fi adoptat ca standard, DES a fost subiectul unor critici intense în ceea ce privește dimensiunea cheii redusă și a criteriilor de design clasificate. Analiza din ultimii ani a demonstrat că în ciuda acestei controverse, DES este bine proiectat. DES se poate sparge teoretic folosind criptanaliză diferențială sau liniară dar în practică e mai greu să se realizeze acest lucru.

Fig.20. Intrare/Iesire DES [1]

Algoritmul DES este o combinație complexă folosind două blocuri fundamentale în criptografie: substituția și permutarea. 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.

Funcția constă din 4 pași, parcurși in secvență:

Expansiune: jumatatea de bloc de 32 de biti este extinsa la 48 de biti folosind functia de expansiune, notata E in diagrama, prin duplicarea unor biti.

Amestecare rezultatul este combinat cu o subcheie folosind operatia XOR. saisprezece subchei de 48 de biti una pentru fiecare runda sunt derivate din cheia principala folosinddiversificarea cheilor (descrisa mai jos).

Substitutie dupa amestecarea cu subcheia, blocul este divizat in opt bucăți de 6 biți fiecare inainte de procesarea folosind cutiilor S. Fiecare din cele opt cutii S inlocuiește cei șase biți de intrare cu patru biți conform unei transformari neliniare, oferita sub forma unui tabel de cautare. Cutiile S reprezinta securitatea lui DES fara ele, cifrul ar fi liniar si usor de spart.

III.1.1 Moduri de utilizare ale DES – ului

Sistemul de criptare DES poate opera in principal in doua moduri, care au fost extinse si la alte sisteme

Modul cu carte de coduri electronic (ECB ) : cu toate ca este atat de complex DES este la baza un cifru cu substituție mono alfabetica , folosind caractere pe 64 de biți. Ori de cate ori se cifrează același bloc de text clar, la iesire se va obține același bloc de text cifrat. Aceasta proprietate a DES-ului poate fii folosită de un criptanalist pentru a-l sparge. Modul ECB este cel mai simplu și cel mai uzual și presupune codificarea independentă a fiecărui bloc Bi al mesajului clar într-un bloc cifrat Ci de aceeași mărime, folosind chei diferite Ki pentru fiecare pas.

Fig.21. Codificare pe blocuri de tip ECB

Dezavantaje : mesaje in clar identice produc mesaje criptate identice, metoda nu este sigură pentru secvențe lungi de date. Un atacator poate schimba de asemenea ordinea blocurilor criptate. Pentru a para un astfel de atac, DES si toate cifrarile bloc trebuiesc înlanțuite in diferite moduri astfel încât înlocuirea unui bloc să conducă la situația in care textul clar decriptat începând cu blocul înlocuit să fie cosiderat ,,gunoi”

Înlanțuirea DES (CBS): un mod de inlanțuire este înlanțuirea blocurilor cifrate. În aceasta metodă, fiecare bloc de text clar este combinat prin SAU EXCUSIV cu blocul anterior de text cifrat, inainte de a fii decriptat. Deci același bloc de text clar nu se va pune în corespondență cu același bloc de text cifrat, iar criptarea nu mai este o mare substituție monoalfabetică. Primul vector este combinat prin SAU EXCUSIV cu un vector de inițializare, ales aleator , care va fii transmis împreună cu textul cifrat.

Fig.22. Înlanțuirea blocurilor cifrate

Putem vedea cum lucrează înlanțuirea blocurilor cifrate prin examinarea urmatorului exemplu. Se poate începe prin a calcula C0=E(P0XOR IV), Apoi se va calcula C1=E(P1 XOR C0) și așa mai departe. Decriptarea lucrează in același mod, cu P0=IV XOR D(C0) și așa mai departe.

III.1.2 Spargerea DES-ului

DES a fost proiectat de către IBM, și se baza pe un cifru dezvoltat anterior numit Lucifer, dar cu excepția ca acest cifru folosea o cheie de 128 de biți în locul uneia de 56 de biți cat avea Lucifer. Dupa discuți, IBM a redus cheia de la 128 de biți la 56 de biți și a decis să pastreze secret procesul prin care a fost creat DES-ul. Mulți oameni suspectează faptul ca lungimea cheii a fost redusă pentru a exista siguranța că NSA poate sparge DES-ul, dar nici o organizație cu un buget mai mic nu poate face asta. Pastrarea secretului proiectarii a fost făcută probabil pentru a ascunde o trapă (usă ascunsă) care ar putea usura spargerea DES-ului de catre NSA.

In anul 1977, Diffie si Hellman au proiectat o masină pentru a sparge DES-ul și s-a estimat că ea poate fi construita cu un buget de 20 de milioane de dolari. Dată fiind o mica bucata de text clar si textul cifrat corespunzator, această masină ar putea sa gasească cheia, prin cautarea exhaustivă a 256 intrari din spațiul cheilor in mai puțin de o zi. In prezent, o astfel de masină ar costa probabil câteva sute de mii de dolari.

Cea mai inovatoare idee de spargere a DES-ului este Loteria Chinezească. Conform proiectului fiecare aparat radio si televizor trebuie echipat cu un cip DES capabil să facă 1 mil de criptari/sec in hardware. De câte ori ar dori să decripteze un mesaj cu DES, el raspândeste perechea text clar/text cifrat si fiecare dintre cele 1,2 miliarde de cipuri încep cautarea în sectiunea sa prestabilită din spațiul cheilor. În 60 sec vor fi gasite una sau mai multe potriviri, pentru a putea fii raportate cipurile pot fii programate să afișeze pe ecran sau să anunțe mesajul:

FELICITĂRI! TOCMAI AȚI CÂSTIGAT LOTERIA CHINEZEASCĂ

Din aceste argumente tragem concluzia că DES-ul nu mai poate fii folosit pentru criptarea documentelor importante. O soluție ar fii rularea DES-ului de două ori, cu două chei diferite pe 56 de biți. Din nefericire in anul 1981, Merkle și Hellman au dezvoltat o metodă care face ca dubla criptare să devină suspectă. Aceasta poartă numele de atacul întâlnirea-la-mijloc.

Se presupune că cineva a dublu-criptat o serie de blocuri de text clar, cu modul carte electronică de coduri. Pentru câteva valori ale lui i, criptanalistul posedă perechile Pi,Ci unde Q=Ek2(Ek1(Pi)).

După aplicarea funcției de decriptare Dk2 pentru fiecare membru al ecuației, obținem:

Dk2(Ci)=Ek1(Pi)

Cu siguranță că înainte ca adevaratele chei să fie localizate vor aparea multe alarme false dar, in cele din urmă acestea vor fii gasite. Atacul necesită doar 237 operații de criptare sau decriptare, mult mai puține decât 2112. Dupa toate acestea trebuie să remarcăm că dubla criptare nu este mult mai sigură decât criptarea simplă. Încă din 1979, IBM a realizat că lungimea cheii DES este prea mică și a conceput un mod de a o crește prin tiplă criptare. După cum se vede , sunt folosite două chei și trei runde: in prima textul clar este criptat cu K1, in runda doua este rulat DES in mod de decriptare, folosind cheia K2, iar în final se efectueaza o altă criptare cu K1

Fig.23. Tripla criptare folosind DES

Trebuie să menționăm două progrese recente in criptanaliză. Primul progres este criptanaliza diferențială (Biham si Shamir, 1993). Această tehnică poate fi folosită pentru a ataca orice cifru bloc. Lucrează la inceput cu o pereche de blocuri de text clar care diferă doar printr-un număr mic de biți si studiază cu grija ceea ce se intamplă la fiecare iterație internă pe masură ce criptarea avansează. multe Anumite combinații apar mai des decât altele și această observație conduce la un atac probabilistic.

Celălalt progres, mai puțin important, este criptanaliza liniară (Matsui, 1994). Aceasta sparge DES-ul cu doar 243 texte clare cunoscute. Lucrează prin combinarea XOR a anumitor biți din textul clar și din textul cifrat pentru a genera un bit.

III.2 IDEA

IDEA (Internațional Data Encryption Algorithm) A fost conceput în Elveția de către Xuejia Lai și James Massey în anul 1992. Principala sa aplicație este programul de criptare pentru poșta electronică. Este unul dintre sistemele de criptare cele mai rapide și mai sigure disponibile la ora actuală. Astfel încât este probabil in afara oricărei directive trasate de NSA, care ar fii putut să intoducă o ușă secretă. Este folosită o cheie de 128 de biți, lucru care il face imun la atacuri de genul ,,Loteria Chinezească” și ,,întâlnirea-la-mijloc” și de asemenea a fost proiectat să reziste la criptanaliza diferențială. Nu este cunoscută nici o tehnică sau masină care să spargă IDEA.

Acest algoritm folosește o cheie de 128 de biți si este inspirat din metodele anterioare – DES si cele imaginate pentru spargerea DES. Criptează 64 biți de date în 64 de biți de text criptat , folosind o cheie K pe 128 de biți. Bazată pe o generalizare a structurii Feistel, algoritmul constă în realizarea a opt transformari identice urmate de o transformare de iesire. Opt iterați sunt suficiente, deoarece pentru fiecare iterație , fiecare bit de ieșire depinde de fiecare bit de intrare.

Fig.24. Diagramele de criptare IDEA

Sunt folosite trei operații, toate asupra unor numere fără semn pe 16 biți. Aceste operați sunt XOR, adunare modulo 216 și inmulțire modulo 216+1. Toate acestea trei pot fii ușor realizate pe un calculator pe 16 biți, ignorând părțile cele mai semnificative ale rezultatului. Operațiile au proprietatea că oricare două perechi nu se supun legii de asociativitate sau distribuvitatea, facând criptanaliza și mai dificilă. Cheia pe 128 biți este folosită pentru a genera 52 de subchei de cate 16 biți fiecare, 6 biți puntru fiecare din cele 8 iterații si 4 pentru transpoziția finală. Decriptarea foloseste același algoritm dar cu chei diferite.

III.3 AES (Rijndael) Standard Avansat de Criptare

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

Rijndael permite lungimi ale chei și blocuri cuprinse între 128 și 256 de biți in pași de 32 de biți. AES specifică o lungime a blocului de 128 de biți și cheie de lungime 128, 192 sau 256 de biți. Din punct de vedere matematic, Rijndael se bazează pe teoria câmpurilor lui Galois, il vom analiza din punct de vedere al codului C. Ca și DES, Rijndael folosește substituți și permutări multiple, si mai multe runde. Numărul rundelor depinde de dimensiunile blocurilor si cheilor.

Fig.25. O parte din Criptarea Rijndael

Funcția Rijndael are trei parametri: textul clar, un tablou de 16 octeți care conține datele de intrare, textul cifrat, un tablou de 16 octeți unde se va pune rezultatele criptari, si cheia pe 16 octeți. Tabloul de stări este inițializat cu textul clar și modificat cu fiecare pas al computației.

Pasii algoritmului:

Pasul SubBytes: este un cifru cu substituție, fără punct fix, denumit Rijndael S-box, care rulează independent pe fiecare octet din state. Această transformare este neliniară și face astfel întreg cifrul să fie neliniar, ceea ce îi conferă un nivel sporit de securitate.

Fig.26. Pasul SubBytes

Pasul ShiftRows: opereaza la nivel de rand al matricii de stare state. Pasul consta in simpla deplasare ciclica a octetilor de pe randuri, astfel: primul rand nu se deplaseaza; al doilea rand se deplaseaza la stanga cu o pozitie; al treilea rand se deplaseaza la stanga cu doua pozitii; al patrulea se deplaseaza la stanga cu trei pozitii. Rezultatul acestui pas este ca fiecare coloana din tabloul state rezultat este compusa din octeti de pe fiecare coloana a starii initiale. Acesta este un aspect important, din cauza ca tabloul state este populat initial pe coloane, iar pasii ulteriori, inclusiv AddRoundKey in care este folosita cheia de criptare, operatiile se efectueaza pe coloane.

Fig.27. Pasul ShiftRows

Pasul MixColumns: In acest pas, fiecare coloana a tabloului de stare este considerata un polinom de gradul 4 peste corpul Galois F28. Fiecare coloana, tratata ca polinom, este inmultita, modulo x4 + 1 cu polinomul a(x) = 3×3 + x2 +x + 2. Rezultatul are proprietatea ca fiecare element al sau depinde de toate elementele de pe coloana starii dinaintea efectuarii pasului. La decriptare, coeficienții pasului corespunzător acestuia sunt mai mari și deci decriptarea este mai lentă decât criptarea. S-a luat această decizie pentru că unele din aplicațiile în care urma să fie folosit algoritmul implică numai criptări, și nu și decriptări, deci criptarea este folosită mai des.

Fig.28. Pasul MixColumns

Pasul AddRoundKey si planificarea cheilor: este pasul in care este implicată cheia. El constă intr-o simplă operație de „sau” exclusiv pe biți intre stare si cheia de rundă (o cheie care este unica pentru fiecare iterație, cheie calculată pe baza cheii secrete). Operatia de combinare cu cheia secreta este una extrem de simpla si rapidă, dar algoritmul ramane complex, din cauza complexitatii calculului cheilor de rundă (Key Schedule), precum si a celorlalți pași ai algoritmului.

Fig.29. Pasul AddRoundKey

Algoritmul a fost proiectat atât pentru o mare securitate cât si pentru o viteză ridicata. Oricum implementările hardware sunt rapide. [16]

III.3 Algoritmul RSA

Problema proiectări unui algoritm de criptare cu cheie publică a fost abordată de mulți cercetători. Prima schemă criptografică cu chei publice a fost realizată în anul 1977 de către Ron Rivest, Adi Shamir și Len Adleman. Este cea mai răspândită și implementată schemă din lume.

O alta deosebire consta în faptul ca în sistemele tradiționale de criptare, cheia de criptare trebuie ținută secretă deoarece ea trebuie utilizată în cadrul procesului de decriptare. În cazul criptarii cu chei publice, cheia de criptare/decriptare nu mai este trimisă receptorului, deci canalul de comunicație dintre transmițator si receptor poate să nu fie securizat.

Metoda lor este bazată pe câteva principi din teoria numerelor. Voi prezenta pe scurt modul in care se foloseste si generarea de chei după cum urmează :

Se generează două numere prime, p și q, de obicei mai mari decât 10100

Se calculeaza n = p*q și z = (p-1) * (q-1).

Se alege un numar relativ prim cu z și este notat cu d.

Se gasește e astfel incat e*d =1 mod z.

Împărțirea textului clar, privit ca și de biți, in blocuri, astfel încât fiecare mesaj de text clar, P să intre in intervalul 0<= P< n. Aceasta poate fi făcuta grupând textul clar in blocuri de cate k biti, unde k este cel mai mare număr intreg pentru care inegalitatea 2k<n este adevarata.

Pentru a cripta mesajul P, se calculează C = Pe (mod n). Pentru a decripta C, se calculeaza P = Cd(mod n). Se poate demonstra ca pentru toți P din intervalul specificat, criptarea si decriptarea sunt funcții inverse una alteia. Pentru criptarea este nevoie de e si n, pentru decriptarea este nevoie de d si n.

Fig.30. Algoritmul RSA

Securitatea metodei este bazată pe dificultatea factorizări numerelor mari. Daca un criptanalist ar putea factoriza numărul n, public cunoscut, el ar putea găsi p și q iar din acestea pe z. Cu z și e cunoscuți criptanalistu îl poate calcula pe d folosind algoritmul lui Euclid. Matematicieni au încercat să factorizeze numere mari de foarte mulți ani, iar experiența acumulată sugereaza ca aceasta este o problemă mai mult decât dificilă. Factorizarea unui număr de 200 de cifre ar necesita un timp de calcul de 4 mild de ani. Cu toate că vor trece secole până când se va putea factoriza un număr de 200 de cifre, se vor alege pur și simplu p și q mai mari.

III.4 Algoritmi cu cheie publica

De-a lungul timpului, distribuția cheilor a fost întotdeauna punctul slab al multor criptosisteme. Deci indiferent cât de puternic era criptosistemul, dacă se pierde sau se fură cheia, sistemul își pierde valoarea. Pentru că toți criptologii au considerat întotdeauna faptul că atât pentru criptare cât și pentru decriptare se folosesc aceleași chei și că aceasta trebuie distribuită tuturor utilizatorilor sistemului, părea întotdeauna a exista urmatoarea problemă: cheile trebuiau protejate contra furtului dar și în același timp ele trebuiau distibuite.

În anul 1976, doi cercetători Diffie și Heliman, au propus un tip radical nou de criptosistem, în care cheile de criptare si de decriptare sunt diferite, iar cheia de decriptare nu poate fii dedusă din cheia de criptare. Deoarece este imposibilă deducerea unei chei din cealaltă, una din chei este facută publică, fiind pusă la indemana oricui dorește să transmită un mesaj cifrat. Doar destinatarul, care deține cea de-a doua cheie, poate descifra si utiliza mesajul.

Fig.31. Algoritm cu cheie publică

În propunerea lor, algoritmului de criptare E, si algoritmul de decriptare D, trebuie să îndeplinească trei cerințe:

D (E(P)) = P

Este mai mult decât dificil să se deducă D din E.

E nu poate fii spart printr-un atac cu text clar ales.

Prima cerință spune că dacă se aplică D unui mesaj criptat, E(P), se obține textul clar original, P. Cea de-a doua cerință este clară. Cea de-a treia cerință este necesară pentru că intruși pot experimenta și testa algoritmul. În aceste condiți nu există nici un motiv pentru care E, cheia de criptare să nu fie facută publică.

Trebuie să remarcăm în acest moment o chestiune de terminologie. Criptografia cu cheie publică necesită ca fiecare utilizator să aibă două chei: o cheie publică folosită de toată lumea pentru a cripta mesajele. Ne vom referi la aceste chei ca fiind cheie publică, respectiv cheie privată și le vom deosebi de cheile secrete folosite atât pentru criptare cât și pentru decriptare în criptografia convențională numită și cheie simetrică.

III.5 Alți algoritmi cu cheie publică

Există mai mulți algoritmi cu cheie publică. Primul algoritm de acest fel a fost algoritmul rucsacului, descris de Merkle și Hellman in 1978. Ideea pe care se bazează acest algoritm este că cineva posedă un număr mare de obiecte. Posesorul codifică mesajul prin selecția secretă a unor submulțimi de obiecte și le plasează in rucsac. Numărul total de obiecte din rucsac este facută publică, ca și lista tuturor obiectelor posibile. Lista obiectelor din rucsac este ținută secretă. Cu câteva restricți suplimentare, problema găsiri unei liste de obiecte cu numărul dat a fost gândit ca fiind computațional imposibilă și formează baza pentru algoritmul cu cheie publică.

Schema Merkle-Hellman este bazată pe transformarea unui caz ușor intr-unul dificil, si invers. În orice caz, schema a fost spartă de Adi Shamir, nu prin atacarea problemei rucsacului, ci prin coruperea conversiei de la rucsacul usor la cel dificil.

Cu toate ca a fost înbunătățit și corectat din nou, algoritmul rucsacului este foarte rar folosit, deoarece nu este considerat sigur. Alți algorimi de criptare cu cheie publică sunt cei bazați pe dificultatea calculului logaritmilor discreți. Ei au fost inventați de El Gamal (1985) și Schnorr (1991).

Există și alte scheme bazate pe curbe eliptice, dar cele două categorii majore sunt cele bazate pe dificultatea factorizării numerelormari, și pe calculul logaritmilor discreți. Aceste probleme sunt considerate dificile din start, deoarece studiul pe mai mulți ani nu sa facut progrese notabile.

III.5 Rezumat

Rețelele de calculatoare au cunoscut o dezvoltare spectaculoasă in ultimii ani. Ele sunt utilizate atât de companiile mari pentru centralizarea datelor aflate în diferite subunitați, aflate la distanțe foarte mari pentru a putea verifica nivelul de producție, cât și pentru a realiza contabilitatea companiei sau pentru comanda echipamentelor aflate la distanță este un obiectiv.

Dat fiind faptul concret al rețelelor de calculatoare, există multe scăpări in securitatea lor. Securizarea datelor în rețele nu se realizează doar la un anumit nivel al rețelei, ci are anumite implementări in fiecare nivel. Există patru categori de probleme: confidențialitate, autentificare, ne-repudiere și controlul integrități.

Există două modalități de criptare a datelor: prin cifruri cu substituție și cu transpoziție.

Algoritmi de criptare sunt de două feluri: cu cheie secretă și cu cheie privată

Pentru a crea un sistem criptografic care va rezolva problemele securității informaționale sigur și eficient este nevoie de folosit primitivele criptografice în grup după cerințe:

Un sistem criptografic (criptosistem) este compus din:

– M-text clar; – C-text cifrat;

– 2 functii inverse E() si D(); – un algoritm care produce cheile Ke si Kd

Securitatea criptării simetrice depinde mult de protecția cheii criptografice. Ca urmare, administrarea acestora este un factor esențial și se referă la:

– generarea cheilor, adică mijloacele aleatoare de creare a succesiunii de octeți (biți) ai cheii;

– distribuția cheilor, adică modul în care se transmit și se fac cunoscute cheile tuturor utilizatorilor cu drept de acces la informațiile criptate;

– memorarea cheilor, adică stocarea lor sigură pe un suport magnetic sau pe un card, de obicei criptate sub o altă cheie de cifrare a cheilor, numită și cheie master.

Dintre algoritmi cu cheie secretă s-a prezentat despre DES ( Data Encryption Standard ), IDEA (International Data Encryption Algoritm) și Rijndael, iar la cei cu cheie publică sa prezentat RSA.

De asemenea , sunt prezentate și diferite tipuri de atac, moduri de a sparge anumiți algoritmi, de exemplu DES cu Loteria Chinezească, atacul intâlnirea la mijloc

Capitolul IV

IV.1 Aplicația, Prezentarea aplicației

Aplicația implementează un mod de comunicare relativ sigur cu un alt calculator , numit server de fișiere. Se utilizează tipul de comunicare cu conexiune. Implementarea de față pune accentul pe programul client, care oferă utilizatorului și o intefață grafică cu ajutorul căreia se pot stabili parametri necesari transferului de date. Transferul fișierelor se face în siguranță, fără scurgeri de informații la un adversar cu privire la datele transferate.

Am ilustrat metode de implementare in autentificarea mesajelor cu cheie privată fără schimbul de orice informații suplimentare.

Apoi, după cum se va vedea in continuare în subcapitolul Utilizarea Aplicației utilizatorul va trebui să stabilească:

Modul de lucru: criptare/decriptare

Tipul folosit pentru criptare

Locația fisier pentru criptat

Locația fișierului după criptare

Cheia criptări/decriptări

Limbajul de programare folosit pentru implementarea atât a lucrului cu socluri cât și a algoritmului de criptare este C Sharp (C#). Această alegere poate fii justificată prin motive de popularitate a limbajului. Practic orice programator va fii familiar cu sintaxa acestuia în momentul în care ar vrea să modifice programul.

Aplicația este destinată sistemelor de operare Windows.

Interfața grafică este realizată cu ajutorul biblioteci de librării NET Framework 4.0

Utilizarea acestui program mi-a ușurat munca, în procesul de realizare a aplicației, dat fiind faptul că a fost studiat in cadrul cursurilor și laboratoarelor la facultate.

IV.2 Structura și utilizarea aplicației

Modul de criptare/decriptare are atribuția de a se ocupa de criptarea sau decriptarea fișierelor, oferind posibilitatea de a alege tipul de criptare și a lungimi cheii de criptare.

Prima fereatră dupa rularea programului după cun se vede in figura 32, va fii cea cu modulul de selectie a modului de lucru adica criptare/decriptare. Din această fereastra se selectează opțiunea corespunzătoare utilizatorului:

Criptare

Decriptare

Fig.32. Modul Criptare/Decriptare

În urma alegeri modului de lucru utilizatorul va avea posibilitatea de criptare a unui fișier local, sau de a decripta un fișier stocat local sau descarcat de pe server.

Acum utilizatorul trebuie să introducă valorile corespunzătoare aplicației:

Tipul criptări folosite: DES, Triple DES, Rijndael

Dimensiunea chei de criptare

Locația fișierului dorit a fii criptat

Cheia de criptare folosită

Actiunea dorită de criptare sau decriptare

Fig.33. Criptarea unui fisier

În cazul in care valorile introduse de către utilizatornu orespund din punct de vedere a validări informației necesare acțiuni alese programul va semnala acest lucru prin mesaje de atenționare.

Fig. 34 Posibile mesaje de atenționare

În situația in care valorile introduse corespund din punct de vedere a validării utilizatorul va putea să cripteze fisierul dorit.

Fig. 35 Mesajul de incheiere al criptări/decriptari

Fig. 36 Fișier inainte si dupa criptare

Capitolul.V

VI.1 Concluzii

Securitatea este un domeniu vast și acoperă o multitudine de imperfecțiuni. Rețelele de calculatoare sunt inerent nesigure. Metode si tactici de a înlătura intruși și răuvoitori sunt necesare la fiecare pas, pentru a le opune obstacole reale sunt mai mult decât necesare. Aceste lucruri trebuiesc făcute în mare parte la nivelul soft-ului, al aplicațiilor, dată fiind structura atât logică, cît și cea fizică a rețelelor.

Mesajele transmise trebuie să conțină informație redundantă sub o anumită formă pentru a îngreuna criptanaliza. Alt lucru esențial este existența unou amprente de timp în conținutul mesajelor, astfel încât după expirarea unei perioade de timp mesajele să nu mai poată fii retransmise.

În legătură cu algoritmi de criptare prezentați, ei sunt ușor utilizabili. Problemele care apar sunt în legatură cu transmiterea si gestiunea cheilor.

Îngreunarea găsirii cheilor de catre intruși trebuie să se bazeze pe anumite probleme greu rezolvabile, probleme cu care matematicieni se confruntă de ani de zile fără nici un progres notabil.

Astfel există trei categori majore care corespund acestor cerințe: dificultatea factorizării numerelor mari, calculul logaritmilor discreți și a determinări conținutului unui rucsac din greutatea sa.

Aplicația prezentată este o modalitate simplificatăde a pune in aplicație cele prezentate anterior in cadrul lucrări, nicidecum cel mai performant sau mai sigur din categoria sa. Algoritmi de criptare se vor putea implementa și in moduri mai rapide sau mai sigure. De asemenea există și alți algoritmi de criptare atât cu chei cheii publice cât și cu cheii secrete care se vor putea implementa în viitor în cadrul programului. Ideea urmarită a fost aceea de a oferi un mediu placut de lucru îmbinat cu simplitatea utilizări aplicației. Desigur programele au fost scrise intr-o manieră care să permită adăugarea de noi module, fără a depune un efort semnificativ, adică fără ca programatorul să fie nevoit să schimbe multe lucruri in cadrul programului.

Cu cât se avansează in arta criptari se merge in paralel cu eterna dorință a spargeri algoritmilor și a cheilor de criptare care sunt intr-o continuă dezvoltare.

În încheiere aș vrea să-i mulțumesc domnului profesor Mircea Vladuțiu pentru spijinul moral si logistic acordat în timpul realizări lucrări.

Capitolul VI

Bibliografie

Cărți:

Retele de calculatoare – Introducere in securitate . Corneliu Buraga, Universitatea A.I.Cuza Iasi,2007]

Lars Klander, "Anti-hacker. Ghidul securitătii rețelelor de calculatoare", ALL Educational, Bucuresti, 1998

Stănică, Giovanna. Modele de Referință OSI și TCP/IP Material de predare. 2009.

Stallings, William. CRYPTOGRAPHY AND NETWORK SECURITY PRINCIPLES AND PRACTICE FIFTH EDITION. 2011.

Reid, Fiach. Network Programming . Net C sharp. 2002.

Atanasiu Adrian „Securitatea informatiei- Vol.1: Criptografie”, Editura InfoData, Cluj-Napoca, 2007

E. Barkan and E. Biham, In how many ways can you write Rijndael?, Proceedings of Asiacrypt 2002, Lecture Notes on Computer Science, vol. 2501, Springer-Verlag, Berlin – New York, 2002.

Pagini Web:

Andreica, Alina. Internet teorie. [Interactiv] http://www.euro.ubbcluj.ro/~alina/cursuri/internet-teorie/5.htm.

Sudhakaran, Sareesh. Computer Network. [Interactiv] 2012. http://wolfcrow.com/blog/afraid-part-4-a-computer-network/.

Cateva notiuni despre retele de calculatoare. [Interactiv] http://ebookbrowsee.net/retele-de-calculatoare-pdf-d196480190.

http://www.rasfoiesc.com/educatie/informatica/retele-calculatoare/Spargerea-DESului76.php

Algoritmul de criptografie AES

http://www.rasfoiesc.com/educatie/informatica/retele-calculatoare/Doua-principii-criptografice-f41.php

http://cs-exhibitions.uni-klu.ac.at/index.php?id=262

Andreica, Alina. Informatica teorie. [Interactiv] http://www.euro.ubbcluj.ro/~alina/cursuri/internet-teorie/.

—. Informatica teorie. [Interactiv] http://www.euro.ubbcluj.ro/~alina/cursuri/internet-teorie/5.htm..

Anexe

private System.Windows.Forms.Button btSearchFile;

private System.Windows.Forms.RadioButton rbt_encrypt;

private System.Windows.Forms.RadioButton rbt_decrypt;

private System.Windows.Forms.TextBox txtFile;

private System.Windows.Forms.OpenFileDialog openF_File;

private System.Windows.Forms.Label label1;

private System.Windows.Forms.ComboBox cmb_KeySize;

private System.Windows.Forms.ComboBox cmb_encryption;

private System.Windows.Forms.Label label2;

private System.Windows.Forms.Label lb_KeySize;

private System.Windows.Forms.TextBox txtPassword1;

private System.Windows.Forms.Label label5;

private System.Windows.Forms.TextBox txtFileEncriptedLocal;

private System.Windows.Forms.Label label7;

private System.Windows.Forms.Button btEncrypt;

private System.Windows.Forms.CheckBox chk_show_pass;

private System.Windows.Forms.Button bt_Decrypt;

private System.Windows.Forms.Label lb_Marime_Cheie;

private System.Windows.Forms.GroupBox groupBox1;

private System.Windows.Forms.GroupBox groupBox2;

private System.Windows.Forms.Label label3;

private System.Windows.Forms.GroupBox groupBox3;

private System.Windows.Forms.Label label4;

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;

using System.Windows;

using System.IO;

using System.Security.Cryptography;

Aplicație Criptare / Decriptare

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

txtFile.Enabled = false;

txtFile.Text = "";

txtFileEncriptedLocal.Enabled = false;

txtFileEncriptedLocal.Text = "";

txtPassword1.Text = "";

txtPassword1.UseSystemPasswordChar = true;

rbt_encrypt.Checked = true;

lb_KeySize.Visible = false;

cmb_KeySize.Visible = false;

cmb_encryption.SelectedIndex = 0;

lb_Marime_Cheie.Visible = false;

bt_Decrypt.Enabled = false;

}

private void btSearchFile_Click_1(object sender, EventArgs e)

{

if (rbt_encrypt.Checked == true)

{

openF_File.Filter = "Fișiere text|*.txt";

}

if (rbt_decrypt.Checked == true)

{

openF_File.Filter = "Fișiere criptate|*.enc";

}

if (openF_File.ShowDialog() == DialogResult.OK)

{

txtFile.Text = openF_File.FileName;

}

else

{

MessageBox.Show("Nu ati selectat nici un fiser", "Info");

}

}

private void rbt_encrypt_CheckedChanged(object sender, EventArgs e)

{

bt_Decrypt.Enabled = false;

btEncrypt.Enabled = true;

txtFileEncriptedLocal.Text = "";

txtFile.Text = "";

}

private void rbt_decrypt_CheckedChanged(object sender, EventArgs e)

{

bt_Decrypt.Enabled = true;

btEncrypt.Enabled = false;

txtFileEncriptedLocal.Text = "";

txtFile.Text = "";

}

private void btEncrypt_Click(object sender, EventArgs e)

{

if (txtFile.Text == "")

{

MessageBox.Show("Nu ati selectat un fișier pentru a fi criptat. Va rugam alegeți fișierul pe care doriți sa-l criptati.");

}

else if (txtPassword1.Text == "")

{

MessageBox.Show("Introduceti cheia de criptare");

}

else if (cmb_encryption.Text == "" || cmb_encryption.Text == "..Alegeți..")

{

MessageBox.Show("Nu ati selectat tipul criptării");

}

else

{

string file_to_encode;

string path_file_to_encode;

file_to_encode = Path.GetFileNameWithoutExtension(txtFile.Text);

path_file_to_encode = Path.GetDirectoryName(txtFile.Text);

switch (cmb_encryption.Text)

{

case "DES":

txtFileEncriptedLocal.Text = path_file_to_encode + "\\DES_encripted_" + file_to_encode + ".enc";

encryptDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "TripleDES":

txtFileEncriptedLocal.Text = path_file_to_encode + "\\TripleDES_encripted_" + file_to_encode + ".enc";

encryptTripleDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "Rijndael":

txtFileEncriptedLocal.Text = path_file_to_encode + "\\Rijndael_encripted_" + file_to_encode + ".enc";

encryptRijndael(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

default:

MessageBox.Show("Nu este definita criptarea"); break;

}

}

}

private void cmb_encryption_SelectedIndexChanged(object sender, EventArgs e)

{

cmb_KeySize.Visible = true;

lb_KeySize.Visible = true;

switch (cmb_encryption.Text)

{

case "Rijndael":

cmb_KeySize.Items.Clear();

cmb_KeySize.Items.AddRange(new object[] { "128", "192", "256" });

cmb_KeySize.SelectedIndex = 0;

break;

case "TripleDES":

cmb_KeySize.Items.Clear();

cmb_KeySize.Items.AddRange(new object[] { "128", "192" });

cmb_KeySize.SelectedIndex = 0;

break;

case "DES":

cmb_KeySize.Items.Clear();

cmb_KeySize.Items.AddRange(new object[] { "64"});

cmb_KeySize.SelectedIndex = 0;

break;

default:

cmb_KeySize.Items.Clear();

cmb_KeySize.Visible = false;

lb_KeySize.Visible = false;

break;

}

}

Criptare DES

private void encryptDES(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 64)

{

try

{

FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Key = Encoding.ASCII.GetBytes(sKey);

DES.IV = Encoding.ASCII.GetBytes(sKey);

ICryptoTransform desencrypt = DES.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

MessageBox.Show("Fișierul a fost criptat", "Info");

sOutputFilename = sOutputFilename.Replace(".enc",".key");

FileStream fskey = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

StreamWriter fw = new StreamWriter(fskey);

fw.Write(" Criptare DES \n");

fw.Write(" Dimensiune cheie : " + cmb_KeySize.SelectedItem + "\n");

fw.Write(" Cheie : " + txtPassword1.Text + "\n");

fw.Close();

fskey.Close();

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Criptare esuata");

}

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta", "Eroare");

}

Criptare TripleDES

private void encryptTripleDES(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 128 || sKey.Length * 8 == 192)

{

try

{

FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

TripleDESCryptoServiceProvider TripleDES = new TripleDESCryptoServiceProvider();

TripleDES.KeySize = Convert.ToInt16(cmb_KeySize.Text);

TripleDES.Key = Encoding.ASCII.GetBytes(sKey);

TripleDES.IV = Encoding.ASCII.GetBytes(sKey.Substring(0, 8));

ICryptoTransform desencrypt = TripleDES.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

MessageBox.Show("Fisierul a fost criptat", "Info");

sOutputFilename = sOutputFilename.Replace(".enc", ".key");

FileStream fskey = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

StreamWriter fw = new StreamWriter(fskey);

fw.Write(" Criptare TripleDES \n");

fw.Write(" Dimensiune cheie : " + cmb_KeySize.SelectedItem + "\n");

fw.Write(" Cheie : " + txtPassword1.Text + "\n");

fw.Close();

fskey.Close();

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Criptare esuata");

}

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta", "Eroare");

}

Criptare Rijndael

private void encryptRijndael(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 128 || sKey.Length * 8 == 192 || sKey.Length * 8 == 256)

{

try

{

FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

RijndaelManaged rij = new RijndaelManaged();

rij.KeySize = Convert.ToInt16(cmb_KeySize.Text);

rij.Key = Encoding.ASCII.GetBytes(sKey);

rij.IV = Encoding.ASCII.GetBytes(sKey.Substring(0, 16));

ICryptoTransform rijencrypt = rij.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted, rijencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

MessageBox.Show("Fisierul a fost criptat", "Info");

sOutputFilename = sOutputFilename.Replace(".enc", ".key");

FileStream fskey = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

StreamWriter fw = new StreamWriter(fskey);

fw.Write(" Criptare Rijndael \n");

fw.Write(" Dimensiune cheie : " + cmb_KeySize.SelectedItem + "\n");

fw.Write(" Cheie : " + txtPassword1.Text + "\n");

fw.Close();

fskey.Close();

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Criptare esuata");

}

}

else

{

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta", "Eroare");

}

}

private void chk_show_pass_CheckedChanged(object sender, EventArgs e)

{

if (chk_show_pass.Checked == true)

{

txtPassword1.UseSystemPasswordChar = false;

}

else

{

txtPassword1.UseSystemPasswordChar = true;

}

}

Decriptare DES

private void DecryptDES(string sInputFilename,string sOutputFilename,string sKey)

{

try

{

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Key = Encoding.ASCII.GetBytes(sKey);

DES.IV = Encoding.ASCII.GetBytes(sKey);

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

ICryptoTransform desdecrypt = DES.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

fsDecrypted.Flush();

fsDecrypted.Close();

fsread.Close();

MessageBox.Show("Fisierul a fost Decriptat", "Info");

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Decriptare esuata");

}

}

Decriptare TripleDES

private void DecryptTripleDES(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length*8 == 128 || sKey.Length*8 == 192)

try {

TripleDESCryptoServiceProvider TripleDES = new TripleDESCryptoServiceProvider();

TripleDES.KeySize = Convert.ToInt16(cmb_KeySize.Text);

TripleDES.Key = Encoding.ASCII.GetBytes(sKey);

TripleDES.IV = Encoding. ASCII. GetBytes(sKey .Substring(0 , 8));

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

ICryptoTransform desdecrypt = TripleDES.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

fsDecrypted.Flush();

fsDecrypted.Close();

fsread.Close();

MessageBox.Show("Fișierul a fost Decriptat", "Info");

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Decriptare esuata");

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corectai", "Eroare");

}

Decriptare Rijndael

private void DecryptRijndael(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 128 || sKey.Length * 8 == 192 || sKey.Length*8 == 256)

{

try

{

RijndaelManaged rij = new RijndaelManaged();

rij.KeySize = Convert.ToInt16(cmb_KeySize.Text);

rij.Key = Encoding.ASCII.GetBytes(sKey);

rij.IV = Encoding.ASCII.GetBytes(sKey.Substring(0,16));

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

ICryptoTransform desdecrypt = rij.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

fsDecrypted.Flush();

fsDecrypted. Close();

fsread.Close();

MessageBox.Show("Fisierul a fost Decriptat", "Info");

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Decriptare esuata");

}

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta!","Eroare");

}

private void bt_Decrypt_Click(object sender, EventArgs e)

{

if (txtFile.Text == "")

{

MessageBox.Show("Nu ati selectat un fișier pentru a fi Decriptat. Va rugam alegeți fișierul pe care doriți sa-l decriptati.");

}

else if (txtPassword1.Text == "")

{

MessageBox.Show("Introduceți cheia pentru decriptare");

}

else if (cmb_encryption.Text == "")

{

MessageBox.Show("Nu ati selectat tipul decriptării");

}

else

{

string file_to_decode;

string path_file_to_decode;

file_to_decode = Path.GetFileNameWithoutExtension(txtFile.Text);

path_file_to_decode = Path.GetDirectoryName(txtFile.Text);

txtFileEncriptedLocal.Text = path_file_to_decode + "\\" + file_to_decode + ".dec";

txtFileEncriptedLocal.Text = txtFileEncriptedLocal.Text.Replace("encripted", "decripted");

switch (cmb_encryption.Text)

{

case "DES":

DecryptDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "TripleDES":

DecryptTripleDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "Rijndael":

DecryptRijndael(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

default:

MessageBox.Show("Nu este definita decriptarea");

break;

}

}

}

private void txtPassword1_TextChanged(object sender, EventArgs e)

{

int a;

a = txtPassword1.Text.Length * 8;

lb_Marime_Cheie.Text = a.ToString() + " biti";

lb_Marime_Cheie.Visible = true;

}

}

}

Bibliografie

Cărți:

Retele de calculatoare – Introducere in securitate . Corneliu Buraga, Universitatea A.I.Cuza Iasi,2007]

Lars Klander, "Anti-hacker. Ghidul securitătii rețelelor de calculatoare", ALL Educational, Bucuresti, 1998

Stănică, Giovanna. Modele de Referință OSI și TCP/IP Material de predare. 2009.

Stallings, William. CRYPTOGRAPHY AND NETWORK SECURITY PRINCIPLES AND PRACTICE FIFTH EDITION. 2011.

Reid, Fiach. Network Programming . Net C sharp. 2002.

Atanasiu Adrian „Securitatea informatiei- Vol.1: Criptografie”, Editura InfoData, Cluj-Napoca, 2007

E. Barkan and E. Biham, In how many ways can you write Rijndael?, Proceedings of Asiacrypt 2002, Lecture Notes on Computer Science, vol. 2501, Springer-Verlag, Berlin – New York, 2002.

Pagini Web:

Andreica, Alina. Internet teorie. [Interactiv] http://www.euro.ubbcluj.ro/~alina/cursuri/internet-teorie/5.htm.

Sudhakaran, Sareesh. Computer Network. [Interactiv] 2012. http://wolfcrow.com/blog/afraid-part-4-a-computer-network/.

Cateva notiuni despre retele de calculatoare. [Interactiv] http://ebookbrowsee.net/retele-de-calculatoare-pdf-d196480190.

http://www.rasfoiesc.com/educatie/informatica/retele-calculatoare/Spargerea-DESului76.php

Algoritmul de criptografie AES

http://www.rasfoiesc.com/educatie/informatica/retele-calculatoare/Doua-principii-criptografice-f41.php

http://cs-exhibitions.uni-klu.ac.at/index.php?id=262

Andreica, Alina. Informatica teorie. [Interactiv] http://www.euro.ubbcluj.ro/~alina/cursuri/internet-teorie/.

—. Informatica teorie. [Interactiv] http://www.euro.ubbcluj.ro/~alina/cursuri/internet-teorie/5.htm..

Anexe

private System.Windows.Forms.Button btSearchFile;

private System.Windows.Forms.RadioButton rbt_encrypt;

private System.Windows.Forms.RadioButton rbt_decrypt;

private System.Windows.Forms.TextBox txtFile;

private System.Windows.Forms.OpenFileDialog openF_File;

private System.Windows.Forms.Label label1;

private System.Windows.Forms.ComboBox cmb_KeySize;

private System.Windows.Forms.ComboBox cmb_encryption;

private System.Windows.Forms.Label label2;

private System.Windows.Forms.Label lb_KeySize;

private System.Windows.Forms.TextBox txtPassword1;

private System.Windows.Forms.Label label5;

private System.Windows.Forms.TextBox txtFileEncriptedLocal;

private System.Windows.Forms.Label label7;

private System.Windows.Forms.Button btEncrypt;

private System.Windows.Forms.CheckBox chk_show_pass;

private System.Windows.Forms.Button bt_Decrypt;

private System.Windows.Forms.Label lb_Marime_Cheie;

private System.Windows.Forms.GroupBox groupBox1;

private System.Windows.Forms.GroupBox groupBox2;

private System.Windows.Forms.Label label3;

private System.Windows.Forms.GroupBox groupBox3;

private System.Windows.Forms.Label label4;

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;

using System.Windows;

using System.IO;

using System.Security.Cryptography;

Aplicație Criptare / Decriptare

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

txtFile.Enabled = false;

txtFile.Text = "";

txtFileEncriptedLocal.Enabled = false;

txtFileEncriptedLocal.Text = "";

txtPassword1.Text = "";

txtPassword1.UseSystemPasswordChar = true;

rbt_encrypt.Checked = true;

lb_KeySize.Visible = false;

cmb_KeySize.Visible = false;

cmb_encryption.SelectedIndex = 0;

lb_Marime_Cheie.Visible = false;

bt_Decrypt.Enabled = false;

}

private void btSearchFile_Click_1(object sender, EventArgs e)

{

if (rbt_encrypt.Checked == true)

{

openF_File.Filter = "Fișiere text|*.txt";

}

if (rbt_decrypt.Checked == true)

{

openF_File.Filter = "Fișiere criptate|*.enc";

}

if (openF_File.ShowDialog() == DialogResult.OK)

{

txtFile.Text = openF_File.FileName;

}

else

{

MessageBox.Show("Nu ati selectat nici un fiser", "Info");

}

}

private void rbt_encrypt_CheckedChanged(object sender, EventArgs e)

{

bt_Decrypt.Enabled = false;

btEncrypt.Enabled = true;

txtFileEncriptedLocal.Text = "";

txtFile.Text = "";

}

private void rbt_decrypt_CheckedChanged(object sender, EventArgs e)

{

bt_Decrypt.Enabled = true;

btEncrypt.Enabled = false;

txtFileEncriptedLocal.Text = "";

txtFile.Text = "";

}

private void btEncrypt_Click(object sender, EventArgs e)

{

if (txtFile.Text == "")

{

MessageBox.Show("Nu ati selectat un fișier pentru a fi criptat. Va rugam alegeți fișierul pe care doriți sa-l criptati.");

}

else if (txtPassword1.Text == "")

{

MessageBox.Show("Introduceti cheia de criptare");

}

else if (cmb_encryption.Text == "" || cmb_encryption.Text == "..Alegeți..")

{

MessageBox.Show("Nu ati selectat tipul criptării");

}

else

{

string file_to_encode;

string path_file_to_encode;

file_to_encode = Path.GetFileNameWithoutExtension(txtFile.Text);

path_file_to_encode = Path.GetDirectoryName(txtFile.Text);

switch (cmb_encryption.Text)

{

case "DES":

txtFileEncriptedLocal.Text = path_file_to_encode + "\\DES_encripted_" + file_to_encode + ".enc";

encryptDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "TripleDES":

txtFileEncriptedLocal.Text = path_file_to_encode + "\\TripleDES_encripted_" + file_to_encode + ".enc";

encryptTripleDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "Rijndael":

txtFileEncriptedLocal.Text = path_file_to_encode + "\\Rijndael_encripted_" + file_to_encode + ".enc";

encryptRijndael(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

default:

MessageBox.Show("Nu este definita criptarea"); break;

}

}

}

private void cmb_encryption_SelectedIndexChanged(object sender, EventArgs e)

{

cmb_KeySize.Visible = true;

lb_KeySize.Visible = true;

switch (cmb_encryption.Text)

{

case "Rijndael":

cmb_KeySize.Items.Clear();

cmb_KeySize.Items.AddRange(new object[] { "128", "192", "256" });

cmb_KeySize.SelectedIndex = 0;

break;

case "TripleDES":

cmb_KeySize.Items.Clear();

cmb_KeySize.Items.AddRange(new object[] { "128", "192" });

cmb_KeySize.SelectedIndex = 0;

break;

case "DES":

cmb_KeySize.Items.Clear();

cmb_KeySize.Items.AddRange(new object[] { "64"});

cmb_KeySize.SelectedIndex = 0;

break;

default:

cmb_KeySize.Items.Clear();

cmb_KeySize.Visible = false;

lb_KeySize.Visible = false;

break;

}

}

Criptare DES

private void encryptDES(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 64)

{

try

{

FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Key = Encoding.ASCII.GetBytes(sKey);

DES.IV = Encoding.ASCII.GetBytes(sKey);

ICryptoTransform desencrypt = DES.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

MessageBox.Show("Fișierul a fost criptat", "Info");

sOutputFilename = sOutputFilename.Replace(".enc",".key");

FileStream fskey = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

StreamWriter fw = new StreamWriter(fskey);

fw.Write(" Criptare DES \n");

fw.Write(" Dimensiune cheie : " + cmb_KeySize.SelectedItem + "\n");

fw.Write(" Cheie : " + txtPassword1.Text + "\n");

fw.Close();

fskey.Close();

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Criptare esuata");

}

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta", "Eroare");

}

Criptare TripleDES

private void encryptTripleDES(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 128 || sKey.Length * 8 == 192)

{

try

{

FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

TripleDESCryptoServiceProvider TripleDES = new TripleDESCryptoServiceProvider();

TripleDES.KeySize = Convert.ToInt16(cmb_KeySize.Text);

TripleDES.Key = Encoding.ASCII.GetBytes(sKey);

TripleDES.IV = Encoding.ASCII.GetBytes(sKey.Substring(0, 8));

ICryptoTransform desencrypt = TripleDES.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

MessageBox.Show("Fisierul a fost criptat", "Info");

sOutputFilename = sOutputFilename.Replace(".enc", ".key");

FileStream fskey = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

StreamWriter fw = new StreamWriter(fskey);

fw.Write(" Criptare TripleDES \n");

fw.Write(" Dimensiune cheie : " + cmb_KeySize.SelectedItem + "\n");

fw.Write(" Cheie : " + txtPassword1.Text + "\n");

fw.Close();

fskey.Close();

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Criptare esuata");

}

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta", "Eroare");

}

Criptare Rijndael

private void encryptRijndael(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 128 || sKey.Length * 8 == 192 || sKey.Length * 8 == 256)

{

try

{

FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

RijndaelManaged rij = new RijndaelManaged();

rij.KeySize = Convert.ToInt16(cmb_KeySize.Text);

rij.Key = Encoding.ASCII.GetBytes(sKey);

rij.IV = Encoding.ASCII.GetBytes(sKey.Substring(0, 16));

ICryptoTransform rijencrypt = rij.CreateEncryptor();

CryptoStream cryptostream = new CryptoStream(fsEncrypted, rijencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsInput.Length];

fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

cryptostream.Close();

fsInput.Close();

fsEncrypted.Close();

MessageBox.Show("Fisierul a fost criptat", "Info");

sOutputFilename = sOutputFilename.Replace(".enc", ".key");

FileStream fskey = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);

StreamWriter fw = new StreamWriter(fskey);

fw.Write(" Criptare Rijndael \n");

fw.Write(" Dimensiune cheie : " + cmb_KeySize.SelectedItem + "\n");

fw.Write(" Cheie : " + txtPassword1.Text + "\n");

fw.Close();

fskey.Close();

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Criptare esuata");

}

}

else

{

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta", "Eroare");

}

}

private void chk_show_pass_CheckedChanged(object sender, EventArgs e)

{

if (chk_show_pass.Checked == true)

{

txtPassword1.UseSystemPasswordChar = false;

}

else

{

txtPassword1.UseSystemPasswordChar = true;

}

}

Decriptare DES

private void DecryptDES(string sInputFilename,string sOutputFilename,string sKey)

{

try

{

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Key = Encoding.ASCII.GetBytes(sKey);

DES.IV = Encoding.ASCII.GetBytes(sKey);

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

ICryptoTransform desdecrypt = DES.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

fsDecrypted.Flush();

fsDecrypted.Close();

fsread.Close();

MessageBox.Show("Fisierul a fost Decriptat", "Info");

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Decriptare esuata");

}

}

Decriptare TripleDES

private void DecryptTripleDES(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length*8 == 128 || sKey.Length*8 == 192)

try {

TripleDESCryptoServiceProvider TripleDES = new TripleDESCryptoServiceProvider();

TripleDES.KeySize = Convert.ToInt16(cmb_KeySize.Text);

TripleDES.Key = Encoding.ASCII.GetBytes(sKey);

TripleDES.IV = Encoding. ASCII. GetBytes(sKey .Substring(0 , 8));

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

ICryptoTransform desdecrypt = TripleDES.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

fsDecrypted.Flush();

fsDecrypted.Close();

fsread.Close();

MessageBox.Show("Fișierul a fost Decriptat", "Info");

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Decriptare esuata");

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corectai", "Eroare");

}

Decriptare Rijndael

private void DecryptRijndael(string sInputFilename, string sOutputFilename, string sKey)

{

if (sKey.Length * 8 == 128 || sKey.Length * 8 == 192 || sKey.Length*8 == 256)

{

try

{

RijndaelManaged rij = new RijndaelManaged();

rij.KeySize = Convert.ToInt16(cmb_KeySize.Text);

rij.Key = Encoding.ASCII.GetBytes(sKey);

rij.IV = Encoding.ASCII.GetBytes(sKey.Substring(0,16));

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

ICryptoTransform desdecrypt = rij.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);

StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);

fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());

fsDecrypted.Flush();

fsDecrypted. Close();

fsread.Close();

MessageBox.Show("Fisierul a fost Decriptat", "Info");

}

catch (Exception e)

{

MessageBox.Show(e.Message, "Decriptare esuata");

}

}

else

MessageBox.Show("Cheia de criptare nu are dimensiunea corecta!","Eroare");

}

private void bt_Decrypt_Click(object sender, EventArgs e)

{

if (txtFile.Text == "")

{

MessageBox.Show("Nu ati selectat un fișier pentru a fi Decriptat. Va rugam alegeți fișierul pe care doriți sa-l decriptati.");

}

else if (txtPassword1.Text == "")

{

MessageBox.Show("Introduceți cheia pentru decriptare");

}

else if (cmb_encryption.Text == "")

{

MessageBox.Show("Nu ati selectat tipul decriptării");

}

else

{

string file_to_decode;

string path_file_to_decode;

file_to_decode = Path.GetFileNameWithoutExtension(txtFile.Text);

path_file_to_decode = Path.GetDirectoryName(txtFile.Text);

txtFileEncriptedLocal.Text = path_file_to_decode + "\\" + file_to_decode + ".dec";

txtFileEncriptedLocal.Text = txtFileEncriptedLocal.Text.Replace("encripted", "decripted");

switch (cmb_encryption.Text)

{

case "DES":

DecryptDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "TripleDES":

DecryptTripleDES(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

case "Rijndael":

DecryptRijndael(txtFile.Text, txtFileEncriptedLocal.Text, txtPassword1.Text);

break;

default:

MessageBox.Show("Nu este definita decriptarea");

break;

}

}

}

private void txtPassword1_TextChanged(object sender, EventArgs e)

{

int a;

a = txtPassword1.Text.Length * 8;

lb_Marime_Cheie.Text = a.ToString() + " biti";

lb_Marime_Cheie.Visible = true;

}

Similar Posts

  • Tehnologii Voice Over Ip

    Tehnologii Voice over IP Cuprins Introducere VoIP (Voice over Internet Protocol): Telefonia IP cunoscută și sub numele de VoIP este o tehnologie care a început deja să schimbe modul de comunicare între oameni. Unul din principalele beneficii ale acesteia este micșorarea costurilor telefoniei clasice. Tehnologia "Voice Over Internet Protocol", denumită pe scurt VoIP, se referă…

  • Microsoft Sql Server

    Cuprins Introducere Generalități 1. Softuri care utilizează SQL 2. Microsoft SQL Server 2.1 Despre 2.2 Exemple Bibliografie Introducere Generalități Limbajul structurat de interogare SQL (Structured Query Language) este limbajul standard pentru bazele de date relaționale definit de ANSI în 1986 și este adoptat ulterior ca standard internațional de către ISO (1992). Peste o sută de…

  • Studiu Critic al Actualelor Sisteme de E Learning

    CUPRINS CAPITOLUL 1 – ASPECTE GENERALE DESPRE E-LEARNING 3 Introducere 3 Definiții, termeni, argumente 5 E-Learning – paradigmă a instruirii asistate de calculator 9 Arhitectura unui sistem e-Learning 11 Avantaje și dezavantaje ale e-Learning 16 Soluții de e-Learning 18 Generații de e-Learning 18 Managementul proceselor de e-Learning 20 CAPITOLUL 2 – PLATFORME DE E-LEARNING 23…

  • Compresia Si Contruirea de Imagini cu Ajutorul Fractalilor

    Cuprins Capitolul 1 Introducere Capitolul 2 Fractali – concepte [i algoritmi 2.1 Defini]ii      .………………………………………………………………………………..    5 2.2 Clasific#ri    ……………………………………………………………………………….    5 2.3 Caracteristici [i propriet#]i    ………………………………………………….……….    8 2.3.1 Fragmentarea la infinit    ………………………………………………….…….      8 2.3.2 Auto-similaritatea      ………………………………………………….………….. 8 2.3.3 Invarian]a la transla]ii      ………………………………………………….……… 8…

  • Tehnologii Utilizate

    INTRODUCERE Dezvoltarea rapidă din ultima perioadă a resurselor software și hardware din domeniul tehnologiei informației are meritul de a oferi o mai bună comunicare și un acces mult mai rapid la toate categoriile de date. Motivația alegerii lucrării constă in contribuția la crearea unei baze de date moderne cu interfata accesibila pentru o intreprindere imobiliara…

  • Tehnici Data Mining

    Capitolul 1 Introducere În aceasta lucrare mi-am propus ca prin ajutorul a mai multor programe să fac predicții asupra calitații aerului. În primul capitol sunt prezentate noțiuni introductive despre inteligența artificială, despre domeniile de reprezentare ale inteligenței artificiale si despre sistemele expert. Inteligența artificială este inteligența mașinilor sau a softurilor. Este un teren de studiu…