Coordonator științific: Absolvent: PROF. DR. EMIL SIMION APOSTOAE MARIUS BUCUREȘTI 2018 2 CUPRINS Capitolul 1. Introducere… [621827]
1
UNIVERSITATEA BUCUREȘTI
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ
ALGORITMI CRIPTOGRAFICI
UTILIZAȚI ȊN
CRIMINALITATEA INFORMATICĂ
Coordonator științific: Absolvent: [anonimizat]
2018
2
CUPRINS
Capitolul 1. Introducere ………………………….. ………………………….. ………………………….. …………………….. 3
1.1. Istoric ………………………….. ………………………….. ………………………….. ………………………….. ……….. 3
1.2. Criptografia ut ilizată în criminalitatea informatică. Ransomware Virus. ………………………….. ….. 5
1.3. Viruși Ransomware : CRYPTOLOCKER, WANNACRYPT, POLIȚIA ROMÂNĂ ………………………….. . 7
Capitolul 2. Protocoale de comunicații ………………………….. ………………………….. ………………………….. . 11
Capitolul 3. Algoritmi de criptare ………………………….. ………………………….. ………………………….. ………. 15
3.1. Criptografia asimetrică ………………………….. ………………………….. ………………………….. …………… 15
3.1.1 Algoritmul Rivest -Shamir -Adelman (RSA) ………………………….. ………………………….. ………… 17
3.2 Criptografia Simetrică ………………………….. ………………………….. ………………………….. ……………. 22
3.2.1 Algoritmul AES (Advanced Encryption Standard) ………………………….. ………………………… 24
Capitolul 4. Implementarea algoritmilor în Java ………………………….. ………………………….. ………………. 30
4.1 Criptarea AES ………………………….. ………………………….. ………………………….. ………………………… 30
4.2 Criptarea RSA ………………………….. ………………………….. ………………………….. ………………………… 32
4.3 Utilizarea interfeței grafice în crearea aplicației – Java FX ………………………….. ……………………. 38
Capitolul 5. Concluzii ………………………….. ………………………….. ………………………….. ……………………….. 52
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ………… 54
3
Capitolul 1 . Introducere
1.1. Istoric
La începutul existenței lor, rețelele de calculatoare au fost folosite de către profesorii
din universități pentru trimiterea poștei electronice (serviciul de e -mail) sau pentru a permite
conexiuni multiple la un server și de către corporații pentru a partaja imprimantele. În aceste
condiții, securitațea informatică nu atrăgea prea mult atenția. De aceea majoritatea
protocoalelor de atunci nu aveau posibilitatea de a cripta datele (ex. Telnet, RIP, etc.).
Ȋn timp , oamenii au văzut potenț ialul crescȃnd al rețelelor de calculatoare și multiplele
beneficii pe care le pot aduce: pot impartași cunoștințe, pot trimite poze, pot ține legătura cu
persoanele dragi, putȃnd chiar să își plătească facturile sau să plaseze comenzi de produse on –
line, doar s tȃnd în fața computerului personal. Ȋnsă aceste beneficii aduc și o serie de
vulnerabilt ăți sistemului informatic. Exper ții de la BitDefender au analizat principalele
tendin țe în materie de amenință ri informatice pentru anul 2017 , și anticipează atacuri
complexe, care vor viza utilizatorii individuali, da r în special pe cei de business. Numai în
2016 numă rul acestui tip de atacuri a ajuns la peste 1.000.000 de mostre unice de viru și.
Securitatea este un subiect vast și asigură o gamă complexă de imperfecțiu ni. Ȋn forma
sa ce a mai simplă ea asigură că un răufăcător nu vă poate citi sau chiar modifica mesajele. De
asemenea ea vă poate garanta faptul că atunci cȃnd ați primit un mesaj de la o persoană , acel
mesaj este într -adevăr de la acea persoană și nu de la un răuvoitor. Securitatea informatică
este o artă. Trebuie asigurat un echilibru între nevoia de comunicații și conectivitate , pe de o
parte, și necesitatea asigurării confidențialității, integrității și autenticității informațiilor, pe de
altă parte.
Atacurile ce iși au originea din exteriorul rețelei de calculatoare pot fi catalogate
după cum urmează :
– Viruș i: sunt secvențe de cod ce se atașează de programe sau fiș iere executabile, de
obicei la î ncepu tul codului ș i cȃnd este activat (atunci cȃnd fiș ierul este executat sau la o
anumită dată și oră predefinită) verifică hard -disk-ul în căutarea altor fișiere executab ile
neinfestate încă. Pot avea consecințe nedăunatoare, cum ar fi afiș area pe ecran a unei p oze,
sau dăunatoare cum ar fi ș tergerea datelor de pe hard -disk.
De asemenea pot fi programa ți să își updateze codul pentru a nu fi detectaț i.
– Viermi : sunt programe de sine stătă toare ce atac ă un sistem prin exploatarea unei
vulnerabilităț i cunosc ute, apoi scanează reț eaua în că utarea unor noi sistem e pe care le poate
4
exploata ș i infesta , iar in cele din urmă execută codul dă unator care de obicei const ă în
instalarea de “backdoors” pe sistem (modalităț i prin care persoana care a creat sau folosit
viermele poate avea acces la sistemul infestat ocolind sistemele de securitate ).
– Cai troieni : sunt programe de sine stătătoare ce deși par a î ndeplini o anumită
funcț ie legitim ă (un joc, o anumită aplicație ) execută în background secvenț e de cod ce
exploatea ză privilegiile utilizatorului ce l -a folosit . Deș i programul legitim este închis de
user, el ram ȃne deschis și poate oferi c elui ce l -a creat acces pe calculatorul infestat, poate
fura și tras mite date confidențiale (parole, conturi, etc), ș terge sau modifica fișiere, opri
aplicațiile antivirus/firewall sau î ncetin i sau chiar opri activitatea reț elei.
– Atac de recunoaș tere: descoperirea și cartografierea neautorizată a sistemelor,
serviciilor ș i vulnerabilităț ilor unui sistem, ceea ce duce deseori alte tipuri de atacuri.
– Atac de tip acces : exploatează vulnerabilităț i cunoscute ale serviciilor de
autentificare, FTP, se rvicii web, etc. pentru a avea acces la conturi web, baze de date sau alte
infor mații sensibile. De obicei implic ă un atac de tip dicț ionar (dictionary attack) sau de ti p
fortă brută (brute force) pentru a ghici parola de acces.
– Negarea serviciului : este poate cel mai des întalnit tip de atac și cel mai uș or de
realizat (de obicei cu ajutoru l unor scripturi sau programe) și constă î n trimiterea unui număr
extrem de mare de cereri unui server/calculator pȃnă cȃ nd acesta nu mai poate răspunde
cererilor legitime.
5
1.2. Criptografia utilizată în criminalitatea informatică.
Ranso mware Virus.
Ransomware Virus este un tip de software tip malware care resticționează accesul
victimei la informațiile și datele din calculator, prin cripatarea acestora folosind algoritmi de
criptare precum RSA, RC4 etc. și solicită efectuarea unei plăți , de obicei printr -o metodă greu
de depistat precum monezile virtua le (Bitcoin) sau diferite vouchere . Unele versiuni de
ransomware pretind că pe calculatorul virusat ar fi instalate aplicații piratate și plata se face
pentru a evita pedepsirea de către o autoritat e guvernamentală (de obicei, Poliție sau o agenție
locală) sau pentru firmele private se cere o răscumpărare pentru decripatarea datelor, acesta
fiind singura metodă de accesare a datelor și informațiilor criptate. Ransomware Virus poate
implica furtul de date sensibile , blocarea software -urilor legitime (anti -virus, anti -spyware,
etc.), afiș area de avertismente și producerea de alte activ ități nedorite. Primele versiuni ale
acestui tip de malware au fost lansate în Rusia. De atunci, acestea au avut o creștere
exponențială, întâlnindu -se în fiecare țară din lume.
Ȋn criminalitatea informatică s -au evidențiat trei tipuri de viruși ransomware care
utilizează varii metode pentru a face utilizatorii să plătească recompensa :1
Ransomware Virus ce criptează fișiere . Această tip de virus ranso mware se transmite
în general prin intermediu l troianilor. După ce se inf ecteză unitatea de calcul , va identifica
cele mai utilizate fișiere și le va cripta. De cele mai multe ori fișierele criptate includ imagini,
fișiere audio, date personale precum și alte date ce sunt consi derate ca fiind importante pentru
utilizatorul infectat . Acest ransomware va afișa pe displayul calculatorului un mesaj de
atenționare în care va pretinde că unicul mod de a dec ripta si accesa datele este prin plata
unei recompense.
Ransomware Virus urile non -criptare . Acest tip de virus blochează întregul sistem al
calculatorului și amenință utilizatorul să plătească o taxă inventată . În mod normal, sunt
utilizate nume precum F .B.I., poliție și altele. Imediat după ce sistemul este virusat , acesta va
fi scanat de fișiere ileg ale, precum conținut erotic sau aplicații nelicențiate din calculatorul
victimei . Imediat după identificarea acestor tipuri de programe nelicețiate , virusul va bloca
calculatorul și va afișa un mesaj tip informare folosindu -se de elementele de identificare ele
unei autorități guvernamentale. În acest caz, victima este informată că are fișiere sau aplicații
1 https://www.microsoft.com/en -us/wdsi/threats/ransomware
6
ilegale care au fost detectate după sc anarea calculatorului și somată să plătească o taxă
pentru a evita repercusiunile legii.
Ransomware Virus ce blochează browserul . Aceast tip de virus nu inf ectează
sistemul calculatorului și s e bazează pe JavaScript care blochează browserul și cauze ază o
notificare falsă foarte similară cu cea afișată de ransomwa re-ul non -criptare. În general,
denunță despre activitatea ilegală a utilizatorului pe internet și cere o recompensă pentru a
evita tragerea la raspundere din punct de vedere legal . Desigur, acești ransomware nu au
nimic de a face cu autorități le guvernamentale și valorifică teama utilizatorului de a fi
cercetat și tras la răspundere pentru fapte de natură penală .
Majoritatea virusurilor de tip ransomware sunt capabili să se propage și să infecteze
calculatoarele țintă fără știrea utilizatorului. Aceștia pot afecta calcula toare ce au instalate
diferite sisteme de operare precum Windows, Mac OS X, Android etc.. Există două metode
de distribuție prin care acești viruși pot intra în calculator:
Cal troian și alt malware . Majoritat ea paraziților ransomware sunt distribuiți prin
intermediul troianilor. Trojan.Lockscreen este cea mai des întȃlnită amenințare pentru
instalarea de ransomware în sistem. Aceștia intră în siste m fără știrea utilizatorului și se
răspȃndesc pri n fișiere atașate email -urilor care se prezintă ca venind de la expeditori de
încredere, precum Amazon, E bay, bănci , etc. După ce utilizatorul este înșelat în a
descărca un astfel de atașament în calculator, troianul, care are legătură cu ransomware –
ul, es te instalat în sistem.
Notificări de tip pop -up false . Unele sisteme pot fi infestate cu viruși de tip
ransomware ce sunt distribuite prin notificările false de t ip pop -up care pot fi văzute pe
website -uri ilegale , fie pe website -uri legitime. Maj oritatea sunt setate să raporteze despre
up-date-uri ce lipsesc, însă totodată, pot „informa” și despre o s canare gratuită ce este
utilă sistemului pen tru a elimina virușii. Aceste reclame conțin , de obicei, nume și
autentificări legitime dubioase, deci p ot înșela chiar și cei mai experimentați utilizatori în
a apăsa pe ele.
7
1.3. Viruși Ransomware : CRYPTOLOCKER,
WANNACRY PT, POLIȚIA ROMÂNĂ
CryptoLocker
Virusul CryptoLocker este un ransomware ce cripteză fișiere și care vizează
computerele cu sistem de operare Microsoft Windows, prima sa apariț ie pe Internet fiind pe 5
septembrie 2013. Virus ul CryptoLocker este transmis ca un ataș ament la un e-mail aparent
inofensiv , care pa re să fi fost t rimis de o companie cunoscută , de încredere. Fișierul ZIP
atașat mail-ului conț ine un doc ument cu o pictogramă PDF (de fapt este .EXE), profitând de
setarea implicită a Windows -ului de a ascunde extensia din numele fiș ierului.
Când este des carcăt și activat, virusul CryptoLocker ransomware criptează anumite
tipuri de fi șiere stocate pe calculator (fotografii, doc umente, videoclipuri, mail -uri etc.)
folosind criptarea asimetrică ce necesită atât o cheie publică, cât și o cheia privată salvată
doar pe serverul de control al virusului. Cheia publică este folosită pentru a cripta datele din
sistem, în timp ce cheia privatî este folosită pentru decriptare.
Fig. 1 – Process of asymmetric encryption from Microsoft
Crypto Locker este un malware ce afisează un mesaj care transmite utilizatorului că
datele vor fi decriptate numai în cazul î n care se efectueaz ă o plată, de obicei într -o monedă
virtuală, până la un termen stabilit ș i, mai mult, amenință că va șterge cheia privată în cazul î n
8
care termen ul limită trece, iar toate fisierele stocate în computer vor fi ș terse pentru
totdeauna, chiar dacă se instalează ulterior o aplicație pentru devirusare .
Fig. 2 – CryptoLoker Virus
Odată ce fiș ierele devin criptate, acestea sunt blocate î ntr-un mod pe care specialistii
din domeniul securității informatice îl consideră foarte greu de descifrat ș i spart. Autoritățiile
în domeniul combaterii infracționalității informatice susțin că ră scumpararea nu ar trebui sa
fie platită , dar nu au oferit nicio alta soluție de a recupera datele, î n timp ce specialiștii în
domeniu spun că plata răscumpără rii a fost singura modalitate de a intra din nou î n posesia
datelor virusate . Symantec, o companie americană având ca obiect de activitate cercetarea în
domeniul IT, a estimat că 3% dintre u tilizatorii care au fost afectaț i de C ryptoLocker au ales
să platească. Se crede ca dezvoltatorii virusului au câș tigat un total de aproximativ 3 milioane
$ de la victime ale calului troian.
WannaCry pt
WannaCrypt sau WannaCry este primul tip de ransomware ca re se instalează fără
vreo acțiune a utilizatorului și care folosește o vulnerabilitate prezentă în majoritatea
versiunilor sistemului de operare Windows, respectiv Vulnerabilitatea MS17 -010. Acest tip
9
de virus criptezază fi șierele folosind algoritmii de criptare AES și RSA ceea ce înseamnă că
pentru decriptare este necesară doar o cheie unică . Despre vulnerabiltiatea MS17 -010,
denumită și EternalBlue, s -a vorbit pentru prima oară în luna aprilie 2017, ca parte dintr -o
campa nie mai amplă de sustragere de date de către Agenția Națională de Securitate din SUA
(NSA). De această dată, atacatorii exploatează vulnerabilitatea care ar fi fost folosită atunci în
scopuri de spionaj de către agenții guvernamentale pentru a livra victim elor ransomware,
făcând -o una dintre cele mai periculoase versiuni de până acum.
La mijlocul lunii martie 2017, Microsoft a furnizat un patch care blochează
exploatarea vulnerabilității MS17 -010, dar un număr necunoscut de calculatoare și servere la
nivel global – inclusiv cele care folosesc versiuni învechite ale Windows – nu au primit
respectiva actualizare și riscă să fie infectate în orice moment.2
Fig. 3 – WannaCrypt Virus
Virusul ransomware Politia Română
Virusul Poliția Română se folosește de o vulnerabilitate Java (CVE -2013 -0422) și
reprezintă o amenințare informatică de tip ransomware, ce blochează accesul utilizatorului la
calculatorul infectat până când acesta plătește o taxă. Utilizatorul nu mai poate face nimic pe
2 https://www.microsoft.com/en -us/wdsi/threats/malware -encyclopedia –
description?Name=Ransom:Win32/WannaCrypt
10
calculator din acel moment, fiind blocat pe ecranul respectiv, orice restart va duce din nou în
același ecran.
Fig. 4 – Virusul Poliția Română
Majoritatea acestor atacuri sunt comandate de pe servere localizate in Marea Britanie,
Canada și Statele Unite, orice utilizator care foloseste versiunile vulnerabile de Java putând
deveni o victimă a acestui tip de virus .
11
Capitolul 2. Protocoale de comunicații
Internetul pune la dispoziția utilizatorului o serie diferită de aplicații și protoc oale în
funcție de care se utilizează diferite sisteme criptografice. Protocoalele sunt seturi de reguli
pe care toți utilizatori și orice software trebuie sǎ le respecte, pentru ca produsele lor sǎ fie
compatibile între ele. Un proto col de asemenea stabilește modalitate în care fiecare parte a
pachetului are grijǎ de transferul de date. A vând în vedere aceste considerente putem susține
că nu există un algoritm criptografic unic, bun pentru orice situație . Avansarea în proiectarea
criptogra fică, dar și în criptanaliză, duce la renunțarea unor algoritmi sau dezvol tarea unor
variante îmbunătățite din punct de vedere al securității.
Sistemele criptografice rulate pe internet pot fi clasificate în două mari categorii:
protocoale de rețea și programe/protocoale folosite pentru criptarea mesajelo r trimise prin
poșta electronic.
Protocolul de rețea reprezintă un sistem de comunicare pri n care mașinile din rețea
interacț ioneazǎ. Protocolul TCP /IP – Protocolul de Control al Transmisiei/Intern et Protocol,
care sunt de fapt douǎ protocoale separate este cel mai folosit pe sistemele Unix, iar
rețelistica Novell folosește un protocol numit IPX (InterPacket Exchange). Co toate ca se
găsesc protocoalele diferite, acestea folosesc în mare parte cam aceeași logică în ceea ce
privește comunicarea între dife rite unități, respectiv asambleazǎ informațiile și datele în
blocuri numite pachete, pe care le trimit în rețea.
Având în vedere ca fiecare mașinǎ care este conectatǎ la o rețea bazatǎ pe protocol ul
TCP/IP trebuie sa fie identificatǎ î n mod unic și anume printr -o adresă IP, în domeniul
criminalității informatice, hackerii folosesc de cele mai multe ori un sistem de rutare din
aproape -în-aproape, precum software -ul T.O.R. (The Onion Router) . Acest software a fost
creat în anul 1990 de către marina americană cu scopul de a proteja comunicațiile online ale
organizațiilor guvernamentale din SUA, iar in prezent are peste 2 milioane de utilizatori
zilnic în rețeaua sa .
T.O.R. înainte de a intra în rețe a distribuie datele în pachete criptate, iar apoi elimină
informații le din pachet precum sursa, dimensiunea și destinația pentru a nu se afla informații
despre expeditor. Înainte de a trimite datele prin mai multe servere sau relee diferite alese
aleator, T.O.R criptează restul informațiilor furnizate, astfel încât să nu poată fi urmărite.
Fiecare releu decriptează și apoi re -criptează doar suficiente date și informații pentru a ști de
12
unde a provenit și unde sunt transmise mai departe , dar nu poate urmări informațiile dincolo
de asta. Numai destinația poate decripta conținutul, care apoi este procesat și răspunsul este
trimis înapoi în același mod. Aceasta este structurată astfel încât serverul de destinație să nu
aibă nicio idee de unde provine cererea i nițială.
Datorită acestui design, utilizatorii rețelei T.O.R pot comunica cu diverse servere
(cum ar fi navigarea pe web) fără să se știe vreodată identitatea acestora. Un dezavantaj
folosirii acestui tip de navigare îl constituie faptul că T.O.R . trebui e să cripteze și să treacă
datele prin mai multe servere înainte de a ajunge la destinație, ceea ce înseamnă că este mult
mai lent decât o conexiune obișnuită. De asemenea, securitatea rețelei este în întregime
dependentă de securitatea nodurilor individua le.3
O alternativă la T.O.R. sunt și următoarele instrumente care pot ajuta ca utilizatorul să
rămână anonim în timp ce navighează pe internet:
I2P – utilizează o rețea de acoperire anonimă și o selecție colectivă pentru traficul
anonim.
Freenet – reprezintă un serviciu de distribuție a fișierelor , în care fișierele sunt stocate
pe unitățile computerului , nu într -o rețea, și distribuite în întreaga rețea , fără ca
utilizatorul să poate fi identificat. Oricărui utilizator, oricărui fișier, oricărui si te
corespunde o un algoritm de cifrare, nivelul complexității și securizării căruia poate fi
setat de utilizator.
JonDoFox – este un profil pentru Mozilla Firefox sau Firefox ESR. Computerul
utilizatorului se conectează la o serie de operatori Mix care ano nimizează traficul web
al utilizatorului și îl înfășoară în mai multe straturi de criptare.
GNUnet – este un instrument de partajare a fișierelor de tip peer -to-peer, care se
bazează pe grupuri mari pentru a împiedica identitatea celor care sunt atașați la grup.
Protocoale folosite pentru criptarea mesajelor trimise prin poșta electronic sunt
SMTP (Simple Mail Transfer Protocol) pentru transferul mesajelor de la expeditor la server,
și între servere, respectiv POP3 (Post Office Protocol) pentru primirea po ștei. De asemenea
un alt protocol care se folosește pentru transmiterea mesajelor electronice este IMAP
(Internet Message Access Protocol), o variantă îmbunătățită a POP3.
Criptarea mailului reprezintă cea mai răspândită metodă de protecție și se folosesc în general
două tehnologii pentru a face acest lucru: PGP (Pretty Good Privacy), respectiv PEM
3 http://scientia.ro/tehnologie/96 -internet/6153 -anonim -internet -cum -functioneaza -tor.html
13
(Privacy Enhanced Mail). Ambele permit atât confidențialitatea mesajelor prin criptarea
conținutului, cât și verificarea originii cu ajutorul semnăturilor digita le.
În ultima perioadă putem vorbi despre o nouă formă de transfer al datelor, așa numite
de valoare, constând în creeare unui portofel electronic și care funcționează prin transferul de
criptomonede (Bitcoins) prin intermediul internetului. Construcția ș i lansarea monedei
Bitcoin permite deținerea și transferul anonim de valoare prin intermediul internetului
oricărei persoane cu o adresă Bitcoin. Bitcoin nu se bazează pe încrederea într -un emitent
central și utilizează tehnologia peer -to-peer pentru a facilita tranzacțiile și se folosește de
criptografiea asimetrică pentru a furniza funcții de bază pentru securitate.
Criptografia asimetrică utilizează o pereche de chei asimetrice (publică și privată) și
provine de la utilizarea de chei diferite pentru a î ndeplini două funcții opuse (criptare și
decriptare), fiecare fiind inversul celeilalte. Transferul de sume între conturile publice
folosește cheile criptografice publice pentru a confirma tranzacțiile și a preveni dubla –
cheltuire. Cheia publică (comparabi lă cu numărul unui cont bancar) servește ca adresă care
este publicată în lume și la care alții pot trimite monezile virtuale. Cheia privată (comparabilă
cu un PIN ATM) este menită a fi un secret păzit și a fost folosit doar pentru a autoriza
tranzacțiile cu Bitcoin. Un mesaj creat cu cheia privată a emițătorului poate fi verificat de
oricine, prin acces la cheia publică corespunzătoare, astfel asigurându -se autenticitatea
mesajului.
Tranzacționarea cu monede Bitcoin sunt în întregime digitale și, la fel ca orice sistem
virtual, sunt expuse riscului atacurilor informatice și atacurilor malware . Principala problemă
apare atunci când este atacat computer ul unui proprietar de Bitcoin și îi este furată cheia
privată de criptare, hacker -ul putând transfera Bitc oins furate într -un alt cont . Acest lucru este
deosebit de problematic întrucât toate tranzacțiile Bitcoin sunt permanente și ireversibile.
Orice tranzacție efectuată cu bitcoins poate fi inversată numai în cazul în care persoana care
le-a primit le rambursează. Nu există un terț sau un procesator de plăți, ca în cazul unui card
de debit sau de credit – prin urmare, nici o sursă de protecție sau recurs în cazul în care există
o problemă.4
4 https://www.investopedia.com/terms/b/bitcoin.asp
14
Nr.crt Sistem Caracteristici Principalii
algoritmi
1. PCT (Private Communications
Technology) Protocol criptare
transmisii TCP/IP RSA
RC4
MD5
2. SSL (Secure Socket
Layer)
Protocol criptare
transmisii
TCP/IP RSA
RC4
MD5
3. S-HTTP – Secure –
HyperText Transfer
Protocol Protocol pentru
criptarea cererilor și
răspunsurilor HTML RSA
DES
4. SET (Secure Electronic
Transaction) Protocol criptare
transmisii de
instrucțiuni de platã
prin Internet RSA
MD5
RC2
5. CyberCash Protocol criptare
transmisii
instrucțiuni de platã
prin Internet RSA
MD5
RC2
6. Ipsec, Ipv5 Protocol de nivel
scãzut pentru criptarea
pachetelor IP Diffie -Hellman
7. DNSSEC (Domain Name System
Security)
Sistem pentru
securizarea
DNS RSA
MD5
8. Kerberos Securitate în rețea
pentru aplicațiile de
nivel înalt DES
9. SSH (Secure Shell) Protecție pentru Telnet
la
transferul de fișiere RSA
Diffie -Hellman
Des
Triple DES
10. S/MIME – Secure
Multipurpose Internet Mail
Extension Format pentru
criptarea poștei
electronice Specificații
utilizator
11. PGP (Pretty Good
Privacy) Aplicație pentru
criptarea poștei
electronice MD5
IDEA
RSA
Tabelul 1 – Principalii algoritmi de criptare utilizați în aplicațiile din Internet
15
Capitolul 3. Algoritmi de criptare
3.1. Criptografia asimetrică
„A private conversation can therefore be held between any two individuals regardless
of whether they have ever communicated before. Each one sends messages to the other
enciphered in the receiver public enciphering key and deciphers the messages he receives
using his own secret deciphering key. We propose som e techniques for developing public key
cryptosystems, but the problem is still largely open (…) We note that neither public
cryptosystems nor one -way authentication systems can unconditionally secure because the
public information always determines the sec ret information uniquely among members of a
finite set. With unlimited computation, problem could therefore be solved by a
straightforward touch .” (Hellman, 1976)5
Conceptul de criptografie asimetrică sau cu chei publice a fost inventat de Whitfield
Diffie și Martin Hellman. Inovația lor constă în propunerea de a folosi un nou criptosistem în
care cheile de criptare și decriptare sunt diferite, iar cheia de decriptare (care este privată) nu
poate fi dedusă din cheia de cript are (care este publică). În anul 1976 conceptul a fost
prezentat în premieră la National Computer Conference SUA, iar cîteva luni mai târziu
lucrarea a fost publicată .
Sistemele cu cheie publică au un mare avantaj față de sistemele cu chei secrete:
oricine poate transmite un mesaj secret utilizatorului (cunoscându -i cheia publică), iar
mesajul rămâne protejat față de interceptor. Cu un sistem cu cheie convențională, o cheie
separată secretă este necesară pentru fiecare pereche de utilizatori. Algoritmii c u cheie
publică își bazează securitatea pe dificultatea computațională a unor probleme din domeniile
informaticii teoretice sau a teoriei numerelor.6
Un canal este o cale pentru fluxul de informații; într -un mediu privat, calea este
protejată împotriva a ccesului din exterior. În general, un sistem cu n utilizatori necesită n*(n –
1)/2 chei, pentru ca oricare pereche de utilizatori să poată comunica între ei și mesajele lor să
rămână secrete față de ceilalți utilizatori. Numărul de chei crește rapid o dată c u numărul de
5Hellman, W. D. (1976). New Directions in Cryptography. Transction on Information Theory , 644.
6 Vasile Preda, Emil Simion și Adrian Popescu. Criptanaliza. Rezultate si Tehnici Matematice
(București. Universitatea București, 2011), p. 198.
16
utilizatori; generarea, distribuirea și menținerea securității cheilor constituie o problemă
datorită numărului lor mare.
Într-un sistem cu cheie publică, un utilizator deține două chei: o cheie publică și o
cheie privată. Utilizatorul își po ate face cunoscută oricui cheia publică.
Fie k PRIV cheia privată și k PUB cheia publică corespunzătoare.
Atunci:
P=D(k PRIV, E(k PUB,P))
Utilizatorul poate decripta cu cheia privată ceea ce oricine altcineva a criptat cu cheia publică
corespunzătoare.
Cu al doilea algoritm de criptare cu cheie publică
P=D(k PUB, E(k PRIV,P))
utilizatorul poate cripta un mesaj cu cheia privată, iar mesajul poate fi decriptat doar cu cheia
publică corespunzătoare.
Aceste două proprietăți presupun că cele două chei, publică și privată, pot fi aplicate în orice
ordine (sistemul RSA nu face distincție între cheia publică și cheia privată; orice cheie din
perechea de chei poate fi folosită fie ca cheie publică, fie ca cheie privată).
O schemă de criptare cu cheie publică (criptosistem cu cheie publică) constă în trei
algoritmi: algoritmul de generare a cheilor (PK,SK)← PKEGen(1k) care primește ca
parametru nivelul de securitate k și returnează perechea cheie publică -privată (PK,SK) ,
algoritmul de criptare PKE.Enc(m,PK) care primește mesajul m și cheia publică PK și
returnează criptotextul c= EPK (m) și algoritmul de decriptare PKE.Dec(c,SK) care primește
criptotextul c și cheia privată SK și returnează mesajul m . Toate acestea alături de spațiile din
care provin datele de intrare ale acestora (care fără a pierde generalitatea sunt spații ale
stringurilor binare).7
7 Bogdan Groza. Introduceri in Criptografie cu Cheie Publica (București, Editura Politehnica, 2007),
p. 77
17
Fig. 5 – Schema de principiu a unui sistem de criptare cu cheie asimetrică.
3.1.1 Algoritmul Rivest -Shamir -Adelman (RSA)
Algoritmul RSA a fost inventat de către Ron Rivest, Adi Shamir și Leonar Adleman
fiind studiat în cadrul unor studii criptana litice extinse. Acesta a fost publicat în 1978 și
rămâne un algoritm foarte folosit și astăzi, în ciuda eforturilor criptanaliștilor de a -l sparge
Securitatea RSA -ului se bazează pe dificultatea factoriză rii numerelor mari . Cheia publică și
cheia privată sunt funcție de o pereche de numere prime mari (de 200 de cifre sau chiar mai
mari). Recuperarea textului clar din cheia publică și textul cifrat este chivalent cu factorizarea
produsului a două numere prime.
Principiul de cifrare și descifrare constă în generarea a două chei (public ă și privată)
fapt pentru care se aleg aleatoriu două numere prime mari p și q. Din considerente de
securitate p și q au același ordin de mă rime.
Se va calcula produsul n = p ∙ q. Se va alege apoi, aleatoriu, cheia de cifrare e astfel
ca e și (p – 1)(q – 1) să fie relativ prime. Utilizâ nd algoritmul extins al lui Euclid vom calcula
exponentul de descifrare d astfel ca
ed ≡ 1mod( p -1)(q – 1)
Cu alte cuvinte :
d ≡ e -1 mod( p -1)(q – 1).
Remarcăm faptul că d și n sunt relativ prime. Numerele e și n constituie cheia publică iar d
este cheia privată. Cele două numere p și q nu sunt necesare dar nu vor fi niciodată fă cute
publice.
18
Pentru a cifra un mesaj m îl vom diviza în blocuri de lungime mai mică n (cu date binare vom
alege cea m ai mare putere a lui 2 mai mică decâ t n). Dacă p și q sunt numere prime de 100
cifre atunci n va avea sub 200 d e cifre iar f ecare mesaj bloc mi va avea sub 200 de cifre. Dacă
trebui e cifrate blocuri de lungime fixă atunci vom apela la operaț ia de padding cu zero.
Mesajul cifrat c se va obț ine prin concatenarea mesajelor ci care au aproximativ aceeiaș i
lungime. Formula de cifrare va fi :
ci ≡ m ie mod n.
Pentru a descifra un mesaj se calculează:
mi ≡ cid mod n;
deoarece
cid ≡ (mie)d ≡ mied ≡ mik(p-1)(q-1)+1 ≡ mimik(p-1)(q-1) ≡ mi mod n
Pentru a evita metodele de factorizare cunoscute , numerele p și q trebuie să fie numere prime
tari. Un număr prim p se numește numă r prim tare dacă :
i) p – 1 are un factor mare r;
ii) p + 1 are un factor mare s;
iii) r – 1 are un factor mare t.8
În continuare vo m descrie algoritmul de criptare RSA în pseudocod put ând foarte u șor
fi implementat în aproape orice limbaj de programare:
1. Generăm p,q – numere prime cat mai mari;
2. Fie n=p*q;
3. Fie m = (p -1)*(q -1)
4. Alegem e a.î. c.m.m.d.c(e,m)=1
5. Găsim d a. î. (d*e) % m = 1
6. C = Me % n; //Criptarea RSA
7. M = Cd % n //Decriptarea RSA
Unde : Cheia Publică : (e,n) ; Cheia Privată : (d,n).
M : mesajul inițial; C : mesajul Criptat ; % : operatia modulo;
Viteza algoritmilor tip RSA depinde de alegerea corespunzătoare a parametrului de
cifrare e. Cele mai utilizate valori pentru e sunt 3 (recomandat de standardul PEM (Privacy
8 Vasile Preda, Emil Simion și Adrian Popescu. Criptanaliza. Rezultate si Tehnici Mat ematice
(București. Universitatea București, 2011), p. 201.
19
Enhanced Mail) ș i standardul PKCS#1 (Public Key Cryptographic System)); 17 și 216 + 1
(recomandat de standardul de certificate digitale X.509 ș i standardul PKCS#1). Nu apar
probleme de securitate prin folosir ea orică ror acestor trei valori pentru e (presupunând faptul
că se face un padding al mesajelor cu valori aleatoare), chiar dacă un grup de utilizatori au
aceiași valoare pentru para metru l e. Viteaza operațiilpr private se po ate mă ri prin utilizarea
lemei chinezeș ti a resturilor (CRT) dacă se stochează valorile lui p, q, d mod (p – 1); d mod (q
– 1) și q-1 mod p. Utilizarea lemei chinezești a resturilor înlesneș te aplicarea atacurilor de tip
timp (timing attacks: î n funcție de timpul de execuție se pot dedu ce anumiți biț i din cheie) sau
atacuri de tip eroare hardware.
Fig. 6 – Viteza de criptare/decriptare RSA
Teoretic sunt trei posibilități de abordare a unui atac în cazul algoritmului RSA: atacul
în forță, atacul bazat pe metode matematice (încercarea factorizării produsului a două numere
prime mari) și atacul temporal. Singura cale cunoscută de a sparge complet sistemul RSA
este factorizarea modulului, reamintim însă că nu există nici o demonstrație că aceasta este
singura metodă de a sparge complet RS A-ul. Adică, nu există nici o demonstrație cu privire
la echivalența dintre RSA și prob lema factorizării întregilor . Mai mult, recent s-a instalat
mult scepticism cu privire la echivalența între securitatea RSA și problema factorizării
întregilor odată cu apariția articolului lui Boneh și Venkatesan .
Se poate ataca algoritmul RSA prin ghicirea l ui φ(n) = (p -1)(q-1). Acest lucru nu este mai
simplu decât problema factoriză rii.
20
O serie de v ariante ale RSA s -au dovedit a fi la fel de difi cile ca problem a facto rizării.
Deasemenea au fost realizate studii care au pus în evidentă faptul că recuperarea unor biți de
informaț ie dintr -un mesaj cifrat, este la fel de greu de realizat ca decriptarea î ntregului mesaj.
Factorizarea lui n este cea mai uzua lă metodă de atac. Orice adversar are la dispoziție cheia
publică e și modulul de cifrare n. Pentru a gă si cheia de descifrare d trebuie factorizat n.
Acest lucru se poate realiza cu ajutorul tehnologiei de fac torizare. La nivelul anului 1996
factorizarea unui numă r de 129 cifre era fezabilă . Deci n trebuie să fi e mai mare (se poate lua
n de 2048 biț i). Metoda de atac brut este mai puțin eficientă decât tehnica factoriză rii.
Cei mai mulț i algoritmi folosesc tehnici probabiliste pentru a a calcula numere
prime p și q.9
În mod cert RSA este criptosistemul cu cheie publică cel mai intens studiat , astfel, o
gamă relativ largă de atacuri și vulnerabilități ale RSA au fost publicate.
Atacurile pasive , care au ca sursă un adversar care încearcă off -line să spargă criptosistemul,
dintre acestea amintim:
– Atacul prin factorizare presupune factorizarea întregului n cu ajutorul
algoritmilor cunoscuți. În prezent acest lucru este destul de dificil, poate chiar
imposibil, pentru valori suficient de mari ale lui n .
– Atacul prin căutarea directă a mesajului (forward -search) este un atac
general, fezabil asupra oricărui criptosistem cu cheie publică. Deoarece cheia
publică este prin definiție publică un adversar, având un criptotext capturat, poate
face o căutare exhaustivă î n cazul în care spațiul mesajului este redus.
În al doilea rând și mult mai periculoase sunt atacurile active pentru cazul în care un
adversar are acces la mașina de decriptare (fiind cripta te cu cheie publică accesul la m așina
de criptare este evident) :
– Atacul prin temporizare . În mod cert cantitatea de timp necesară decriptării
poate conduce la informații suplimentare despre exponentul utilizat. Soluția
împotriva acestor atacuri este fie de a fixa un timp fix de calcul indiferent de
dimensiunea exponentu lui, fie de a efectua operații suplimentare în mod aleator
pentru a deruta adversaru .
– Adaptive chosen chipertext -attack
Câteva vulnerabilități ale RSA -ului comun cunoscute trebuie evitate cu orice preț:
9 Vasile Preda, Emil Simion și Adrian Popescu. Criptanaliza. Rezultate si Tehnici Matematice
(București. Universitatea București, 2011), p. 203.
21
– Exponenții de criptare sau decriptare relativ mici . Atacul asupra unui
exponent mic de criptare presupune existența unei relații între mesajele criptate și
se contracarează prin extinderea mesajului cu biți aleatori. Exponențiimici de
decriptare trebuie evitați în practică (evitarea decurge în modnatural d eoarece în
practică se utilizează exponenți de criptare mici sau cu forme speciale și aceștia
fac ca exponenții de decriptare să fie mari).
– Atacul bazat pe teorema cchineză a resturilor deoarece în cazul criptării cu
exponent mic a aceluiași mesaj folosin d mai multe module diferite, mesajul ar
putea fi extras ca rădăcină reală a criptotextului (calculul rădăcinii reale este
fezabil în timp polinomial, a se vedea capitolul de fundamente matematice pentru
teorema chineză a resturilor).
– Problema modulului com un. Utilizarea aceluiași modul de către mai mulți
participanți nu este posibilă deoarece cunoașterea unei perechi de chei publică –
privată duce iminent la factorizarea modulului și pierderea securității între
participanți.
– RSA balansat și RSA nebalansat . Varianta de RSA în care cele două numere
prime sunt alese ca având aproximativ aceeași dimensiune poartă numele de RSA
balansat și este varianta recomandată și utilizată în practică. Shamir a propus și
utilizarea unei variante de RSA numite RSA nebalansat c are are rezistență mult
mai mare decât RSA balansat împotriva factorizării și are aceeași viteză de
criptare/decriptare.10
Condiții necesare dar nu și sufi ciente pentru asigurarea securității crip tografice a
RSA :
– cunoasterea unei perechi de exponenț i cifrare/descifrare pentru un modul dat
permite factorizarea modulului;
– cunoaș terea unei perechi d e exponenț i cifrare/descifrare pentru un modul dat
permite generarea de noi exponenț i de cifrare/descifrare;
– nu trebuie utilizat un modul pentru un gru p de utilizatori;
– trebuie realizat un padding al mesajelor pentru a preveni atacul cu ajutorul
expone nților de cifrare mici, precum ș i atacul de tip eroare hardware (în cazul utiliză rii CRT
pentru optimizarea operaț iilor private);
– expo nentul de des cifrare trebuie să fi e mare.
10 Bogdan Groza. Introduceri in Criptografie cu Chei e Publica (București, Editura Politehnica, 2007),
p. 89
22
Trebuie remarcat faptul că aceste elemente nu sunt sufi ciente pentru a proiecta un
algoritm criptografic sigur. Întregul sistem trebuie să fi e sigur din punct de vedere
criptografic ca și protocoalele criptografice. O vulnerab ilitate î n oricare din aceste trei
domenii conduce la un sistem nesigu r din punct de vedere criptografi c.
3.2 Criptografia Simetrică
Conceptul de Criptografie Simetrică se referă la algoritmii cu cheie secretă ce sunt
caracterizați de faptul că folosesc aceeași cheie atât în procesul de criptar e, cât și în cel de
decriptare. Pentru aplicarea lor este necesar ca înaintea c riptării i/decriptării , atât emițătorul
cât și receptorul să posede deja cheia respectivă. În mod evident, cheia se se folosește la
criptarea mesajului trebuie să fie secretă.
Fig. 7 – Criptografia Simetrică11
Rapiditatea cu care sunt realizate procesele de criptare / decriptare a mesajelor
reprezintă un avantaj al criptării simetrice. Avantajul sistemului se bazează pe dimensiunea
cheii. Dacă depășeste dimensiunea de 128 biți este una destul de sigură, deci sigură în
exploatare. Cele trei atuuroi ale criptării simetrice sunt rapiditatea , siguranța și capacitatea
ridicată de informații criptate . Având in vedere ca se impun e un schimb de chei private
înainte de a se începe transmisia de date , este necesar un canal cu transmisie protejată pentru
11 http://codare -date.cpf.ro/criptare -simetrica.php
23
a putea fi transmise cheile de criptare / decriptare ceea ce reprezintă un dezavantaj al acestui
tip de criptare.
Codurile de criptare cu cheie simetrică pot fi împărțite în două mari categorii după
modul în care prelucrează mesajul ce urmează a fi criptat:
Coduri bloc (block ciphers) : sunt algoritmi de criptare care operează asupra
mesajului ce trebuie c riptat bloc cu bloc, fiecare bloc având dimensiune fixă de la 32
la 128 biți (deci criptează un bloc la un moment dată).
Coduri stream (stream ciphers) : sunt algoritmi de criptare care criptează „bit cu bit”
(practic lungimea blocului este 1) și transforma rea de criptare se poate modifica
pentru fiecare caracter în parte .12
Modurile de cifrare constituie combinații ale celor două tipuri de bază , unele folosind
metode feedback, altele realizând simple operații. Aceste operț ii sunt simple, deoarece
securitatea este atributul cifrării ș i nu al modu lui în care se realizeză schema de cifrare. Mai
mult, modul de realizare a cifră rii nu duce la compromiterea securității date de algoritmul de
bază.
Un cifru bloc cifrează textul în blocuri de n biți de mări mi fixe. Î n general este folosită
valoarea n = 64 biț i. Cele mai cunoscute moduri de operare sunt ECB (electronic code book),
CBC (cipher block chaining) , CFB (cipher feedback block) ș i OFB (output feedback block).
În funcț ie de modul de operare al cifrului bloc se vor aplica atacuri specifice.13
În construcția funcțiilor criptografice simetrice există două operații universal utilizate:
1. Substituția înseamnă înlocuirea unor simboluri sau grupuri de simboluri prin
alte simboluri sau grupuri de simboluri și cre ează confuzie.
2. Transpoziția (sau permutarea) – înseamnă permutarea (amestecarea)
simbolurilor din cadrul unui bloc și creează difuzie (numită uneori și
difuziune).
Aceste două noțiuni au fost introduse pentru prima dată de Claude Shannon în 1949 și
reprez intă concepte fundamentale în construcția schemelor moderne de criptare simetrică.
Toate schemele moderne conțin casete de substituție S -Box și permutare P -box pentru a crea
confuzie și difuzie. Se folosește termenul de cifru produs (product cipher) pentru a desemna
un cifru obținut din combinarea a două sau mai multe proceduri care conduc la un
12 Bogdan Groza. Funcții Criptografice, Fundamente Matematice și Computaționale (București,
Editura Politehnica, 2007), p. 89
13 Vasile Preda, Emil Simion și Adrian Popescu. Criptanaliza. Rezultate si Tehnici Matematice
(București. Universitatea București, 2011), p. 203.
24
criptosistem mai sigur decât utilizarea individuală a acestora. Astfel, o rețea de substituții (S)
și permutări (P), denumită în general rețea -SP (SP -network), este unul dintre cele mai simple
cazuri de cifruri produs.
3.2.1 Algoritmul AES (Advanced Encryption Standard)
În ianuarie 1997, NIST ( National Institute of Standards and Technology ) a organizat
un concurs de criptografie deschis cercetătorilor din întreaga lume, având ca subiect crearea
unui nou standard, care urma să se numească AES . Regulile concursului erau:
– algoritmul să fie un cifru bloc simetric;
– proiectul trebuia să fie public;
– AES trebuia să suporte chei de 128, 192 și 256 biți;
– algoritmul trebuia să se poată implementa atât hardware cât și software;
– AES trebuia să fie un standard public sau oferit cu licență ne discriminatorie.
În august 1998 NIST a selectat cin ci finaliști pe criterii de securitate, eficiență,
flexibilitate și cerințe de memorie , iar în octombrie 2000 a stabilit câștigătorul. Acesta este
algoritmul Rijndael, dezvoltat de doi tineri cercetători belgieni, Joan Daemen și Vincent
Rijmen și care devi ne standard guvernamental al SUA.
Rijndael permite lungimi de chei și mărimi de blocuri de la 128 de biți la 256 de biți,
în pași de câte 32 de biți. Lungimea cheii și lungimea blocului pot fi alese în mod
independent, dar în practică se vor folosi două variante: bloc de 128 biți cu cheie de 128 biți
și bloc de 128 biți cu cheie de 256 biți. Standardul comercial va deveni cel mai probabil
varianta 128/128. O cheie de 128 biți permite un spațiu al cheilor de 2128 chei.14
Deoarece AES este mai rapid decât al te coduri simetrice, chiar și decât 3DES, și oferă cel
puțin același nivel de securitate nu există nici un motiv de a utiliza altceva decât AES în
arhitecturi de securitate contemporane.
Descrierea algoritmului AES
Operaț iile algoritmului AES sunt defini te sub forma de operțtii pe matrice, unde atât
cheia, câ t si blocul sunt scrise sub forma unei matrice de 4 linii și n coloane . La inceputul
rulării cifrului, blocul este copiat într-un tablou denumit stare (engl: ”state”), primii patru
octeți pe prima coloană, apoi următorii patru pe a doua coloană, și tot așa până la completarea
tabloului.
14 Aureliu Zgureanu. Metode criptografice de protecție a informației (Chișinău, 2014 ). p. 89 .
25
Algoritmul modifică la fiecare pas acest tablou de numere denumit state, ș i îl
furnizează apoi ca ieșire. Funcț ionarea sa este descris ă de urmă torul pseudocod:
1. Cifru(byte in[4*n ], byte out[4*n], word w[Nb*(n +1)]) ;
2. Începe;
3. Byte state[4,n ];
4. State = in ;
5. AddRoundKey(state, w[0, n -1]);
5. For round = 1 step 1 to n –1 Begin;
6. SubBytes(state) ;
7. ShiftRows(state) ;
8. MixColumns(state);
9. AddRoundKey(state, w[round*n, (round+1)*n -1]);
10. E nd for ;
11. ShiftRows(state) ;
12. AddRoundKey(state, w[Nr*n, (Nr+1)*n -1]);
13. out = state ;
14. end;
n – numarul de coloane al starii (varianta standardizat fiind intotdeauna 4 ).
Nr – este 10, 12 sau 14, pentru chei pe 128, 192, respectiv 256 biti, depinzând de
lungimea cheii.
SubBytes – mai este denumit Rijndael S -box și rulează independent pe fiecare octet
din state. Ace asta transformare este neliniară facând ca î ntreg c ifrul sa fie neliniar oferindu -i
un nivel spori t de securitate. Fiecare octet este calculat astfel:
b’i=bi+b(i+4)mod8 + b(i+5)mod8 + b(i+6)mod8+ b(i+7)mod8 +ci
unde ”+” – operația XOR ,
bi – bitul corespunzator pozitie i i din cadrul octetului,
ci – bitul corespunzator pozi tiei i din octetul ce reprezintă valoarea
hexazecimala 63, sau, pe biti, 01100011.
26
Fig. 8 – Pasul SubBytes
ShiftRows – operează la nivel de rând al matricii de stare și reprezintă deplasare a
ciclică a octeților de pe rânduri. Rezultatul acestui pas este că fiecare coloană din tabloul state
rezultat est e compusă din octeți de pe fiecare coloană a starii initiale. Acesta este un aspect
important, din cauza ca tabloul state este populat ini țial pe coloa ne, iar paș ii ulteriori
operaț iile se efec tuează pe coloane.
Fig. 9 – Pasul ShiftRows
MixColumns – fiecare coloană a tabloului de stare este considerata un polinom de
gradul 4 peste co rpul Galois GF(28). Fiecare coloană, tratată ca polinom, este inmultită ,
modul o x4 + 1 cu polinomul c(x) = 3×3 + x2 +x + 2.
Rezultatul are proprietatea c ă fiecare element al s ău depinde de toate elementele de pe
coloana st ării dinaintea efectuarii pasului. Combinat cu pasul ShiftRows sunt principala sursa
de difuzie în algoritmul Rijndael. Din motive de performanta , coeficientii polino mului c(x)
sunt toti 1, 2 si 3, criptarea fiind mai eficienta atunci cand coeficientii sunt mici. La
decriptare, coeficienț ii pasului coresp unzator acestuia sunt mai mari ș i deci decrip tarea este
mai lentă decât criptarea.
27
Fig.10 – Pasu l MixColumns
AddRoundKey – reprezintă etapa în care este implicată cheia și constă într -o simplă
opera ție de „sau” exclusiv pe bi ți între stare și cheia de rundă (o cheie care este unică pentru
fiecare itera ție, cheie calcul ată pe baza cheii secrete). Operatia de combinare cu cheia s ecreta
este una extrem de simplă și rapidă, dar algoritmul rămâ ne complex, din cauza complexităț ii
calculului cheilor de runda (Key Schedule), precum și a cel orlalți paș i ai algoritmului.
Fig.11 – Pasul AddRoundKey
Cheia de rund ă este calculată dupa algoritmul urmă tor:
1. KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
2. begin
3. word temp
4. i = 0
5. while (i < Nk)
6. w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4* i+3])
7. i = i+1
8. end while
9. i = Nk
28
10. while (i < n * (Nr+1)]
11. temp = w[i -1]
12. if (i mod Nk = 0)
13. temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
14. else if (Nk > 6 and i mod Nk = 4)
15. temp = SubWord(temp)
16. end if
17. w[i] = w[i -Nk] xor temp
18. i = i + 1
19. end while
20. end
Algoritm ul funcționează pe cheia algoritmului de lungime Nk , cuvinte de 4 octeț i (4,
6 sau 8, conform standardului), generând un tabel de n (Nr+1) cuvinte.
n – numarul de cuvinte al blocu lui (4 – standardizat)
Nr – numă rul de runde (itera ții), dependent de lungimea cheii.
SubWord – substituție a octeților identică cu cea din pasul SubBytes
RotWord – rotație ciclică la stănga cu un octet a octeț ilor dintr -un cuv ănt
Rcon[i] – un cuvâ nt format din octetii [2i-1,{00}, {00}, {00}]. Operaț ia de ridicare la putere
este ai ci cea valabil ă în corpul Galois GF(28).
Tabloul w – conține la finalul prelucră rii cuvintele de pe coloanele cheilor de rundă, î n
ordinea în care urmează sa fie aplicate.
Avantajele AES relativ la implementare sunt:
AES se poate implementa pe o unitate cu perofrmante mai reduse și va rula cu
o viteză mai mare decât orice alt cifru bloc;
AES se poate implementa pe un dispozitiv Smart Card, neavând nevoie de o
capacitate mare dememorie RAM și are un număr redus de cicluri;
-transformarea din cadrul unei runde este paralelă prin proiectare, ceea ce
constituie un avantaj pentru viitoarele procesoare;
AES folosește 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 c ifre din dezvoltarea numărului ;
29
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”.
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ăru l 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 sunt în legătură cu algoritmul de decriptare:
algoritmul de decriptare este mai puțin pretabil la implemen tarea 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 de criptare refolosește doar parțial
circuitele care implementează algoritmul de criptare.15
15 Bogdan Groza. Funcții Criptografice, Fundamente Matematice și Computaționale (București,
Editura Politehnica, 2007), p. 91,92.
30
Capitolul 4. Implementarea algoritmilor în Java
Pentru implementar ea algoritmilor RSA și AES în Java am folosit software -ul open
source IntelliJ IDEA Community Edition 2018.1.3 x64 .
4.1 Criptarea AES
Pentru a demonstra criptarea AES în Java vom fo losi pachetele “javax.crypto” și
clasele corespunzatoare. Pentru implementare, Cr iptorul nostru AES va fi o clasă al că rui
constructor va primi ca ș i parametru o cheie AES, exemplu mai jos :
public CriptorAES (String cheieAES) throws Exception {
byte[] bytes = cheieAES.getBytes( "UTF-8");
this.cipher = Cipher. getInstance ("AES");
this.secretKey = new SecretKeySpec(bytes , "AES");
}
• Constructorul va fi responsabil de instanțierea “CriptorAES”; în implementarea
noastră , o instanta de criptor nu poate exista fara o cheie AES ;
• Dupa cum se observă transformăm cheia primită într -un array de bytes folsind UTF -8;
• Folosim de asemenea clasele javax.cripto.Cipher și javax.cipher.SecretKeySpec ,
ambele primind ca ș i para metru algoritmul folosit ca un ș ir de caratere “AES” ;
• ”Cipher” este componenta care va face cri ptarea si decriptarea mesajelor;
• “SecretKeySpec” este un wrapper peste cheia noastra ce va fi folosit de Cipher la
criptare si decriptare;
• “cipher” si “secretKey” sunt câ mpuri ale criptorului, ele vor fi folosite la
criptare/decriptare;
• Criptorul nostru AES dup ă instanțiere va conține o cheie “secretKey” ș i un “cipher” ;
• Pentru criptare vom implementa o metodă ce va primi un ș ir de c aractere ce trebuie
criptat ca și parametru ș i va folosi cipher și secretKey pentru a cripta mesajul,
returnând mesajul critptat;
• public String cripteaza (String text) throws Exception {
cipher.init(Cipher. ENCRYPT_MODE , secretKey );
31
byte[] bytes = cipher.doFinal(text.getBytes( "UTF-8"));
return Base64.getEncoder ().encodeToString(bytes) ;
}
• Pentru a putea cr ipta folosind “Cipher” trebuie să -l inițializam în modul
“Cipher.ENCRYPT_MODE” și să -i furnizam cheia secretKey ;
• Apoi ap elăm metoda doFinal cu textul primit ca parametru tranformat î n byte array
folosind UTF -8;
• Rezultatul me todei doFinal este textul criptat sub formă de byte array pe care îl
returnăm sub forma de șir de caractere encodate î n Base64 pentru care folosim
java.util.Base64 ;
• Pentru decriptare , implementarea este foarte similar ă cu cea folosită la criptare,
diferența fiind că acum folos im modul “Cipher.DECRYPT_MODE” și în plus
decodă m mesajul din Base64 ;
• public String decripteaza (String tex t) throws Exception {
cipher.init(Cipher. DECRYPT_MODE , secretKey );
byte[] bytes = cipher.doFinal(Base64. getDecoder ().decode(text)) ;
return new String(bytes , "UTF-8");
• Metoda initializează cifrul cu Cipehr.DECRYPT_MODE și cheia secretă;
• Aplează cipher.doFinal cu ș irul de caractere decodat folosind Base64
• Byte array -ul rezultat este practic mesajul decriptat și este convertit în șir de caractere
folosind UTF -8 și returnat.
• Codul sursa al criptarii AES – CriptorAES.java
• package ro.cripto.alg.aes ;
import javax.crypto.Cipher ;
import javax.crypto.spec.SecretKeySpec ;
import java.util.Base64 ;
public class CriptorAES {
private SecretKeySpec secretKey ;
private Cipher cipher;
/**
* Construieste o instanta a Criptorul ui AES
* @param cheieAES
*/
public CriptorAES (String cheieAES) throws Exception {
byte[] bytes = cheieAES.getBytes( "UTF-8");
this.cipher = Cipher. getInstance ("AES");
this.secretKey = new SecretKeySpec(bytes , "AES");
}
32
/**
* Folosind cheia secreta, cripteaza mesajul specificat
*
* @param text
* @return mesajul criptat
* @throws Exception
*/
public String cripteaza (String text) throws Exception {
cipher.init(Cipher. ENCRYPT_MODE , secretKey );
byte[] bytes = cipher.doFinal(text.getBytes( "UTF-8"));
return Base64.getEncoder ().encodeToString(bytes) ;
}
/**
* Folosind cheia secreta, decripteaza mesajul specificat
*
* @param text
* @return mesajul decriptat
* @throws Exception
*/
public String decripteaza (String text) throws Exception {
cipher.init(Cipher. DECRYPT_MODE , secretKey );
byte[] bytes = cipher.doFinal(Base64. getDecoder ().decode(text)) ;
return new String(bytes , "UTF-8");
}
}
4.2 Criptarea RSA
ș Algoritmul RSA poate fi folosit în java cu aceleași clase ca și AES împreună c u alte
patru clase:
– java.security. PrivateKey reprezentarea î n java a unei chei private
– java.security. PublicKey reprezentarea î n java a unei chei publice
– java.security. KeyPair o pereche de chei publică/privată
– java.security. KeyPairGenerator generator de chei publice/private din java
ș Pentru RSA vom avea î n plus pe langa cript o și un generator de chei RSA care va
putea genera și scrie cheile în fiș iere separate ;
public class GeneratorDeCheiRsa {
private KeyPairGenerator generatorDePerechiDeChei ;
private KeyPair perecheDeChei ;
private PrivateKey cheiePrivata ;
private PublicKey cheiePublica ;
33
public GeneratorDeCheiRsa (int lungimeCheie) throws Exception {
this.generatorDePerechiDeChei = KeyPairGenerator. getInstance ("RSA");
this.generatorDePerechiDeChei .initialize(lungimeCheie) ;
}
ș Generatorul de chei con ține logica ce ne va permite generarea cheilor și scrierea lor în
fișiere;
ș Folosim un KeyPairGenerator pen tru generarea perechii de chei și îl inițializă m in
constructor cu o lungime de cheie primită ca parametru ;
ș Folosim metoda static ă “KeyPairGenerator. getInstance” spre care pasă m ca paramet ru
algorimtul “RSA” pentru a obține instanța generatorului pe care ulterior o inițializă m
folosind metoda “initialize” care primeș te lungim ea de cheie c a parametru ;
ș public void creeazaChei () {
this.perecheDeChei = this.generatorDePerechiDeChei .generateKeyPair() ;
this.cheiePrivata = perecheDeChei .getPrivate() ;
this.cheiePublica = perecheDeChei .getPublic() ;
}
public PrivateKey obtineCheiePrivata () {
return cheiePrivata ;
}
public PublicKey obtineCheiePublica () {
return cheiePublica ;
}
ș Generarea cheilor se realizeză prin metoda creeazaChei care folosește generatorul
inițializat în constructor pentru a obț ine o pereche de chei folosind metoda
“generateKeyPair” ;
ș Câmpurile cheiePrivata, cheiePublica sunt iniț ializate cu valoarea cheilor
corespunzatoa re din perechea de chei generată;
ș Câmpurile cheiePublica ș i cheiePrivata sunt expuse apoi cu metodele
obtineC heiePrivata ș i obtineCheiePublica care vor returna cheia corespunzatoare ;
ș public void scrieInFisierCheiaPublica (String path) {
File fisier = new File(path) ;
//creem directorul in caz ca nu exista
fisier.getParentFile().mkdirs() ;
byte[] cheiePublicaEncoded = cheiePublica .getEncoded() ;
//scriem in f isier byte array -ul specificat
try (FileOutputStream outputStream = new FileOutputStream(fisier)) {
outputStream.write(cheiePublicaEncoded) ;
outputStream.flush() ;
} catch (IOException e) {
e.printStackTr ace();
}
34
}
public void scrieInFisierCheiaPrivata (String path) {
File fisier = new File(path) ;
//creem directorul in caz ca nu exista
fisier.getParentFile().mkdirs() ;
byte[] cheiePrivataEncoded = cheiePriv ata.getEncoded() ;
//scriem in fisier byte array -ul specificat
try (FileOutputStream outputStream = new FileOutputStream(fisier)) {
outputStream.write(cheiePrivataEncoded) ;
outputStream.flush() ;
} catch (IOException e) {
e.printStackTrace() ;
}
}
}
ș Pentru a scrie în fiș ier folosim utilitarele din java.io ;
ș Primim ca parametru calea spre fiș ierul unde dorim să scriem cheia ;
ș Construim un File din acea cale (parametrul path), și ne asigurăm că toate directoarele
spre acel fiș ier sunt create cu “fisier.getParentFile().mkdirs()” ;
ș Folosim metod a getEncoded de pe cheia privată sau publică pentru a obț ine cheia sub
forma byte array ;
ș Scriem acel byte array în fiși erul creat folosind un FileOutputStream și metoda
write ;
ș Se foloseș te metoda flush pentru a finaliza scrierea. Java va garanta apelul spre
metoda close a FileOutputStream deoarece am creat instanța î n cadrul try(),
FileOutputStream este AutoClosabl e
ș private Cipher cipher;
public CriptorRsa () throws NoSuchAlgorithmException , NoSuchPaddingException
{
this.cipher = Cipher. getInstance ("RSA");
ș Constructorul nu face decât să obțină o instanță de Cipher folosind algorimtul RSA ;
ș Avem însă în plus față de AES două metode pentru î ncarcarea cheilor de pe disk :
• public PrivateKey obtineCheiePrivata (String numefisier) throws Exception {
//citeste fisierul intr -un byte array
byte[] bytesCheie = Files. readAllBytes (new File(numefisier).toPath()) ;
//obine instanta unei chei private (PrivateKey) folosind KeyFactory
return KeyFactory. getInstance ("RSA").generatePrivate( new
PKCS8EncodedKeySpec(bytesCheie)) ;
}
public PublicKey obtineCheiePublica (String numeFisier) throws Exception {
byte[] bytesCh eie = Files. readAllBytes (new File(numeFisier).toPath()) ;
35
return KeyFactory. getInstance ("RSA").generatePublic( new
X509EncodedKeySpec(bytesCheie)) ;
}
ș Ambele meto de primesc calea spre fiș ierul ce conține cheia;
ș Se citește fișierul î ntr-un byte array ;
ș Se foloseș te java.security.KeyFactory pentru a genera cheia din acel byte array printr –
un EncodedKeySpec ce poate fi X509 pentru cheia public ă sau PKCS8 pentru cheia
privată;
ș public String cripteaza (String mesaj , PrivateKey cheiePrivata) throws
Exception {
this.cipher.init(Cipher. ENCRYPT_MODE , cheiePrivata) ;
byte[] mesajCriptatInBytes = cipher.doFinal(mesaj.getBytes( "UTF-8"));
return Base64.getEncoder ().encodeToString(mesajCriptatInBytes) ;
}
public String decripteaza (String mesaj , PublicKey che iePublica) throws
Exception {
this.cipher.init(Cipher. DECRYPT_MODE , cheiePublica) ;
byte[] mesajDecodat = Base64. getDecoder ().decode(mesaj) ;
return new String(cipher.doFinal(mesajDecodat) , "UTF-8");
}
ș Ca ș i la AES criptarea/decriptarea presupun e inițializarea Ci pher cu modul
ENCRYPT_MODE sau DECRYTP_MODE, respectiv cheia care de această dată
trebuie să fie o cheie publică(decriptare) sau privată(criptare);
ș De asemenea cheia este primită ca parametru la metoda;
ș Mesajul este codat ș i deco dat folosind Base64 si UTF -8.
ș Codul sursă al cript ării RSA: CriptorRsa.java și GeneratorDeCheiRsa.java
ș CriptorRsa.java
ș package ro.cripto.alg.rsa ;
import javax.crypto.Cipher ;
import javax.crypto.NoSuchPaddingException ;
import java.io.File ;
import java.nio. file.Files ;
import java.security.KeyFactory ;
import java.security.NoSuchAlgorithmException ;
import java.security.PrivateKey ;
import java.security.PublicKey ;
import java.security.spec.PKCS8EncodedKeySpec ;
import java.security.spec.X509EncodedKeySpec ;
import java.util.Base64 ;
public class CriptorRsa {
private Cipher cipher;
public CriptorRsa () throws NoSuchAlgorithmException ,
NoSuchPaddingException {
this.cipher = Cipher. getInstance ("RSA");
36
}
public PrivateKey obtineCheiePrivata (String numefisier) throws
Exception {
//citeste fisierul intr -un byte array
byte[] bytesCheie = Files. readAllBytes (new
File(numefisier).toPath()) ;
//obine instanta unei chei private (PrivateKey) folosind
KeyFactory
return KeyFactory. getInstance ("RSA").generatePrivate( new
PKCS8EncodedKeySpec(bytesCheie)) ;
}
public PublicKey obtineCheiePublica (String numeFisier) throws
Exception {
byte[] bytesCheie = Files. readAllBytes (new
File(numeFisier).toPath()) ;
return KeyFactory. getInstance ("RSA").generatePublic( new
X509EncodedKeySpec(bytesCheie)) ;
}
/**
* Cripteaza mesajul folsind cheia privata specificata
*
* @param mesaj mesaj de criptat
* @param cheiePrivata chiea privata ce va fi folosita pentru
criptare
* @return mesajul criptat encodat in base64
* @throws Exception
*/
public String cripteaza (String mesaj , PrivateKey cheiePrivata) throws
Exception {
this.cipher.init(Cipher. ENCRYPT_MODE , cheiePrivata) ;
byte[] mesajCriptatInBytes = cipher.doFinal(mesaj.getBytes( "UTF-
8"));
return Base64.getEncoder ().encodeToString(mesajCriptatInBytes) ;
}
/**
* Decripteaza mesajul folosind cheia publica specificata
*
* @param mesaj criptat encodat in base64
* @param cheiePublica cheia publica folosita la decriptare
* @return
* @throws Exception
*/
public String decripteaza (String mesaj , PublicKey cheiePublica)
throws Exception {
this.cipher.init(Cipher. DECRYPT_MODE , cheiePublica) ;
byte[] mesajDecodat = Base64. getDecoder ().decode(mesaj) ;
return new String(cipher.doFinal(mesajDecodat) , "UTF-8");
}
}
37
ș GeneratorDeCheiRsa.java
ș package ro.cripto.alg.rsa ;
import java.io.File ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.security.KeyPair ;
import java.security.KeyPairGenerator ;
import java.security.PrivateKey ;
import java.security.PublicKey ;
public class GeneratorDeCheiRsa {
private KeyPairGenerator generatorDePerechiDeChei ;
private KeyPair perecheDeChei ;
private PrivateKey cheiePrivata ;
private PublicKey cheiePublica ;
public GeneratorDeCheiRsa (int lungimeCheie) throws Exception {
this.generatorDePere chiDeChei =
KeyPairGenerator. getInstance ("RSA");
this.generatorDePerechiDeChei .initialize(lungimeCheie) ;
}
public void creeazaChei () {
this.perecheDeChei =
this.generatorDePerechiDeChei .generateKeyPair() ;
this.cheiePrivata = perecheDeChei .getPrivate() ;
this.cheiePublica = perecheDeChei .getPublic() ;
}
public PrivateKey obtineCheiePrivata () {
return cheiePrivata ;
}
public PublicKey obtineCheiePublica () {
return cheiePublica ;
}
public void scrieInFisierCheiaPublica (String path) {
File fisier = new File(path) ;
//creem directorul in caz ca nu exista
fisier.getParentFile().mkdirs() ;
byte[] cheiePublicaEncoded = cheiePublica .getEncoded() ;
//scriem in fisier byte array -ul specificat
try (FileOutputStream outputStream = new
FileOutputStream(fisier)) {
outputStream.write(cheiePublicaEncoded) ;
outputStream.flush() ;
} catch (IOException e) {
e.printStackTrace() ;
}
}
public void scrieInFisierCheiaPrivata (String path) {
File fisier = new File(path) ;
38
//creem directorul in caz ca nu exista
fisier.getParentFile().mkdirs() ;
byte[] cheiePrivataEnc oded = cheiePrivata .getEncoded() ;
//scriem in fisier byte array -ul specificat
try (FileOutputStream outputStream = new
FileOutputStream(fisier)) {
outputStream.write(cheiePrivataEncoded) ;
outputStream.flush() ;
} catch (IOException e) {
e.printStackTrace() ;
}
}
}
4.3 Utilizarea interfeței grafice în crearea aplicației –
Java FX
Pentru interfa ța grafică vom folosi JavaFX ș i o serie de componente standard pe c are
acesta ni -l pune la dispoziț ie;
Fiecare componentă este creată și inițializată direct din cod, fără utilitare xml sau
editoare grafice;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
/@Override
public void start(Stage scenaPrincipala)
Pentru a avea un punct de î nceput , aplicatia jav a are nevoie de o metoda statică main,
ce va fi apelată de java când pornim aplicația;
Pentru că aplicația foloseș te javaF X clasa noastră main extinde
javafx.application.Application din ca re folosim metoda launch(args) în cadrul
metodei main;
Metoda launch va apela apoi metoda start (metoda este suprascrisa din Application),
unde ne putem creea componentele;
public void start(Stage scenaPrincipala) {
scenaPrincipala.setTitle( "Exemplu criptare asimetrica" );
//initializare componente utilizate
grilaComponente = creeazaGrilaComponente( 10, 10);
titlu = creazaTitlu() ;
39
Label algorithm = new Label("Algoritm:" );
selectieAlgoritm = new
ComboBox<>(FXCollections. observableArrayList ("AES", "RSA"));
labelCheieAES = new Label("Cheie AES:" );
cheieAES = new TextField() ;
labelCheieAES .setVisible( false);
cheieAES .setVisible( false);
cutieButoaneRSA = new HBox(10);
cutieButoaneRSA .setVisible( false);
butonGenerareCheiRSA = new Button("Generare Chei" );
butonGenerareCheiRSA .setVisible( false);
butonSelectareCheiePublica = new Button("Gaseste Cheie Publica" );
butonSelectareCheiePrivata = new Button("Gaseste Cheie Privata" );
butonRese t = new Button("Resetare" );
labelMesajDeTrimis = new Label("Mesaj:" );
textAreaMesajDeTrimis = creazaTextAreaCuTextWrap() ;
butonCriptare = new Button("Cripteaza" );
butonDecriptare = new Button("Decripteaza" );
cutieButon = new HBox(10);
cutieButon .setAlignment(Pos. BOTTOM_RIGHT );
cutieButon .getChildren().add( butonCriptare );
cutieButon .getChildren().add( butonDecriptare );
textErorare = new Text();
labelTextCriptat = new Label("Criptat:" );
textAreaCriptat = creazaT extAreaCuTextWrap() ;
textAreaCriptat .setEditable( false);
GridPane. setColumnSpan (textAreaCriptat , 4);
GridPane. setHalignment (textAreaCriptat , HPos.CENTER);
labelTextDecriptat = new Label("Decriptat:" );
textAreaDecriptat = creazaTextAreaNeeditabil() ;
gridCuCheiRsa = creeazaGrilaComponente( 10, 0);
textLocatieCheiePublica = new Text();
textLocatieCheiePublica .setFill(Color. BLUE);
textLocatieCheiePrivata = new Text();
textLocatieCheiePrivata .setFill(Color. BLUE);
gridCuCheiRsa .add(textLocatieCheiePrivata , 0, 0);
gridCuCheiRsa .add(textLocatieCheiePublica , 0, 1);
gridCuCheiRsa .add(butonSelectareCheiePublica , 0, 0);
gridCuCheiRsa .add(butonSelectareCheiePrivata , 0, 1);
cutieButoaneRSA .setAlignment(Pos. CENTER_LEFT );
cutieButoaneRSA .getChildren().add( gridCuCheiRsa );
aranjeazaComponente(algorithm) ;
configurareActiuni(scenaPrincipala) ;
Scene scena = new Scene(grilaComponente , LATIME_APLICATIE ,
INALTIME_APLICATIE );
scenaPrincipala.setScene(scena) ;
scenaPrincipala.show() ;
40
JavaFx ne pune la dispozi ție un javafx.stage.Stage, care reprezint ă practic fereastra
unde vom ad ăuga ș i aranja com ponente, pentru a inițializa apli cația trebuie să folosim
parametrul Stage primit la metoda start ;
În codul de mai sus creăm un Scene care primește ca parametri lațimea și înălț imea
ferestrei aplicației precum ș i componența “grilaComponente” unde vom adăuga
diversele componente de care avem nevoie. Scena este adaugată in scena Principală
(Stage) și apoi afișăm scena principală apelând metoda show().
private GridPane creeazaGrilaComponente (int distantaOrizontala , int
distantaVerticala) {
GridPane grila = new GridPane() ;
grila.setAlign ment(Pos. CENTER);
grila.setHgap(distantaOrizontala) ;
grila.setVgap(distantaVerticala) ;
grila.setPadding( new Insets(25, 10, 25, 10));
return grila;
}
}
Metoda de mai sus creează grila de componente î n car e vor sta toate componentele
listate mai sus, putem seta distanța orizontală și verticală între componente, alinierea,
precum și padding -ul ( spațierea de lângă fiecare component );
private void aranjeazaComponente (Label algorithm) {
//adaugam componentele intr -o grila, folosim indexul coloanie si al
randului precum si
// numarul de coloane sau randuri pe care unele componente sa se intida
(colSpan, rowSpan)
grilaComponente .add(titlu, 0, 0, 2, 1);
grilaComponente .add(textErorare , 0, 1, 2, 1);
grilaComponente .add(algorithm , 0, 2);
grilaComponente .add(selectieAlgoritm , 1, 2);
grilaComponente .add(labelCheieAES , 0, 3);
grilaComponente .add(cheieAES , 1, 3);
grilaComponente .add(butonGenerareCheiRSA , 0, 3);
grilaComponente .add(cutieButoaneRSA , 1, 3, 2, 1);
grilaComponente .add(labelMesajDeTrimis , 0, 4, 3, 1);
grilaComponente .add(textAreaMesajDeTrimis , 1, 4, 3, 1);
grilaComponente .add(cutieButon , 1, 5, 3, 1);
grilaComponente .add(labelTextCriptat , 0, 7, 3, 1);
grilaComponente .add(textAreaCriptat , 1, 7, 3, 1);
grilaComponente .add(labelTextDecriptat , 0, 8, 3, 1);
grilaComponente .add(textAreaDecriptat , 1, 8, 3, 1);
grilaComponente .add(butonReset , 0, 9);
}
41
Metoda aranjeazaComponente, nu face decât să adauge fiecare componentă la un
index de rând și de coloană, urmatorii 2 parametri fiind, numărul de coloane respectiv
rânduri pe care să se întindă component.Aceasta metoda ă influenteză direct așezarea
și alinierea fiecărei componente în fer eastra afișată;
Unele componente au actiuni asociate, fiecare actiune este legata la componenta
printr -un EventHandler ;
private void configurareActiuni (Stage scenaPrincipala) {
selectieAlgoritm .setOnAction((ActionEvent actionEvent) -> {
switch (selectieAlgoritm .getValue()) {
case "AES":
System.out.println( "AES selectat" );
labelCheieAES .setVisible( true);
cheieAES .setVisible( true);
cutieButoaneRSA .setVisible( false);
butonGenerareCheiRSA .setVisible( false);
break;
case "RSA":
labelCheieAES .setVisible( false);
cheieAES .setVisible( false);
cutieButoaneRSA .setVisible( true);
butonGenerareCheiRSA .setVisible( true);
System.out.println( "RSA selectat" );
}
});
In metoda configurareActiuni, sunt ad ăugate acț iunile tutoror componentelor ;
selectieAlg oritm este un combobox la selecția căruia vor fi afișate sau ascunse
componentele corespunzatoare algoritmului selectat ;
Spre exemplu la selecț ia AES se vor ascunde componentele ce ț in de cheile RSA ;
La selecț ia RSA se vor ascunde componentele ce ț in de AES ;
În secțiunea anterioară am menț ionat un EventHandler , dar nu am vă zut clasa folosită,
întrucât se datorează expresiei lambda care ne ajută să scriem cod mai succint ș i care
ascunde clasa EventHandler î n spatele unei expressi Lambda ;
selectieAlgoritm .setOnAction((ActionEvent actionEvent) -> {
switch (selectieAlgoritm .getValue()) {
case "AES":
System.out.println( "AES selectat" );
labelCheieAES .setVisible( true);
cheieAES .setVisible( true);
cutieButoaneRSA .setVisible( false);
butonGenerareCheiRSA .setVisible( false);
break;
case "RSA":
labelCheieAES .setVisible( false);
cheieAES .setVisible( false);
cutieButoaneRSA .setVisible( true);
butonGenerareCheiRSA .setVisible( true);
System.out.println( "RSA selectat" );
}
});
});
}
42
Acțiunea butonului de criptare contine 3 faze :
• Validare ;
• Validarea pre supune verificarea inputurilor și afișarea unei erori în
cazul în care informaț iile nu au fost populate ;
• Vizibilitate component;
• Executare acțiune criptare în funcț ie de algoritm ;
private void actiuneCriptare () {
boolean hasValidationErrors = this.valideaza() ;
if (hasValidationErrors) {
textErorare .setVisible( true);
return;
}
textErorare .setVisible( false);
if (selectieAlgoritm .getValue().equals( "AES")) {
this.executareCriptareAES() ;
} else if (selectieAlgoritm .getValue().equals( "RSA")) {
this.executareCriptareRSA() ;
}
}
Executarea criptarii AES , presupune ini țializarea unui CriptorAES folosind cheia
AES furnizată î n coponenta “cheieAES” și apelarea metodei cripteaza ;
Rezultatul criptă rii este setat pe componenta “ textAreaCriptat ”;
Aceste acțiuni sunt definite ca parte a unui javafx.concurrent.Task care este a poi
executat î ntr-un Thread distinct de thread -ul curent pentru a preveni blocaje î n UI.
Metoda executareCriptareAES se poate finaliza inainte se se finalize criptarea,
threadul nou cr eat putand -use executa ulterior
private void executareCriptareAES () {
Task task = new Task() {
public Void call() {
try {
CriptorAES encryption = new CriptorAES( cheieAES .getText()) ;
String encryptedMessage =
encryption.cripteaza( textAreaMesajDeTrimis .getText()) ;
textAreaCriptat .setText(encryptedMessage) ;
System.out.println(encryptedMessage) ;
} catch (Exception e) {
e.printStackTrace ();
}
return null;
}
};
//actinea se executa in paralel pentru a nu bloca UI -ul
new Thread(task).start() ;
}
43
Executarea criptării RSA, presupune iniț ializarea unui CriptorRSA și încarcarea
cheii private folosind câmpul locatieCheiePrivata ce va fi populat prin butonul
generare cheie sau buto nul de selecț ie cheie privat ă;
Rezultatul criptarii este setat pe componenta “ textAreaCriptat ”;
Acțiunea este iarași executata î ntr-ul thread distinct .
private void executar eCriptareRSA () {
Task task = new Task() {
public Void call() {
try {
CriptorRsa encryption = new CriptorRsa() ;
PrivateKey key =
encryption.obtineCheiePrivata( locatieCheiePrivata );
String encryptedMessage =
encryption.cripteaza( textAreaMesajDeTrimis .getText() , key);
textAreaCriptat .setText(encryptedMessage) ;
} catch (Exception e) {
e.printStackTrace() ;
}
return null;
}
};
//actinea se executa in paralel pentru a nu bloca UI -ul
new Thread(task).start() ;
Codul sursă al aplicației – Main.java
package ro.cripto.ui ;
import javafx.application.Application ;
import javafx.collections.FXCollections ;
import javafx.concurrent.Task ;
import javafx.event.ActionEvent ;
import javafx.geometry.HPos ;
import javafx.geometry.Insets ;
import javafx.geometry.Pos ;
import javafx.scene.Scene ;
import javafx.scene.control.* ;
import javafx.scene.layout.GridPane ;
import javafx.scene.layout.HBox ;
import javafx.scene.paint.Color ;
import javafx.scene.text.Font ;
import javafx.scene.text.FontWeight ;
import javafx.scene.text.Text ;
import javafx.stage.DirectoryChooser ;
import javafx.stage.FileChooser ;
import javafx.stage.Stage ;
import ro.cripto.alg.aes.CriptorAES ;
import ro.cripto.alg.rsa.CriptorRsa ;
import ro.cripto.alg.rsa.GeneratorDeCheiRsa ;
import java.io.File ;
import java.security.PrivateKey ;
import java.security.PublicKey ;
import java.util.Objects ;
public class Main extends Application {
44
private static final int LATIME_APLICATIE = 500;
private static final int INALTIME_APLICATIE = 550;
private String locatieCheiePrivata ;
private String locatieCheiePublica ;
private Text textLocatieCheiePublica ;
private Text textLocatieCheiePrivata ;
private GridPane grilaComponente ;
private Text titlu;
private Label labelCheieAES ;
private TextField cheieAES ;
private HBox cutieButoaneRSA ;
private Button butonGenerareCheiRSA ;
private Button butonSelectareCheiePublica ;
private Button butonSelectareCheiePrivata ;
private Button butonReset ;
private ComboBox<String> selectieAlgoritm ;
private Button butonCriptare ;
private Button butonDecriptare ;
private HBox cutieButon ;
private Text textErorare ;
private Label labelMesajDeTrimis ;
private TextArea textAreaMesajDeTrimis ;
private Label labelTextCriptat ;
private TextArea textAreaCriptat ;
private Label labelTextDecriptat ;
private TextArea textAreaDecriptat ;
private GridPane gridCuCheiRsa ;
/**
* Punctul de intrare al aplicatiei
*
* @param args
*/
public static void main(String[] args) {
//delegare spre java fx Application.launch
launch(args);
}
/**
* Punctul de intrare al aplicatiei java fx
*
* @param scenaPrincipala
*/
@Override
public void start(Stage scenaPrincipala) {
scenaPrincipala.setTitle( "Exemplu criptare AES/RSA" );
//initializare componente utilizate
grilaComponente = creeazaGrilaComponente( 10, 10);
titlu = creazaTitlu() ;
45
Label algorithm = new Label("Algoritm:" );
selectieAlgoritm = new
ComboBox<>(FXCollections. observableArrayList ("AES", "RSA"));
labelCheieAES = new Label("Cheie AES:" );
cheieAES = new TextField() ;
labelCheieAES .setVisible( false);
cheieAES .setVisible( false);
cutieButoaneRSA = new HBox(10);
cutieButoaneRSA .setVisible( false);
butonGenerareCheiRSA = new Button("Generare Chei" );
butonGenerareCheiRSA .setVisible( false);
butonSelectareCheiePublica = new Button("Gaseste Cheie
Publica" );
butonSelectareCheiePrivata = new Button("Gaseste Cheie
Privata");
butonReset = new Button("Resetare" );
labelMesajDeTrimis = new Label("Mesaj:" );
textAreaMesajDeTrimis = creazaTextAreaCuTextWrap() ;
butonCriptare = new Button("Cripteaza" );
butonDecriptare = new Button("Decripteaza" );
cutieButon = new HBox(10);
cutieButon .setAlignment(Pos. BOTTOM_RIGHT );
cutieButon .getChildren().add( butonCriptare );
cutieButon .getChildren().add( butonDecriptare );
textErorare = new Text();
labelTextCriptat = new Label("Criptat:" );
textAreaCriptat = creazaTextAreaCuTextWrap() ;
textAreaCriptat .setEditable( false);
GridPane. setColumnSpan (textAreaCriptat , 4);
GridPane. setHalignment (textAreaCriptat , HPos.CENTER);
labelTextDecriptat = new Label("Decriptat:" );
textAreaDecriptat = creazaTextAreaNeeditabil() ;
gridCuCheiRsa = creeazaGrilaComponente( 10, 0);
textLocatieCheiePublica = new Text();
textLocatieCheiePublica .setFill(Colo r.BLUE);
textLocatieCheiePrivata = new Text();
textLocatieCheiePrivata .setFill(Color. BLUE);
gridCuCheiRsa .add(textLocatieCheiePrivata , 0, 0);
gridCuCheiRsa .add(textLocatieCheiePublica , 0, 1);
gridCuCheiRsa .add(butonSelectareCheiePublica , 0, 0);
gridCuCheiRsa .add(butonSelectareCheiePrivata , 0, 1);
cutieButoaneRSA .setAlignment(Pos. CENTER_LEFT );
cutieButoaneRSA .getChildren().add( gridCuCheiRsa );
aranjeazaComponente(algorithm) ;
configurareActiuni(scenaPrincipala) ;
Scene scena = new Scene(grilaComponente , LATIME_APLICATIE ,
INALTIME_APLICATIE );
scenaPrincipala.setScene(scena) ;
scenaPrincipala.show() ;
}
46
private void aranjeazaComponente (Label alg orithm) {
//adaugam componentele intr -o grila, folosim indexul coloanie
si al randului precum si
// numarul de coloane sau randuri pe care unele componente sa
se intida (colSpan, rowSpan)
grilaComponente .add(titlu, 0, 0, 2, 1);
grilaComponente .add(textErorare , 0, 1, 2, 1);
grilaComponente .add(algorithm , 0, 2);
grilaComponente .add(selectieAlgoritm , 1, 2);
grilaComponente .add(labelCheieAES , 0, 3);
grilaComponente .add(cheieAES , 1, 3);
grilaComponente .add(butonGenerareCheiRSA , 0, 3);
grilaComponente .add(cutieButoaneRSA , 1, 3, 2, 1);
grilaComponente .add(labelMesajDeTrimis , 0, 4, 3, 1);
grilaComponente .add(textAreaMesajDeTrimis , 1, 4, 3, 1);
grilaComponente .add(cutieButon , 1, 5, 3, 1);
grilaComponente .add(labelTextCriptat , 0, 7, 3, 1);
grilaComponente .add(textAreaCriptat , 1, 7, 3, 1);
grilaComponente .add(labelTextDecriptat , 0, 8, 3, 1);
grilaComponente .add(textAreaDecriptat , 1, 8, 3, 1);
grilaComponente .add(butonReset , 0, 9);
}
private void configurareActiuni (Stage scenaPrincipala) {
selectieAlgoritm .setOnAction((ActionEvent actionEvent) -> {
switch (selectieAlgoritm .getValue()) {
case "AES":
System.out.println( "AES selectat" );
labelCheieAES .setVisible( true);
cheieAES .setVisible( true);
cutieButoaneRSA .setVisible( false);
butonGenerareCheiRSA .setVisible( false);
break;
case "RSA":
labelCheieAES .setVisible( false);
cheieAES .setVisible( false);
cutieButoaneRSA .setVisi ble(true);
butonGenerareCheiRSA .setVisible( true);
System.out.println( "RSA selectat" );
}
});
// configurare actini pentru fiecare buton
butonCriptare .setOnAction(actionEvent -> {
actiuneCriptare() ;
});
butonGenerareCheiRSA .setOnAction(event ->
clickButonGenerareChei( scenaPrincipala ));
butonDecriptare .setOnAction(event -> {
TextArea text = textAreaCriptat .getText().isEmpty() ?
textAreaMesajDeTrimis : textAreaCriptat ;
actiuneDecriptare(text) ;
});
47
butonSelectareCheiePublica .setOnAction(event -> {
//afisam o fereastra de navigare spre cheia publica
FileChooser selectorDeFisier = new FileChooser() ;
selectorDeFisier.setTitle( "Selectati o cheie publica" );
File file =
selectorDeFisier.showOpenDialog( scenaPrincipala );
if (file != null) {
locatieCheiePublica = file.getPath() ;
textLocatieCheiePrivata .setText( locatieCheiePublica );
butonSelectareCheiePublica .setVisible( false);
}
});
butonSelectareCheiePrivata .setOnAction(event -> {
//afisam o fereastra de navigare sp re cheia privata
FileChooser selectorDeFisier = new FileChooser() ;
selectorDeFisier.setTitle( "Selectati o cheie privata" );
File file =
selectorDeFisier.showOpenDialog( scenaPrincipala );
if (file != null) {
locatieCheiePrivata = file.getPath() ;
textLocatieCheiePublica .setText( locatieCheiePrivata );
butonSelectareCheiePrivata .setVisible( false);
}
});
butonReset .setOnAction(event -> {
//resetam componentele
textLocatieCheiePublica .setText( "");
textLocatieCheiePrivata .setText( "");
locatieCheiePrivata = null;
locatieCheiePublica = null;
textAreaCriptat .setText( "");
textAreaMesajDeTrimis .setText( "");
textAreaDecriptat .setText( "");
butonSelectareCheiePublica .setVisible( true);
butonSelectareCheiePrivata .setVisible( true);
});
}
private void actiuneCriptare () {
boolean hasValidationErrors = this.valideaza() ;
if (hasValidationErrors) {
textErorare .setVisible( true);
return;
}
textErorare .setVisible( false);
if (selectieAlgoritm .getValue().equals( "AES")) {
this.executareCriptareAES() ;
} else if (selectieAlgoritm .getValue().equals( "RSA")) {
this.executareCriptareRSA() ;
48
}
}
private void clickButonGenerareChei (Stage primaryStage) {
butonSelectareCheiePrivata .setVisible( false);
butonSelectareCheiePublica .setVisible( false);
GeneratorDeCheiRsa generatorDeCheiRsa = null;
try {
generatorDeCheiRsa = new GeneratorDeCheiRsa( 1024);
} catch (Exception e) {
throw new IllegalStateException(e) ;
}
generatorDeCheiRsa.creeazaChei() ;
PrivateKey cheiePrivata =
generatorDeCheiRsa.obtineCheiePrivata() ;
PublicKey cheiePublica =
generatorDeCheiRsa.obtineCheiePublica() ;
DirectoryChooser selectorFolder = new DirectoryChooser() ;
selectorFolder.setTitle( "Alege directorul unde sa stochezi
cheile");
File file = selectorFolder.showDialog(primaryStage) ;
locatieCheiePrivata = file.getPath() + "/cheie_privata" ;
locatieCheiePublica = file.getPath() + "/cheie_publica" ;
textLocatieCheiePrivata .setText( locatieCheiePublica );
textLocatieCheiePublica .setText( locatieCheiePrivata );
gridCuCheiRsa .setVisible( true);
generatorDeCheiRsa.scrieInFisierCheiaPrivata( locatieCheiePrivata );
generatorDeCheiRsa.scrieInFisierCheiaPublica( locatieCheiePublica );
}
private void actiuneDecriptare (TextArea encryptedText) {
boolean contineEroriDeValidare = valideaza() ;
if (contineEroriDeValidare) {
textErorare .setVisible( true);
return;
}
textErorare .setVisible( false);
if (selectieAlgoritm .getValue().equals( "AES")) {
executaDecriptareAES(encryptedText) ;
} else if (selectieAlgoritm .getValue().equals( "RSA")) {
executaDecriptareRSA(encryptedText) ;
}
}
private TextArea creazaTextAreaNeeditabil () {
TextArea textArea = creazaTextAreaCuTextWrap() ;
textArea.setEditable( false);
return textArea ;
}
private TextArea creazaTextAreaCuTextWrap () {
TextArea textArea = new TextArea() ;
49
textArea.setWrapText( true);
return textArea ;
}
private boolean valideaza () {
if (selectieAlgoritm .getValue() == null) {
afiseazaErorare( "selectati un algoritm" );
return true;
} else if (textAreaMesajDeTrimis .getText() == null ||
textAreaMesajDeTrimis .getText().isEmpty()) {
afiseazaErorare( "introduceti un mesaj" );
return true;
} else if (cheiaAESNuAFostFurnizata()) {
afiseazaErorare( "cheia AES trebuie sa aiba lungimea
16/24/32" );
return true;
} else if (cheileRsaNuAuFostFurnizate()) {
afiseazaErorare( "generati sau selectati cheile RSA" );
return true;
}
return false;
}
private boolean cheileRsaNuAuFostFurnizate () {
if (!Objects. equals(selectieAlgoritm .getValue() , "RSA")) {
return false;
}
return locatieCheiePrivata == null || locatieCheiePublica ==
null;
}
private void executareCriptareAES () {
Task task = new Task() {
public Void call() {
try {
CriptorAES encryption = new
CriptorAES( cheieAES .getText()) ;
String encryptedMessage =
encryption.cripteaza( textAreaMesajDeTrimis .getText()) ;
textAreaCriptat .setText(encryptedMessage) ;
System.out.println(encryptedMessage) ;
} catch (Exception e) {
e.printStackTrace() ;
}
return null;
}
};
//actinea se executa in paralel pentru a nu bloca UI -ul
new Thread(task).start() ;
}
private void executareCriptareRSA () {
Task task = new Task() {
public Void call() {
try {
CriptorRsa encryption = new CriptorRsa() ;
PrivateKey key =
encryption.obtineCheiePrivata( locatieCheiePrivata );
50
String encryptedMessage =
encryption.cripteaza( textAreaMesajDeTrimis .getText() , key);
textAreaCriptat .setText(encryptedMessage) ;
} catch (Exception e) {
e.printStackTrace() ;
}
return null;
}
};
//actinea se executa in paral el pentru a nu bloca UI -ul
new Thread(task).start() ;
}
private void executaDecriptareRSA (TextArea mesajDeDecriptat) {
Task task = new Task() {
public Void call() {
try {
CriptorRsa cr iptor = new CriptorRsa() ;
PublicKey cheiePublica =
criptor.obtineCheiePublica( locatieCheiePublica );
String rezultatDecriptare =
criptor.decripteaza( mesajDeDecriptat .getText() , cheiePublica) ;
textAreaDecriptat .setText(rezultatDecriptare) ;
} catch (Exception e) {
e.printStackTrace() ;
}
return null;
}
};
//actinea se executa in paralel pentru a nu bloca UI-ul
new Thread(task).start() ;
}
private void executaDecriptareAES (TextArea messageToDecrypt) {
Task task = new Task() {
public Void call() {
try {
CriptorAES criptor = new
CriptorAE S(cheieAES .getText()) ;
String textDecriptat =
criptor.decripteaza( messageToDecrypt .getText()) ;
textAreaDecriptat .setText(textDecriptat) ;
System.out.println(textDecriptat) ;
} catch (Exception e) {
e.printStackTrace() ;
}
return null;
}
};
//actinea se executa in paralel pentru a nu bloca UI -ul
new Thread(task).start() ;
}
private boolean cheiaAESNuAFostFurnizata () {
String text = cheieAES .getText() ;
return "AES".equals( selectieAlgoritm .getValue())
&& (text == null
|| text.isEmpty()
|| lungimeaCheiiEsteInvalida(text)
);
}
/**
* cheile AES trebuie sa aiba lungimea 16, 24 sau 32
*
51
* @param cheieAES
* @return
*/
private boolean lungimeaCheiiEsteInvalida (String cheieAES) {
return cheieAES.length() != 16 && cheieAES.length() != 24 &&
cheieAES.length() != 32;
}
private void afiseazaErorare (String mesajDeEroare) {
textErorare .setFill(Color. RED);
textErorare .setText(mesajDeEroare) ;
}
private Text creazaTitlu () {
Text sceneTitle = new Text("Selectati un algorimt, introduceti
un mesaj si apasati pe butonul Cripteaza" );
sceneTitle.setFont(Font. font("Tahoma" , FontWeight. NORMAL,
14));
sceneTitle.setWrappingWidth( LATIME_APLICATIE – 20);
return sceneTitle ;
}
private GridPane creeazaGrilaComponente (int distantaOrizontala ,
int distantaVerticala) {
GridPane grila = new GridPane() ;
grila.setAlignment(Pos. CENTER);
grila.setHgap(distantaOrizontala) ;
grila.setVgap(distantaVerticala) ;
grila.setPadding( new Insets(25, 10, 25, 10));
return grila;
}
Fig.1 2 – Aplicația AES/RSA
52
Capito lul 5 . Concluzii
Dorința confidenț ialității și a secretelor de că tre state, ș i chiar indivizi, a facut posibilă
înființ area institut elor de dezvoltare a codurilor ș i a cifrurilor care au elaborat și elaborează î n
continuare variante din ce în ce mai solide. În același timp, s -au inființ at alte instuti ții, s-au
dezvoltatat rețele și chiar comunități online sau offline care au avut rolul de a sp arge cifrurile
si de a fura secrete. Criptografia, ca știintă, atrage și se dezvoltă în funcție de cerințele
momentului fiind în concordanță cu progresul tehnologic și software.
Criptologii și cei pasionați de știința secretelor au fost întodeauna considerați experț i
lingvistici. Foarte rar problema unui cifru este de natura matematică. Î n majoritatea cazurilor
criptologii profesioniș ti aveau mai degrabă o pregătire de natura umanistă decâ t studii
amanunțite de matematică. Chiar și î n al doilea razb oi mondial, la departamentul de securitate
națională al Statelor Unite se lucra în stransă legă tura cu ziarele pentru a recruta noi "experți"
în criptog rafie. În aceste ziare, secția de rebusuri era monitorizată de guvern și se organizau
"concursuri" naț ionale de cuvinte încrucișate. "Jucatorii" erau stimulați să rezolve cât mai
multe integrame ș i să le trimită prin poșta la redacț ie. Guvernul, organizator secret al acestor
concursuri, a recrutat în timpul celui de al doilea ra zboi mondial o mare parte din câștigă torii
jocurilor de integrame.
Dezvoltarea societății informaționale, care a dus la o creștere impresionantă a
volumului de informație preponderent economică , vehiculată în rețelele de calculatoare, a
accelerat dezvoltarea și mai ales utilizarea in strumentelor criptografiei moderne. Rolul
criptografiei moderne este de a asigura prin mijloace matematice specifice, atât în teorie cât și
în practică, cele patru caracteristici fundamentale ale informației: confidențialitatea,
integritatea, autenticitate a și non -repudierea.
Criptografia modernă utilizează în principiu aceeași algoritmi ca și criptografia
tradițională (transpoziția și substituția), dar accentul cade pe complexitatea algoritmilor.
Obiectivul criptografic din actuala perioadă este de a conc epe algoritmi de criptare atât de
complecși și de ireversibili încât chiar și în situația în care atacatorul (sau criptanalistul)
având la dispoziție cantități mari de text criptat la alegerea sa, el să nu poată face nimic fără
cheia secretă.
Am tratat în aceasta lucrare doua tipuri de criptare a datelor : simetrică și asimetrică,
fiecare cu avantaje și dezantaje. Avantajele criptografiei cu cheie simetrica sunt : a lgoritmii
folosiți permit gestionarea unor volume mari de date, cu viteză relativ bună, î n special atunci
53
când e ste vorba de implementări hard, pot fi folosiți ca primitive pentru a construi soluții
criptografice incluzînd generatoarele de numere pseudo -aleatoare și funcțiile hash , cheile
folosite pentru algoritmii simetrici sunt relativ scurte. Insă au și unele dezavantaje precum
cheia trebuie să rămînă secretă în ambele capete, iar înt r-o rețea cu mulți utilizatori numărul
cheilor care trebuie gestionate devine o problemă majoră. Întrucât impune schimbul cheilor
frecvent, uneori chiar la fiecare sesiune, ceea ce în condițiile unui canal nesigur de
comunicație este o altă problemă .
Criptografia cu chei publice prezintă următoarele avantaje: cele două chei folosite în
algoritmii cu chei publice doar una trebuie ținută secret și pot fi folosite pe o perioada lungă
de timp fără a fi schimbate , iar a dministrarea cheilor într -o rețea poate fi făcută cu un singur
administrator “de încredere”. Într-o rețea de dimensiuni mari numărul de chei necesare este
considerabil mai mic decît în cazul criptografiei simetrice. Dezavantajul major al criptării cu
chei publice îl constituie v iteza algoritmilor care este de câteva ori mai mică decât a celor cu
chei secrete , iar până în prezent nici un algoritm cu chei publice nu s -a demonstrat că ar fi
“sigur”; securitate a lor bazându -se pe prezumția de dificultate a unui set de probleme de
teoria numerelor .
În concluzie putem afirma că în prezent întâlni m algoritmi criptografici în orice
activitate zilnică pe care o defășurăm (plata facturilor online, poșta electronică, plata cu
cardul la comercianți etc.), acest domeniu fiind într -o continuă schimbare și perfecționare
datorat multiplilor atacuri de tip hacking.
.
54
Bibliografie
1. https://www.microsoft.com/en -us/wdsi/threats/ransomware
2. https://www.microsoft.com/en -us/wdsi/threats/malware -encyclopedia –
description?Name=Ransom:Win32/WannaCrypt
3. http://scientia.ro/tehnologie/96 -internet/6153 -anonim -internet -cum-functioneaza –
tor.html
4. https://www.investopedia.com/terms/b/bitcoin.asp
5. http://codare -date.cpf.ro/criptare -simetrica.php
6. Hellman, W. D. (1976). New Directions in Cryptography. Transction on
Information Theory
7. Preda V., Simion E. și Popescu A.. Criptanaliza. Rezultate si Tehnici Matematice
(București. Universitatea București, 2011)
8. Groza B., Introduceri in Criptografie cu Cheie Publica (București, Editura
Politehnica, 2007)
9. Groza B. Funcții Criptografice, Fundamente Matematice și Computaționale
(București, Editura Politehnica, 2007)
10. Zgureanu A.. Metode criptografice de protecție a informației (Chișinău, 201 4).
11. Preda V și Simion E ., Correlated Stochastic Time Series and Cryptographic
Applications , Univeristatea București, 2000
12. Simion E., Andrașiu M., Naccache D., Simion Gh., Cercetări Operaționale,
Probabilități și Criptologie. Aplicații , Academia Tehnică Militară, 2011.
13. Simion E., Asymptotic Behavior of Some Statistical Estimators used in Cryp –
tography, Annals of University of Bucharest, no.1, 2000
14. Tilborg, Henk C.A. van, Fundamentals of Cryptology, Kluwer Academic
Publisher, Second Edition, 2001
15. Welschenbach M., Cryptography in C and C++, APress, 2001.
16. Friedman W., Military Cryptanalysis, Aegean Park Press, 1980.
17. Simion E., Oprișan Ghe., Elemente de Cercetări Operaționale și Criptologie , Ed.
Politehnica Press, 2003.
18. Simion E., Linear Complexity C omputations of Cryptographic Systems ,
International Conference on Telecommunications, Bucharest, 4 -7 June, 2001
55
19. Stallings W., Cryptography and Netwwork Security: Principles and
Practice, Prentice Hall, Second Edition, 1999.
20. ElGamal T., A Public -Key Cryptos ystem and a Signature Based on Discrete
Logarithms, Adv. in Cryptology Crypto84, Springer Verlag, 1985
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Coordonator științific: Absolvent: PROF. DR. EMIL SIMION APOSTOAE MARIUS BUCUREȘTI 2018 2 CUPRINS Capitolul 1. Introducere… [621827] (ID: 621827)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
