Sunteți pe pagina 1din 96

UNIVERSITATEA LUCIAN BLAGA DIN SIBIU

FACULTATEA DE TIINE
SPECIALIZAREA MATEMATIC-INFORMATIC

LUCRARE DE LICEN

ABSOLVENT:
STANCU MIHAI DORIAN

SIBIU

2011
UNIVERSITATEA LUCIAN BLAGA DIN SIBIU
FACULTATEA DE TIINE
SPECIALIZAREA MATEMATIC-INFORMATIC

FUNCII HASH CRIPTOGRAFICE

Coordonator tiinific:
Prof.univ.dr. Mugur Acu

Absolvent:
Stancu Mihai Dorian

SIBIU

2011

Cuprins
Introducere..4
Capitolul 1: Funcii Hash...........6
1.1 Definiia unei funcii hash....6
1.2 Proprietile funciilor hash criptografice6
1.3 Atacuri asupra funciilor hash criptografice.....9
1.3.1 Atacurile Brute Force.......9
1.3.2 Atacurile criptanalitice.11
1.3.3 Adversarul11
1.4 Aplicaii ale funciilor hash..12
1.4.1 Aplicaii ale funciilor hash non-criptografice. 12
1.4.2 Aplicaii ale funciilor hash criptografice.12
1.5 Proiectarea funciilor hash criptografice..14
Capitolul 2: Funcii hash proiectate special..... 15
2.1 MD5.15
2.1.1 Terminologie i notaie.15
2.1.2 Algoritmul MD5.. 16
2.1.3 Securitatea MD5.......17
2.1.4 Atacurile asupra MD5......18
2.2 SHA-1.. 19
2.2.1 Terminologie i notaie.19
2.2.2 Algoritmul SHA-119
2.2.3 Securitatea SHA-1....21
2.2.4 Atacurile asupra SHA-1.......22
2.3 Securitatea funciilor hash proiectate special...22
Capitolul 3: Funcii hash demonstrabil sigure 23
3.1 Tipuri de funcii hash demonstrabil sigure...... 23
3.2 Probleme NP-complete24
3.2.1 Terminologie i notaie 25
3.2.2 Probleme rezolvabile n timp polinomial.26
3.2.3 Probleme verificabile n timp polinomial.27
3.2.4 Teoria limbajelor formale.28
3.2.5 Probleme NP-complete.... 29
3.2.6 Probleme NP-complete n criptografie.....31
3.3 Algoritmi de extensie a domeniului.32
3.4 Rezumat34
Capitolul 4: Funcii hash universale ntr-o singur direcie ...................................................35
4.1 Funcii hash universale ntr-o singur direcie..................................................................... 35
4.2 Funcie hash bazat pe problema sumei elementelor unei submulimi....38

Capitolul 5: Crearea unei funcii hash rezistente la preimagine........


2

42
5.1 Teoria Grafurilor.................................................................................................................. 42
5.1.1 Problema ciclului hamiltonian..44
5.1.2 Grafuri aleatoare...44
5.1.3 Teoria grafurilor i generarea valorilor hash45
5.2 Algoritmul
.45
5.2.1
5.2.2
5.2.3
5.2.4
5.2.5
5.2.6

Idei principalele45
Notaii...46
Funcia de reducere...... 47
Funcia de generare a unui ciclu...47
Funcia de generare a grafului..49
Algoritmul
. 50

5.2.7 Exemplu....51
5.3 Proprietile algoritmului
...... 52
5.3.1 Non-determinism i modaliti de verificare....52
5.3.2 Rezistena la preimagine a algoritmului
.......53
5.3.3 Rezistena la a doua preimagine...............................................................................53
5.3.4 Rezistena la coliziuni a algoritmului
.......54
5.3.5 Efectul de avalan al algoritmului
5.3.6 Surjectivitatea funciei

..........55

5.3.7 Caracterul aleator al funciei


5.3.8 Eficiena algoritmului

56

.......56

5.3.9 Biii de securitate ai algoritmului


5.4 Aplicaii ale algoritmului

................................................................... 55

.57

...... 58

5.4.1 Stocarea parolelor.....58


5.4.2 Compararea rezultatelor ......58
5.5 Implementarea funciei
. 58
5.6 Concluzie..59
Concluzie..60
Anexe61
A Implementarea algoritmilor MD5 i SHA1 n JavaScript................................................... 61
B Implementarea algoritmului HH n C#................................................................................ 69
Bibliografie.. 82

Introducere
O funcie hash este o funcie
definit pe mulimea tuturor irurilor binare de lungime arbitrar, cu valori n mulimea
tuturor irurilor binare de o dimensiune fix. O funcie hash bun are proprietatea c pentru
oricare dou intrri diferite este extrem de puin probabil ca acestea s fie mapate la aceea i
valoare. Funciile hash au numeroase aplicaii n informatic i au o aplica ie deosebit de
interesant n domeniul criptografiei. Scopul principal al criptografiei este de a oferi cele trei
caracteristici principale ale securitii informaiei: confidenialitatea, integritatea i
autenticitatea.
Confidenialitatea nseamn asigurarea confidenialitii datelor. Integritatea nseamn a
asigura c datele nu au fost modificate. Autentificarea este procesul de verificare a identitii.
Securitatea sistemelor de comunicaie de astzi se bazeaz n mare msur pe protocoale
criptografice care s asigure aceste atribute, i multe astfel de protocoale au la baz funcii
hash. Cu toate acestea, nu fiecare funcie hash este destul de bun pentru a fi utilizat n
criptografie. De fapt, doar aa-numitele funcii hash criptografice ndeplinesc acele proprieti
de securitate necesare aplicaiilor criptografice cum ar fi semnturile digitale sau
generatoarele de numere pseudo-aleatoare. Funciile hash nu trebuie s aib numai bune
proprieti statistice. De asemenea, trebuie s reziste n faa unor atacuri puternice din partea
unor utilizatori cu intenii maliioase. Proiectarea unor astfel de funcii hash criptografice este
o sarcin important, dar extrem de dificil. Multe funcii au fost propuse, dar cele mai multe
dintre ele s-au dovedit curnd a nu fi capabile s reziste atacurilor. Doar dou familii de
funcii hash au ajuns s fie utilizate pe scar larg, i anume familiile MD i SHA, ai cror
membri cei mai cunoscui sunt MD5, respectiv SHA-1. Din pcate, securitatea lor se bazeaz
pe argumente euristice, i nu pe dovezi matematice. Aa cum era de ateptat, recent au fost
gsite puncte slabe n ambele dintre ele i, prin urmare, n prezent nu exist nicio funcie
criptografic hash eficient i sigur n acelai timp. Aadar nu exist motive solide pentru a
ne ncrede n aplicaiile care folosesc aceste funcii, i este mare nevoie de cercetare n
aceast direcie.
Rezultatele recente n criptanaliz au artat n mod clar c funciile hash criptografice
folosite n prezent nu sunt suficient de sigure. Dar cercetarea n acest domeniu nu este
necesar doar pentru c cele mai multe funcii hash au fost sparte. Problema nu const att de

mult n faptul c au fost gasite defecte n modelele actuale, ci n construcia acestora, care de
multe ori are un caracter ad-hoc, i n faptul c securitatea lor nu poate fi dovedit.
Securitatea informaiilor este prea important pentru a fi lsat pe seama ipotezelor i a
norocului. De aceea avem cu adevrat nevoie de funcii a cror securitate s nu poat fi
contestat. Astzi se realizeaz numeroase cercetri n zona funciilor hash demonstrabil
sigure i au fost propuse modele promitoare, ns niciunul dintre ele nu este nc suficient
de practic pentru a putea fi folosit. Cea mai mare problem o constituie viteza. Modelele
demonstrabil sigure nu sunt la fel de rapide ca funciile hash convenionale, ceea ce face ca
acestea s nu fie folosite n practic. De asemenea, probele de securitate sunt extrem de dificil
de gsit. Ele se bazeaz pe ipoteze cu privire la resursele i puterea de calcul a atacatorilor, iar
ideile i definiiile securitii sunt departe de a fi coerente. Multe modele diferite de atac sunt
n uz i nu exist un consens n privina unui nivel de securitate care s fie considerat
suficient. Poate nici nu va exista vreodat un asemenea consens, deoarece rspunsul la
aceast ntrebare depinde de gradul de importan a datelor protejate. Direcia de cercetare
actual const n raportarea la proprietile de securitate ale unor probleme calculabil dificile,
cunoscute ca fiind membrii clasei de probleme NP-complete. Dovada faptului c un atac pe o
anumit funcie hash este cel puin la fel de dificil ca rezolvarea unei probleme NP-complete,
poate oferi o indicaie clar cu privire la securitatea funciei hash. Acest lucru nu este
considerat de cele mai multe ori ca fiind o metod satisfctoare de a dovedi securitatea, dar
este una care funcioneaz n practic. n ultimii douzeci de ani au fost construite i
mbuntite continuu mai multe funcii hash, care sunt sigure n sensul prezentat mai sus, i
exist sperana ca acestea s nlocuiasc n curnd algoritmii hash utilizai n prezent, a cror
securitate este discutabil.
Aceast lucrare investigheaz conceptele utilizate pentru proiectarea unei funcii hash
demonstrabil sigure.
Capitolul 1 ofer o introducere general a funciilor hash criptografice prin discuia
diferitelor proprieti de securitate i a posibilelor metode de atac. De asemenea, ofer
explicaia necesitii unor funcii hash bune prin prezentarea mai multor aplicaii
criptografice, i analizeaz de ce proiectarea funciilor hash este att de dificil.
Capitolul 2 discut dou dintre cele mai frecvent utilizate funcii hash: MD5 i SHA-1. Se
prezint algoritmii lor, argumentele lor de securitate i recentele atacuri descoperite mpotriva
acestora, urmate de o scurt prezentare a motivului pentru care aceste funcii hash nu sunt
suficient de bune.
Capitolul 3 prezint metodele de proiectare a unor funcii hash demonstrabil sigure, i
Capitolul 4 prezint un design foarte natural al unei funcii hash demonstrabil sigure, care
ilustreaz aceste metode.
n final, Capitolul 5 propune un tip de funcie hash demonstrabil sigur cu o presupunere
de securitate care nlesnete procesul de proiectare a funciilor hash demonstrabil sigure.
Designul are la baz problema gsirii unui ciclu hamiltonian din teoria grafurilor. Este
prezentat de asemenea i o dovad a securitii sale.

Capitolul 1: Funcii Hash


Conceptul de hash aparent a fost folosit pentru prima oar de ctre Hans Peter Luhn de la
IBM ntr-o not din 1953 [14]. Termenul hash, care nseamn n mod normal "a tia i a
amesteca a intrat n folosin aproximativ zece ani mai trziu i pare a fi o descriere
informal foarte bun a ceea ce face o funcie hash: amestec biii de intrare i taie o parte
dintre acetia pentru a produce o ieire mai scurt i cu aspect aleatoriu.
Formal, o funcie hash este pur i simplu o funcie care examineaz datele de intrare de
lungime arbitrar i produce o ieire de lungime fix numit amprent, valoare hash, sau
simplu, hash. Funciile hash pot avea proprieti diferite, n funcie de utilizare. Pentru toate
aplicaiile ns este important c este extrem de puin probabil ca dou mesaje diferite s aib
aceeai amprent.
Exist diverse aplicaii ale funciilor hash, multe dintre acestea n informatic, unul extrem
de important fiind n criptografie. Aceast lucrare se concentreaz pe funciile hash
criptografice, care sunt deosebit de interesante, dar n acelai timp i foarte greu de proiectat,
pentru c ele trebuie s aib proprieti de securitate specifice.
Acest capitol ncepe prin definirea funciilor hash (criptografice) i a proprietilor lor
cheie, i explic apoi cele mai frecvente metode de a ataca aceste proprieti. Sunt prezentate
cele mai importante aplicaii ale acestora, urmate de o scurt explicaie a motivului pentru
care proiectarea acestor funcii este att de dificil.

1.1 Definiia unei funcii hash


Notaie 1.1.1
Fie

mulimea irurilor binare de lungime

, i

mulimea tuturor irurilor binare.


Definiie 1.1.2 (funcie hash)
O funcie hash

primete o intrare de lungime arbitrar i produce o ieire de lungime fix

, numit valoarea hash-ului. n criptografie, intrarea este un ir binar de lungime arbitrar,


6

numit mesaj, iar ieirea este un ir binar de lungime fix numit rezumatul mesajului (engl.
message digest). Aadar

este definit astfel

Deoarece rezumatul mesajului trebuie s fie mai scurt dect mesajul, lungimea irului
binar de intrare trebuie s fie de obicei mai mare dect m. Valorile tipice pentru

sunt 128,

160 i 256.

1.2 Proprietile funciilor hash criptografice


Dei definiia oficial a unei funcii hash specific doar c aceasta trebuie s asocieze o
intrare de dimensiune arbitrar cu o ieire de dimensiune fix, se ateapt, de asemenea, ca o
funcie hash bun s produc puine coliziuni. Cu alte cuvinte, trebuie s fie extrem de puin
probabil (dar, evident, nu imposibil) ca dou mesaje diferite s aib aceeai amprent.
Aceast proprietate este suficient n cele mai multe cazuri. Exist ns, de asemenea,
numeroase aplicaii care necesit proprieti suplimentare ale funciilor hash (a se vedea
seciunea 1.4).
Un domeniu foarte interesant n care funciile hash i gsesc o mulime de aplicaii este
criptografia. Criptografia asigur, n general, securitatea (confidenialitatea, autentificarea i
integritatea) anumitor procese de comunicare, i ntotdeauna face presupunerea c exist o
entitate maliioas care ncearc s "sparg" aceast securitate. Orice metod utilizat n
criptografie trebuie deci s pstreze un anumit nivel de securitate n momentul n care se afl
sub atac. Acest lucru este, de asemenea, valabil i pentru funciile hash folosite n
protocoalele criptografice, care trebuie s reziste la atacuri puternice. Pentru a asigura acest
lucru, este necesar s fie ndeplinite o serie de proprieti de securitate.
Funciile hash utilizate n scopuri criptografice se numesc funcii hash criptografice.
Deoarece aceast lucrare prezint doar funcii hash criptografice, acestea vor fi referite n
continuare cu denumirea simpl de funcii hash. Funciile hash obinuite, care sunt utilizate n
alte scopuri dect cele criptografice vor fi numite funcii hash non-criptografice.
Exist trei proprieti de baz care pot fi ndeplinite de funciile hash criptografice: rezistena
la preimagine, rezistena la a doua preimagine i rezistena la coliziuni. Dac prima
proprietate trebuie ntotdeauna s fie ndeplinit, celelalte dou sunt necesare numai pentru
anumite aplicaii criptografice. Definiiile acestora sunt nc dezbtute, i nu sunt coerente n
literatura de specialitate. Cele alese de noi sunt cele mai folosite dar i cele mai utile pentru
scopul acestei lucrri.
Definitia 1.2.1 (rezistena la preimagine)
O funcie hash

se numete rezistent la preimagine dac pentru

este greu de gsit un mesaj (preimagine)


Definitia 1.2.2 (rezistena la a doua preimagine)

astfel nct

O funcie hash

se numete rezistent la a doua preimagine dac pentru

un mesaj

este dificil de gsit un alt mesaj

nct

(a doua preimagine) astfel

Definitie 1.2.3 (rezistena la coliziune)


O funcie hash
gsit dou mesaje

se numete rezistent la coliziuni dac este dificil de


astfel nct

De observat faptul c rezistena la coliziune este o cerin mai puternic dect rezisten a la
a doua preimagine. n definiia 1.2.2, unul dintre mesajele care colizioneaz este fix, n timp
ce n definiia 1.2.3, ambele mesaje pot fi alese arbitrar. Prin urmare, dac o funcie hash este
rezistent la coliziune, automat este i rezistent la a doua preimagine. Reciproca acestei
afirmaii ns nu este adevrat.
ntrebarea ceea mai important care se pune este: ce nseamn "dificil"? Evident,
preimaginile i coliziunile ntotdeauna vor exista. Dar ar trebui s fie dificil s poat fi gsite
intenionat, chiar de ctre cineva care depune un efort substanial n acest scop. n termeni
simpli, ar trebui s fie imposibil ca cineva s poat scrie un algoritm care efectueaz o
operaiune dificil n mod eficient. Chiar dac am avea la dispoziie toat puterea de calcul
din lume i un interval enorm de timp (de exemplu, vrsta universului) tot nu ar trebui s
existe niciun algoritm care s poat gsi o preimagine pentru un hash dat. Pot exista (i n
cazul nostru ntotdeauna vor exista) algoritmi care rezolv problema n teorie (dei exist
probleme pentru care este imposibil a se gsi cel pu in un algoritm care s determine o
soluie, cum ar fi Problema de Stopare engl. Halting Problem). De exemplu, o preimagine
pentru un hash dat ntotdeauna poate fi gsit prin ncercri. Dar acest lucru nu trebuie sa fie
realizabil n practic, deoarece puterea de calcul i timpul necesar pentru a ncerca toate
preimaginile posibile ar depi resursele disponibile.
Cum se poate descrie mai riguros acest lucru i cum poate se poate realiza sunt cele mai
importante ntrebri ale teoriei criptografice, i tema aceastei lucrri. Cum putem evalua ct
de dificil este o anumit problem i cnd putem spune c s-a atins un nivel suficient de
dificultate?
Cum putem fi siguri c ceva este ntr-adevr la fel de dificil precum credem? Sunt
necesare definiii matematice riguroase pentru a cuantifica "dificultatea", i dovezi
matematice care s susin afirmaiile. Capitolul 3 ncearc s clarifice aceste chestiuni. n
plus fa de cele trei proprieti cheie definite mai sus, exist i alte proprieti pe care
funciile hash criptografice pot, sau ar trebui, s le aib. Acestea nu sunt la fel de bine definite
i de cele mai multe ori, sunt suficiente doar unele analize sau experimente pentru a verfica
dac sunt ndeplinite sau nu. Se ateapt ntotdeauna ca funciile hash s fie eficient de
calculat. Cele mai multe aplicaii necesit calculul rapid al valorilor hash, din cauza
numrului mare de evaluri efectuate. Pentru funciile hash criptografice exist adesea un
compromis ntre securitate i vitez, i, din pcate, muli sunt dispui s sacrifice securitatea
n favoarea vitezei.
8

Funciile hash trebuie s fie, de asemenea, deterministe, ceea ce nseamn c, pentru o


anumit intrare, funcia trebuie s returneze ntotdeauna acelai rezultat. n acelai timp, se
ateapt ca funciile hash criptografice s se comporte i ca funcii aleatoare. Cu alte cuvinte,
ar trebui s fie imposibil de prevzut chiar i un singur bit de ieire pentru mesaj dat, fr a
aplica explicit funcia. De fapt, este chiar de dorit ca iruri de bii adiacente s aib amprente
complet diferite. Acesta se numete efectul de avalan i poate fi definit mai bine astfel:
Efectul de avalan este evident n cazul n care, pentru o modificare uoar a intrrii, func ia
hash produce o valoare complet diferit. Cu alte cuvinte, chiar dac un singur bit de intrare
este inversat, ar trebui s existe o probabilitate de 50% pentru fiecare bit de ieire ca acesta s
fie inversat. De asemenea, funciile hash trebuie s produc ntotdeauna ieiri care au un
aspect aleator.
Pot fi distinse dou tipuri de funcii hash criptografice. O funcie hash care are doar o
intrare, numit simplu funcie hash sau, uneori, Cod de Detecie a Manipulrii (MDC
Manipulation Detection Code). Acesta este tipul de funcie hash discutat n aceast lucrare,
aa c atunci cnd vorbim despre funcii hash, ne referim la funcii hash cu o singur intrare.
Apoi exist, de asemenea, funcii hash cu dou intrri, una dintre ele, mesajul iar cealalt o
cheie secret. Aceste funcii sunt denumite funcii hash cu cheie, iar o subcategorie
important a acestora sunt Codurile de Autentificare a Mesajului (MAC Message
Authentication Codes, a se vedea seciunea 1.4). Funciile hash cu cheie sunt uneori
construite din funcii hash obinuite prin concatenarea mesajului cu cheia.
De reinut faptul c exist, de asemenea, construcii de funcii hash n care al doilea
parametru este public. Un exemplu de astfel de funcii sunt funciile hash universale ntr-o
singur direcie, care vor fi discutate n Capitolul 4. Menionm c acestea nu sunt funcii
hash cu cheie, n sensul discutat mai sus.

1.3 Atacuri asupra funciilor hash criptografice


Principala diferen dintre funciile hash criptografice i cele non-criptografice este c
funciile hash criptografice trebuie s reziste la atacuri.
Funciile hash non-criptografice sunt ateptate s produc cteva coliziuni de hash-uri n
condiii normale de utilizare. n schimb, funciile hash criptografice nu sunt ateptate s
produc coliziuni nici chiar atunci cnd un atacator cu intenii maliioase ncearc n mod
deliberat s le creeze, utiliznd toate cunotinele lui matematice, toat puterea de calcul sau
oricare alt resurs disponibil. Acesta s-ar numi un atac prin coliziuni. n mod similar, un
atac care ncearc s produc o preimagine a unei valori hash (pentu o anumit funcie hash)
este numit un atac prin preimagine, i un atac care ncearc s creeze o a doua preimagine
este numit atac prin a doua preimagine. Acestea sunt cele trei proprieti ale funciilor hash,
care pot fi atacate (i, prin urmare, este de dorit s se demonstreze, ntr-un mod sau altul, c
astfel de atacuri sunt dificile).
Celelalte proprieti menionate la punctul 1.2, cum ar fi eficiena, determinismul,
caracterul aleator i efectul de avalan sunt proprietti dorite pentru funciile hash, dar care
nu sunt atacate n mod direct. Cu toate acestea lipsa efectului de avalan permite atacuri
bazate pe una sau mai multe dintre proprietile de securitate (de exemplu, printr-o analiz
statistic).
9

1.3.1 Atacurile Brute Force


Cea mai simpl metod de atac, din punct de vedere conceptual, este atacul prin for brut
(engl. brute force). Un astfel de atac efectueaz o cutare exhaustiv, adic, se realizeaz
un numr mare de ncercri, pn cnd una este cu succes. De exemplu, un atac brut prin
preimagine, care ncearc s gseasc o preimagine pentru un anumit hash , ar ncerca mai
multe mesaje diferite, crora le calculeaz amprentele, pe care le compar apoi cu

, pn

cnd are loc o potrivire. Cu ct este mai eficient o funcie hash, cu att devine mai eficient
acest tip de atac.
Dac o funcie hash are

valori posibile (de exemplu, n cazul unui hash de m bii,

fiecare ir de m bii reprezint o posibil amprent, adic funcia de distribuire este


surjectiv), atunci ar trebui ncercate n meedie
preimagine. Se poate spune c funcia hash are

mesaje pentru a gsi o


bii de securitate, sau chiar m bii de

securitate, din moment ce aceasta este doar o msur aproximativ. Un atac prin a doua
preimagine funcioneaz n mod similar. Trebuie ncercate aproximativ

mesaje pentru a

gsi unul care are hash-ul identic cu cel al unui mesaj dat. n cazul unui atac prin for brut ,
nu exist nicio diferen ntre atacul prin preimagine i atacul prin a doua preimagine. n
cazul unor atacuri mai inteligente, cunotinele suplimentare furnizate de primul mesaj ar
putea da atacatorului un uor avantaj.
Exist ns un mod mai inteligent si mai eficient de a gsi o coliziune prin for brut, care
se bazeaz pe paradoxul naterilor, o problem standard de statistic: Ci oameni trebuie s
se afle ntr-o camer pentru ca probabilitatea ca unul dintre ei s aib aceeai zi de na tere cu
a mea s fie mai mare de 50%? Pentru a rspunde la aceast ntrebare, considerm
probabilitatea ca cel puin una dintre cele

persoane sa fie nscut n aceeai zi cu mine.

Presupunem, de asemenea, c fiecare an are 365 de zile i toate zilele de natere sunt la fel de
probabile. Atunci

Rezolvnd inecuaia pentru

obinem c trebuie s se afle cel puin 253 de

persoane n camer.
Ci oameni trebuie s se afle n camer pentru ca probabilitatea ca doi dintre acetia s
aib aceeai zi de natere s fie mai mare dect 50%? Dac probabilitatea s se ntmple acest
lucru pentru

persoane este

atunci

10

Rezolvnd inecuaia pentru

obinem

. Aadar trebuie s se afle cel

puin 23 de persoane n camer pentru ca probabilitatea ca cel puin dou dintre ele s aib
aceeai zi de natere s fie mai mare dect 50%. Majoritatea oamenilor se ateapt ca acest
numr s fie mult mai mare, motiv pentru care aceast problem poart numele de paradoxul
naterilor.
Cu toate acestea, devine clar de ce se ntmpl acest lucru dac observm c exist exact

combinri posibile de cte 2 persoane ntr-o camer cu 23 de persoane.


Cnd persoanele cu aceeai zi de natere sunt nlocuite de mesaje cu aceeai valoare hash,
aceast teorie poate fi aplicat n atacuri asupra funciilor hash. Primul scenariu este
echivalent cu efectuarea unui atac prin a doua preimagine, dup cum s-a explicat mai sus: Un
mesaj este fixat, i trebuie gsit un alt mesaj cu acelai hash, fiind necesar un numr mare de
ncercri. Al doilea scenariu poate fi folosit pentru efectuarea unui atac prin coliziuni. Acest
atac poart denumirea de atacul naterilor (engl. birthday attack), deoarece succesul su se
bazeaz pe paradoxul naterilor. Pentru a gsi dou mesaje arbitrare care colizioneaz, trebuie
efectuate mult mai puine ncercri. De fapt, prin folosirea aproximrii prin serie Taylor a
funciei
surjectiv pe

, dup rezolvarea ecuaiei rezultate, se poate observa c pentru o funcie hash


bii (n cazul n care fiecare ieire are aceeai probabilitate i

este suficient

de mare), este de ateptat s se obin o coliziune prin evaluarea funciei pentru aproximativ
mesaje. De exemplu, o main care calculeaz un milion de hash-uri pe
secund ar avea nevoie de 600 000 de ani pentru a gsi a doua preimagine pentru o funcie
hash pe 64 de bii, dar ar putea gsi o coliziune arbitrar n aproximativ o or [6]. Prin
urmare, ordinul de complexitate al unui astfel de atac este rdcin ptrat din ordinul de
complexitate al unui atac obinuit prin for brut. Dac o funcie hash este expus atacului
naterilor, pentru a fi rezistent la coliziuni, aceasta trebuie s genereze un hash cu dublul
numrului de bii.
Un atac prin for brut este posibil pentru orice funcie hash, indiferent de structura sa.
Prin urmare este nevoie ca valoarea hash s fie destul de mare, astfel nct atacurile prin for
brut s devin mult prea costisitoare chiar i pentru cele mai performante computere
existente.
Dar ce nseamn sintagma "destul de mare"? Acest lucru depinde foarte mult de puterea de
calcul disponibil, i prin urmare, variaz cu timpul. n prezent, NIST (Institutul Naional
American de Standarde i Tehnologie) recomand nlocuirea tuturor funciilor hash care sunt
expuse atacului naterilor, cu cele care au securitate pe cel puin 256 bii [59]. Aceasta
nseamn c securitatea pe 256 bii este considerat a fi suficient mpotriva atacului
naterilor (i 128 de bii n cazul funciilor hash care nu sunt expuse unor astfel de atacuri).
Acest numr provine din calcule care iau n considerare faptul c actualul protocol va fi
folosit timp de 2-3 ani, mesajele folosite n protocol vor fi apoi stocate pentru ali 2-3 ani, n
11

timp ce atacurile ar avea nevoie mai muli ani pentru a ajunge la un rezultat. De asemenea
este luat n calcul Legea lui Moore, observaia empiric a faptului c puterea de calcul se
dubleaz la fiecare 18 luni, i se presupune c aceast afirmaie va rmne valid i n viitor.
1.3.2 Atacurile criptanalitice
Exist atacuri "mai inteligente" dect cele prin for brut. Investigaia matematic atent a
funcionrii unui algoritm hash adesea conduce la elaborarea unor atacuri cu un ordin de
complexitate mai mic dect cel al atacurilor prin for brut. Studiul metodelor care permit
astfel de atacuri se numete criptanaliza, iar atacurile de acest tip se numesc atacuri
criptanalitice. Desigur, puterea unui atacator depinde de resursele pe care le are la dispoziie.
n criptanaliz este considerat adevrat principiul lui Kerckhoff: algoritmul n sine este
unul public, adic este cunoscut de ctre atacator. Acest lucru este valabil pentru toate
funciile hash standard, utilizate pe scar larg. Securitatea nu ar trebui s se bazeze pe faptul
c algoritmul este ascuns atacatorului (modalitate care poart denumirea de securitate prin
obscuritate), ci ar trebui s i aib fundamentul n proprietile matematice ale func iilor
hash.
Este de reinut, de asemenea, c multe atacuri criptanalitice de succes sunt atacurile prin
canal lateral, care exploateaz o slbiciune n punerea n aplicare a unui algoritm, i nu
neaparat structura sa matematic. Astfel de atacuri sunt periculoase, iar aprarea mpotriva lor
este foarte important, ns acest aspect nu face obiectul acestei lucrri.
O funcie hash este considerat a fi spart dac a fost gsit un atac prin care poate fi
produs o preimagine, sau a doua preimagine, sau coliziuni, cu o complexitate de calcul mai
mic dect n cazul unui atac prin for brut. De exemplu, un hash pe 160 bii este considerat
spart dac pot fi gsite coliziuni prin

operaii, indiferent dac aceste operaii sunt fezabile

din punct de vedere computational sau nu. Acest lucru nseamn c atacul nu trebuie neaprat
s poat fi exploatat n practic pentru ca o funcie hash s fie declarat nesigur.
1.3.3 Adversarul
n teoria criptografiei, un atacator este adesea reprezentat ca un algoritm adversar. Un
atacator de succes este un algoritm care poate produce o (a doua) preimagine sau coliziuni n
complexitate fezabil. Pentru ca o funcie hash s fie sigur, trebuie s se demonstreze c un
astfel de algoritm nu exist. Aceasta este, n general, abordarea folosit pentru a demonstra
proprietile de securitate ale unei funcii hash. Se presupune c exist un algoritm care poate
produce eficient o (a doua) preimagine sau coliziuni, i acest algoritm este apoi utilizat pentru
a arta c poate conduce la gsirea soluiei unei alte probleme, despre care se cunoate c nu
pot fi gsite eficient soluii, obinndu-se astfel o contradicie. De exemplu, pentru a dovedi
c un hash este rezistent la preimagine, trebuie s se demonstreze c este "dificil" s se
produc o preimagine pentru o valoare hash dat, adic s se arate c nu exist niciun
algoritm de timp polinomial (adic eficient) care s poat realiza acest lucru. Un exemplu
tipic const n a presupune c un astfel de algoritm exist, pentru ca apoi s se ob in o
contradicie.

1.4 Aplicaii ale funciilor hash

12

Funciile hash sunt utilizate pe scar larg n informatic n diverse aplicaii. Vom ncepe
cu o scurt discuie a utilizrii non-criptografice a funciilor hash.
1.4.1 Aplicaii ale funciilor hash non-criptografice
n cazul acestor aplicaii se folosete doar proprietatea care spune c dou mesaje diferite
vor avea, cu o probabilitate foarte mare, dou amprente distincte. Celelalte proprieti
specifice nu sunt necesare.
Exemplul cel mai cunoscut este tabelul hash, care permite cutarea eficient a datelor ntro list de nregistrri. O funcie hash asociaz fiecare cheie (de exemplu, numele unei
persoane) cu un index (probabil unic) reprezentat de valoarea hash, folosit pentru a stoca i
localiza valoarea dorit. Este important ca indecii generai s fie distinci de la prima
evaluare a funciei hash, deoarece procedura de rezoluie a coliziunilor adaug complexitate
suplimentar, care degradeaz performana tabelelor hash.
O alt aplicaie important este detectarea erorilor. Atunci cnd datele sunt transmise
electronic, de exemplu, prin intermediul internetului, este foarte probabil s apar erori la
nivel de bit. Pentru a detecta aceste erori, poate fi adugat datelor o valoare hash. La primire,
valoarea hash este recalculat i comparat cu valoarea hash primit. n cazul n care valorile
sunt identice, este foarte puin probabil s fi aprut erori.
Funciile hash sunt, de asemenea, folosite pentru compararea rapid a datelor. n cazul n
care ar fi prea costisitor s se compare bit cu bit dou seturi de date, pot fi comparate doar
valorile hash ale acestora. n cazul n care sunt aceleai, atunci este foarte probabil ca seturile
de date originale s fie identice. Metoda este folosit pentru identificarea informaiei audio,
de exemplu, pentru a afla dac un fiier MP3 se regsete ntr-o anumit list de fiiere.
1.4.2 Aplicaii ale funciilor hash criptografice
O funcie hash care are o parte sau toate proprietile de securitate definite n seciunea 1.2
poate fi folosit n scopuri mult mai interesante: pentru aplicaii n criptografie.
Cei mai muli oameni asociaz imediat criptografia cu criptarea i decriptarea datelor.
Totui, aceasta reprezint doar o mic parte din ceea ce ofer, de fapt, criptografia. n afar de
criptare, disciplina include, de asemenea, autentificarea, controlul accesului, semnturile
digitale i multe altele. Pe parcursul ultimilor ani, aceste tehnici au devenit elemente centrale
ale securitii reelelor de calculatoare. Multe dintre aceste tehnici folosesc funcii hash
criptografice. Un exemplu standard care ilustreaz perfect rolul funciilor hash criptografice
este stocarea parolelor ntr-un sistem multi-utilizator, n care fiecare utilizator trebuie s se
autentifice prin intermediul unei parole. Astfel, sistemul trebuie s fie capabil s verifice dac
o parol introdus este corect. Da simpla stocare a tuturor perechilor <nume utilizator,
parola> ntr-un fiier nu este o idee bun, deoarece un astfel de fiier ar putea fi uor
compromis de ctre un atacator, care ar avea apoi acces la toate parolele. Din acest motiv, n
practic, doar valorile hash ale parolelor sunt stocate n fiier. n acest fel un atacator care
obine accesul la fiier nu poate afla nicio parol. El / ea nu le poate calcula pe baza
amprentelor deoarece funciile hash criptografice sunt ireversibile (engl. one-way). n
momentul n care este introdus o parol, este recalculat hash-ul acesteia, care se compar cu
valoarea stocat, autentificnd astfel un utilizator care cunoate parola corect.
Funciile hash reprezint, de asemenea, o parte vital a multor scheme de semntur
digital, concepute pentru a avea toate proprietile unei semnturi fizice, dar care pot fi
13

calculate i transmise electronic. Deoarece semnturile digitale folosesc adesea criptografia


cu cheie public i, prin urmare, sunt costisitor de calculat, este util s se aplice o funcie hash
documentului de semnat, i s semneze numai amprenta acestuia (care este, de obicei, mult
mai scurt). Deoarece calcularea hash-ului este rapid, acest proces economisete timp de
calcul. Acest lucru nseamn ns c schema de semnare este doar la fel de bun ca funcia
hash utilizat i c posibilele defecte ale funciei hash vor putea slbi securitatea semnturii.
Cu alte cuvinte, securitatea schemei de semntur depinde de calitatea funciei hash. De
exemplu, dac dou documente au acelai hash, semntura lor este, de asemenea, identic. n
cazul n care este posibil s se produc coliziuni de semnturi, acest lucru ar nsemna c
documentele pot fi falsificate. Dac o semntur poate fi uor falsificat, atunci semnatarul
poate nega credibil c el / ea a semnat documentul, iar schema de semntur devine inutil.
La fel ca funciile hash non-criptografice, funciile hash criptografice pot fi de asemenea
folosite pentru a verifica integritatea fiierelor i mai mult, pentru recunoaterea codului creat
cu intenii maliioase, avnd aplicaii n sistemele de detecie a intruziunilor i n serverele de
fiiere. Unele tipuri de sisteme de detecie a intruziunilor stocheaz un hash criptografic al
fiierelor de sistem importante, i sunt capabile de a verifica dac un fiier a fost sau nu
modificat prin recalcularea hash-ului i comparndu-l cu valoarea stocat. Serverele de fiiere
ofer adesea aa-numitele sume de control criptografice care pot fi utilizate pentru a confirma
integritatea fiierelor descrcate, atta timp ct serverul este unul de ncredere. Spre deosebire
de verificarea erorilor, folosit numai n cazul n care erorile au loc aleator (ceea ce face ca un
hash non-criptografic s fie suficient), detectarea codului ru-intenionat necesit detectarea
modificrilor deliberate aduse codului. Atacatorii care sunt contieni de faptul c sunt stocate
funcii hash pot ncerca s produc cod ru-intenionat cu acelai hash ca i codul original.
Dac funcia hash este rezistent la a doua preimagine, un astfel de cod mali ios devine
imposibil de creat.
Funciile hash pot fi de asemenea folosite pentru a construi alte primitive criptografice,
cum ar codurile de autentificare a mesajelor (MAC-uri, engl. Message authentication
codes). Un algoritm MAC poate fi o funcie hash cu cheie, adic o funcie hash care are ca
intrare un mesaj arbitrar de lung i o cheie secret. n cazul unei funcii hash rezistente la
coliziuni, doar cineva care cunoate cheia secret este capabil s calculeze valoarea hash, sau
MAC-ul. Un alt rol al MAC-urilor este de a proteja integritatea mesajului, deoarece permit
verificatorului (care, de asemenea, deine cheia secret) detectarea oricrei modificri a
coninutului mesajului.
Funciile hash criptografice mai pot fi folosite pentru a construi cifruri bloc, cifruri stream
i generatoare de numere pseudo-aleatoare.

1.5 Proiectarea funciilor hash criptografice


Avnd n vedere diferitele cerine pe care trebuie s le ndeplineasc o funcie hash
criptografic, devine evident c aceste funcii sunt greu de proiectat. Acest lucru devine i
mai evident dac sunt considerate i urmtoarele aspecte:
Spaiul intrrilor posibile
posibile

are o infinitate de elemente, n timp ce numrul ie irilor

este finit. Prin urmare, o funcie hash nu este niciodat injectiv. Cu


14

alte cuvinte, vor exista ntotdeauna coliziuni. Pentru ca o funcie hash criptografic s fie
rezistent la coliziuni, trebuie s existe o probabilitate extrem de redus ca dou mesaje
diferite so aib aceeai amprent. Mai mult, trebuie s fie dificil pentru un adversar, care
ncearc n mod deliberat s gseasc o coliziune, s realizeze acest lucru. Dificultatea const
n proiectarea unei funcii hash, astfel nct aceste coliziuni s fie greu de produs.
O alt provocare const n faptul c funciile hash trebuie s fie uor de calculat. Ele
trebuie s poat fi calculate eficient ntr-o direcie dar, n acelai timp, dificil de inversat. Cele
mai multe operaii care au aceast proprietate (de exemplu, factorizarea sau calculul
logaritmilor discrei) necesit nmuliri sau chiar exponenieri, care sunt costisitoare ca timp
de calcul. Operaiile care sunt efectuate rapid de ctre un calculator, cum ar fi XOR sau
adunarea, sunt uor de inversat.
Cu toate acestea, cea mai mare dificultate n proiectarea funciilor hash se afl n
dovedirea securitii acestora. Majoritatea funciilor hash care aparent prezentau proprieti
criptografice folositoare, au fost n cele din urm sparte. n acelai timp, este foarte dificil de
construit dovezi valide. Acest lucru este din cauza faptului c dovezile se bazeaz pe
numeroase ipoteze de simplificare, care de multe ori nu sunt suficient de realiste. Atacatorul
uman trebuie s fie nlocuit de un algoritm, iar puterea de calcul cuantificat cu precizie. De
asemenea, conceptul de "dificultate" variaz n mod considerabil, n ceea ce privete prerile
criptografilor. Mai mult, multe definiii sunt att de complicate nct devin extrem de greu de
manipulat matematic. Pentru c este att de dificil proiectarea unei funcii hash criptografice
bune, securitatea celor mai muli algoritmi hash utilizai n prezent este discutabil. Muli
algoritmi sunt bine gandii, a fost investit mult energie n dezvoltarea acestora i toi au fost
testai extrem de riguros. Totui construcia lor este una aparent ad-hoc, din care nu reiese clar
motivul pentru care aceti algoritmi au proprietile pe care susin c le au. Adesea este mai
mult vorba de speran dect certitudine. Poate nu n mod surprinztor, tot mai des sunt gsite
puncte slabe ale acestor algoritmi. S-a ajuns la o curs continu s se in pasul cu cele mai
recente atacuri i s se nlocuiasc funciile hash cu mereu alte versiuni, n sperana ca noul
algoritm s poat rezista o perioad suficient de timp pn cnd, ntr-o zi, cineva s
gseasc, n cele din urm, o funcie hash n care s se poat avea cu adevrat ncredere.

Capitolul 2: Funcii hash proiectate special


Funciile hash cele mai utilizate astzi sunt MD5 i SHA-1. Acestea sunt funcii hash
proiectate special, adic algoritmi care au fost special proiectai pentru operaiunile de
calculare a hash-ului. Alte exemple de algoritmi hash special proiectai sunt MD2, MD4 si
MD5 (familia MDX), SHA-0, SHA-1, SHA-256/224 i SHA-512/384 (familia SHA),
RIPEMD-160, HAVAL i hash-N.
Algoritmii hash special proiectai sunt concepui pentru a fi foarte eficien i pe maini pe
32 bii, ceea ce i face foarte folosii n practic, chiar dac securitatea lor este doar bazat pe
argumente euristice. Nici una dintre proprietile dorite ale funciilor hash criptografice nu
poate fi astzi dovedit. De fapt, toate funciile hash menionate mai sus, n afar de
algoritmii SHA-2 (de exemplu, SHA-224, SHA-256, SHA-384, SHA-512) sunt considerate
astzi a fi sparte. Dei nu toate atacurile teoretice sunt fezabile n prezent, acestea sunt mereu
mbuntite i puse n practic. ncrederea n funciile hash specializate a fost mult timp
15

subminat, ceea ce a fcut ca aproape toate funciile hash criptografice folosite astzi s
prezinte un grad de risc din ce n ce mai mare.
Acest capitol prezint cei mai utilizai doi algoritmi hash special proiectai de astzi, MD5
i SHA-1, modul n care funcioneaz, argumentele aduse n favoarea securitii lor i
modalitile prin care au fost atacai. Toate acestea motiveaz cercetarea funciilor hash
demonstrabil sigure, care vor fi investigate n capitolele urmtoare.

2.1 MD5
Termenul MD5 provine din englez, Message Digest Algorithm 5. Algoritmul a fost
proiectat de Ronald Rivest de la MIT n 1991 i este specificat n RFC MD5 [53]. Are nevoie
de un mesaj de lungime arbitrar ca intrare i produce o ieire pe 128 de bii. MD5 este
utilizat pe scar larg n lumea software-ului pentru calculul sumelor de control criptografice
i pentru a stoca parole. Face parte din diferite aplicaii, cum ar fi GPG (criptare cu cheie
public), Kerberos (autentificare de reea), TLS (conexiuni securizate client-server), SSL
(autentificare client-server), sisteme Cisco (sisteme de stocare a parolelor) i RADIUS
(autentificarea de la distan a utilizatorului) [44].
2.1.1 Terminologie i notaie
Un "octet" este de 8 bii i un "cuvnt" este o cantitate de 32 de bii. O secven de 8 bii
este interpretat ca un octet n care primul bit este bitul cel mai semnificativ, i o secven de 4
octei este interpretat ca un cuvnt n care primul octet este octetul cel mai pu in
semnificativ.
Prin semnul "+" notm adunarea modulo 2 32 i prin "

s" notm deplasarea circular la

stnga (rotaia) cu s poziii. Prin "X Y" notm operaia pe bii AND aplicat lui X i Y, prin
"X Y" notm operaia pe bii OR aplicat lui X i Y, prin "X Y" notm operaia pe bii
XOR aplicat lui X i Y, iar " X" reprezint complementul pe bii al lui X.
2.1.2 Algoritmul MD5
Fie

un mesaj de intrare de lungime

bii.

este mai nti completat pn cnd

lungimea sa este un multiplu de 512 bii, i apoi mprit n blocuri de 512 bi i


constnd din 16 cuvinte fiecare. Blocurile sunt apoi prelucrate, pe rnd, n 4 runde, fiecare
constnd din 16 operaiuni, folosind un buffer de 4 cuvinte notate

. Dup ce toate

blocurile au fost procesate, bufferul conine valoarea hash-ului. Mai precis, paii algoritmului
MD5 sunt urmtorii:
1. Completare. Este adugat un singur bit "1" la sfritul mesajului. Apoi sunt adugai
bii "0" pn cnd lungimea noului mesaj este congruent cu 448 modulo 512. n cele din
urm este adugat o reprezentare pe 64 de bii a lui b (lungimea iniial a mesajului).
Mesajul rezultat are lungimea un multiplu de 512 bii.
2. Iniializarea bufferului. Bufferul este iniializat cu valorile hexazecimale

16

3. Calcularea constantelor. Un tabel cu 64 de elemente este calculat dup formula


unde t este n radiani.
4. Funcii auxiliare. Patru funcii auxiliare, care primesc fiecare ca date de intrare trei
cuvinte pe 32 de bii i produc ca ieire un cuvnt pe 32 de bii, sunt definite astfel:

5. Ordonarea cuvintelor. Se definete urmtorul vector care determin n ce ordine sunt


procesate cuvintele unui anumit bloc n fiecare rund:
Runda 1
Runda 2:
Runda 3:
Runda 4:
6. Mrimea deplasrilor. Denete valoarea rotaiilor:
Runda 1:
Runda 2:
Runda 3:
Runda 4:
7. Procarea mesajului n blocuri de 16 cuvinte.
pentru

execut

(a) mparte

n cuvinte

(b) Salveaz

n ,

(c) pentru

n ,

, unde
n

este cuvntul cel mai din stnga.


:

execut

17

Sfrit /* bucla dup */


(d) Incrementeaz fiecare registru cu valoarea avut nainte de nceputul acestui bloc:

Sfrit /* bucl dup */


8. Ieire. Ieirea este

Operaia de la pasul 7c poate fi descris prin urmtoarea diagram:

2.1.3 Securitatea MD5


Potrivit propriilor sale declaraii din caietul de sarcini [53], Rivest a proiectat MD5 astfel
nct s fie imposibil din punct de vedere computaional s fie produse dou mesaje cu
aceeai amprent, sau s fie gsit un mesaj pentru un hash dat, cu alte cuvinte, s fie rezistent
la coliziune i rezistent la preimagine. n plus, MD5 a fost fcut s fie rapid pe maini pe 32
bii i s opereze fr tabele mari de substituie, prin urmare, poate fi implementat ntr-un
mod compact.
n timp ce al doilea i al treilea atribut pot fi uor verificate i sunt cu siguran adevrate,
securitatea algoritmului MD5 se bazeaz pe o serie de argumente euristice, fr dovezi
concrete de securitate. Argumentele euristice includ faptul c:
funciile auxiliare sunt neinversabile, nelineare i asimetrice;
18

dac exist bii n

independeni i impariali, atunci fiecare bit din

va fi independent i imparial;
fiecare pas adaug o valoare n rezultatul pasului anterior;
fiecare pas conine o constant de adunare unic;
cuvintele de intrare sunt acesate ntr-o ordine diferit n fiecare rund;
valorile de deplasare n runde diferite sunt distincte.
Toate aceste atribute sunt menite s sporeasc efectul de avalan, n sensul c dac o
intrare este schimbat uor (de exemplu, schimbarea unui singur bit de intrare), atunci ieirea
se modific n mod semnificativ (de exemplu, jumtate din biii de ieire sunt inversai).
Viteza algoritmului i faptul c este uor de implementat i disponibil publicului au fcut
ca MD5 s devin foarte popular. Acest lucru este un fapt extrem de alarmant, avnd n
vedere numrul mare de aplicaii criptografice n care este folosit astzi, cu toate c
securitatea sa nu poate fi susinut prin dovezi concrete.
2.1.4 Atacurile asupra MD5
MD5 a fost proiectat n 1991 pentru a nlocui o funcia hash anterioar, MD4, pentru care
au fost gsite defecte. Cu toate acestea, curnd s-a descoperit c MD5 are, de asemenea,
probleme. ncepnd din 1993, securitatea algoritmului MD5 a fost de multe ori pus sub
semnul ntrebrii din cauza mai multor atacuri prin coliziuni de succes, iar rezultatele recente
au distrus complet ncrederea n acest algoritm.
n 1993, den Boer i Bosselaers [17] au reuit s gseasc o a a-numit pseudo-coliziune
pentru funcia de compresie din MD5, adic au fost gsii doi vectori de iniializare diferii
care s produc o coliziune n cazul n care funcia de compresie MD5 este aplicat aceluiai
mesaj. Dei acest atac nu are importan practic, a expus prima slbiciune a algoritmului
MD5. Dobbertin [08] a anunat o coliziune a funciei de compresie MD5 n 1996. n timp ce
aceasta nu a fost un atac asupra versiunii complete a algoritmului MD5, ea a ngrijorat pe
criptografi suficient de mult nct acetia s recomande trecerea la un algoritm nlocuitor,
cum ar fi SHA-1, WHIRLPOOL, sau RIPEMD-160.
De asemenea, un hash pe 128 bii este suficient de mic pentru a fi spart prin atacul
naterilor. Cooke i compania sa a lansat un proiect de cutare distribuit n 2004 cu scopul
de a gsi coliziuni pentru MD5 folosind o cutare prin for brut prin metoda lui Pollard Rho
[39, 40]. Proiectul a fost abandonat cteva luni mai trziu, atunci cnd s-a anunat c pot fi
determinate coliziuni prin metode analitice. Acest anun a reprezentat pentru muli unul dintre
cele mai importante momente n criptanaliz, i se spune c Wang i echipa sa [10] a fost
aplaudat n picioare atunci cnd au raportat coliziunile gsite pentru algoritmul MD5 la
conferina CRYPTO din august, 2004. Atacul lor a durat aproximativ o or pe un cluster IBM
p690, un server Unix extrem de puternic. Un an mai trziu, acest atac a fost mbuntit de
ctre Klima [65], care a prezentat un algoritm capabil de a construi coliziuni n termen de
doar cteva ore folosind un singur notebook. Lenstra, Wang i Weger [31] au artat cum acest
lucru ar putea deveni un atac de importan practic prin construirea a dou certificate X.509
cu chei publice diferite dar cu acelai hash MD5. X.509 este un standard utilizat pe scar
larg n infrastructura de chei publice (PKI Public Key Infrastructure), iar acest atac permite
construirea de certificate false. Acesta a fost primul atac asupra algoritmului MD5 de
importan practic.
19

n martie 2006, Klima [12] a prezentat un algoritm din nou mbuntit, care poate gsi
coliziuni n termen de un minut pe un notebook obinuit. Acesta folosete o metod numit
crearea de tuneluri (engl. tunneling).
Desi pn n prezent au fost anunate doar atacuri prin coliziuni (nu i prin preimagine), a
fost demonstrat c acestea pot fi puse n practic, ceea ce a fcut ca MD5 s devin un
algoritm lipsit de siguran. nlocuirea acestuia a fost mult timp recomandat de ctre cei care
neleg semnificaia acestor atacuri. n afar de atacurile criptanalitice, numeroase proiecte au
creat recent baze de date pentru cutarea n sens invers a valorilor hash MD5. Acestea sunt
uor accesibile on-line i pot fi folosite pentru a cuta preimaginile unui numr mare de
amprente MD5. Atunci cnd se ncearc spargerea unor parole, care de cele mai multe ori
const n cuvinte uzuale care pot fi gsite ntr-un dicionar, consultarea unei astfel de baze de
date are mari anse de reuit.

2.2 SHA-1
SHA-1 este cel mai des utilizat membru al familiei SHA (Secure Hash Algorithm). Acesta
a fost publicat de ctre Agenia Naional de Securitate (NSA National Security Agency) n
1995 ca un standard al guvernului SUA [67] care s nlocuiasc algoritmul SHA-0 din 1993,
n care a fost gsit un defect. SHA-1 primete un mesaj de intrare de cel mult

bii i

produce o amprent pe 160 biti.


Din moment ce MD5 s-a dovedit a fi nesigur, SHA-1 a devenit cea mai frecvent utilizat
funcie hash. Este folosit n aplicaii de securitate i protocoale cum ar fi OpenPGP
(criptarea datelor), S / MIME (criptarea cu cheie public i semnarea digital a e-mail-urilor),
IPSec (criptare i/sau autentificarea pachetelor IP) i SSH (conectarea sigur de la distan).
Sistemul de prevenire a copierii folosit de consola Xbox de la Microsoft, de asemenea, se
bazeaz pe SHA-1 [45].
2.2.1 Terminologie i notaie
n ceea ce privete SHA-1, 8 bii alctuiesc un "octet", cu bitul cel mai semnificativ listat
primul, 4 octei formeaz un "cuvnt" cu octetul cel mai semnificativ listat primul, iar 16
cuvinte alctuiesc un bloc.
Ca i nainte, semnul "+" marcheaz adunarea modulo 2 32 i "

s" marcheaz deplasarea

circular la stnga (rotaia) biilor cu s poziii. Semnele "", "", "" i "" marcheaz
operaiile pe bii AND, OR, NOT, respectiv XOR.
2.2.2 Algoritmul SHA-1
SHA-1 este adesea considerat succesorul lui MD5, deoarece are un design foarte
asemntor. Completarea se efectueaz n acelai fel, apoi un mesaj M de
mprit n blocuri de cte 16 cuvinte

bii lungime este

, iar fiecare bloc este procesat n 4 runde,

constnd n 20 de operaii fiecare, folosind un tampon de 5 cuvinte


toate blocurile au fost prelucrate, tamponul conine hash-ul mesajului.
20

. Dup ce

Mai precis, paii algoritmului SHA-1 se descriu astfel:


1. Completare. M este considerat a fi un ir de bii i un singur bit "1" este adugat la
sfritul mesajului. Apoi, sunt adugai bii "0" pn cnd lungimea noului mesaj este
congruent cu 448 modulo 512. n cele din urm este anexat o reprezentare pe 64 de bii a
lui , rezultnd un mesaj care are lungimea egal cu un multiplu de 512 bii.
2. Iniializarea tamponului. Tamponul este iniializat cu valorile hexazecimale:

3. Constante. Urmtoarele constante sunt utilizate (n hexazecimal):

4. Funcii auxiliare. Este utilizat o secven de funcii logice, fiecare opernd pe cte trei
cuvinte i avnd ca ieire un singur cuvnt. Acestea sunt definite astfel:

5. Prelucrarea n blocuri a mesajului.


pentru
(a) mparte

execut
n 16 cuvinte

(b) Pentru
(c) Salveaz

(d) pentru

, unde

fie
ca ,

ca ,

este cuvntul cel mai din stnga.


.

ca

as

execut

sfrit / * pentru bucla * /


21

(e) Apoi incrementeaz pe fiecare din cei patru regitri cu valoarea pe care o avea nainte
de nceputul acestui bloc:

Sfrit /* bucl dup */


8. Ieire. Ieirea este

Operaia de la pasul 5d poate fi descris prin urmtoarea diagram:

2.2.3 Securitatea SHA-1


Autorii documentului SHA-1 RFC [67] susin c este nefezabil din punct de vedere
computaional s fie gsit un mesaj care corespunde unui anumit hash, sau s fie gsite dou
mesaje diferite care produc acelai hash prin SHA-1. ns, ca i n cazul MD5, nu exist
probe de securitate i singurele argumente care pot sprijini aceast afirmaie sunt de natur
euristic, ca i cele menionate pentru algoritmul MD5 n seciunea 2.1.3.
SHA-1 este, de asemenea, foarte rapid pe mainile pe 32 de bii i poate fi implementat
ntr-un mod compact, din acest motiv fiind foarte folosit pe scar larg. De fapt, pe msur ce
erau descoperite defecte n MD5, criptografii recomandau nlocuirea acestuia cu SHA-1, ceea
ce s-a i ntmplat n numeroase aplicaii.
Deoarece i SHA-1 a fost spart (pot fi produse coliziuni cu o complexitate computa ional
mai mic dect cea a unui atac prin for brut), NIST acum intenioneaz sa nlocuiasc
SHA-1 cu unul din membrii familiei SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512,
denumii dup lungimea amprentelor produse), pentru care nu au fost raportate atacuri pn
n prezent.

22

2.2.4 Atacurile asupra SHA-1


Membrii familiei SHA au fost concepui ca succesori ai MD4, la fel ca MD5, dar au
rezistat mai mult timp. SHA-1 este foarte asemntor cu predecesorul su, SHA-0. Primul
motiv care a determinat punerea sub semnul ntrebrii a securitii algoritmului SHA-1 a fost
anunul c SHA-0 a fost spart de ctre Chabaud i Joux [19] la CRYPTO '98.
Urmtoarea piatr de hotar n criptanaliza lui SHA-0 a fost atunci cnd Wang si echipa sa
[10] au anunat atacul lor prin coliziune din 2004, care funciona, de asemenea, i pentru
SHA-0. Acela a fost momentul n care criptografii au nceput s recomande gsirea unei
alternative la SHA-1, mai ales prin proiectarea unor criptosisteme noi. De asemenea NIST a
anunat c va elimina treptat utilizarea lui SHA-1 pn n 2010 pe care l va nlocui cu una
din variantele SHA-2 [27].
Primul atac de succes asupra algoritmului SHA-1 a fost efectuat de Rijmen i Oswald [52]
la nceputul anului 2005. Ei au fost capabili s sparg o versiune redus a algoritmului. Doar
o lun mai trziu a fost anunat o spargere complet a algoritmului SHA-1 de ctre Wang,
Yin i Yu [34]. Aceasta a fost o alt zi memorabil pentru Wang i echipa ei, care i-au bazat
atacul pe mai multe metode diferite utilizate mai devreme n atacurile asupra SHA-0 i MD5.
Pentru acest atac au fost necesare 269 operaii, dar a fost curnd mbuntit s aib nevoie
doar de 263 operaii [46]. Astfel de atacuri prin coliziune pornesc, n general, de la dou
mesaje care sunt apoi modificate continuu pe parcursul atacului. Coninutul mesajelor care
colizionau era astfel determinat de ctre algoritm. Dei acest procedeu are o mare importan
teoretic, este greu de transformat ntr-un atac practic.
Cu toate acestea, la CRYPTO '06, Recheberger i de Cannire au anunat primul atac prin
coliziuni asupra algoritmului SHA-1, n care atacatorul poate influena mesajele care
colizioneaz. Potrivit lui Recheberger [13], noul atac permite ca pn la 25% din mesajele
care colizioneaz s fie selectate n mod liber, de exemplu, direct sub form de text. Restul de
75% este determinat de ctre algoritm, ns se crede c procentul de 25% poate fi mrit prin
optimizarea metodei de atac. Acesta este un atac destul de practic, chiar i in stadiul n care se
afl, avnd n vedere c documentele HTML, de exemplu, pot avea orice coninut ntre tagurile <html>. Deci, este acum posibil s se produc dou documente aparent identice HTML
cu acelai hash SHA-1. Acest lucru face ca SHA-1 s nu fie cu mult mai bun dect MD5.
La fel ca i n cazul algoritmului MD5, nici pentru SHA-1 nu au fost nc raportate atacuri
prin preimagine, dar atacurile prin coliziuni au atins un nivel alarmant, care face necesar
nlocuirea urgent a acestui algoritm.
2.3 Securitatea funciilor hash proiectate special
La fel ca n cazul algoritmilor MD5 i SHA-1, au fost efectuate atacuri de succes asupra
tuturor funciilor hash proiectate special, cu excepia algoritmului RIPEMD-160 i a familiei
SHA-2. ntr-adevr, unele atacuri prin coliziune au o importan practic limitat i nc nu
au fost gsite atacuri prin preimagine. Cu toate acestea, exist numeroase motive pentru a nu
avea ncredere n funciile hash proiectate special . Mai important dect atacurile n sine este
faptul c securitatea acestor algoritmi nu poate fi dovedit n mod riguros. Funciile hash au
prea multe aplicaii importante pentru ca securitatea lor s fie lsat pe seama unor ipoteze i
a norocului. Sunt necesare funcii hash ale cror proprieti de securitate s reprezinte o
certitudine.

23

Capitolul 3: Funcii hash demonstrabil sigure


Evoluiile recente n criptanaliza funciilor hash au artat n mod clar c argumentele
euristice de securitate nu sunt suficient de bune. Este nevoie de o demonstraie riguroas.
Generarea hash-urilor este un concept vital n criptografie i, n acest moment, nu exist nicio
funcie hash care s fie eficient i sigur n acelai timp. Nimeni nu tie exact ct de departe
ne aflm de un astfel de model, ns cercetarea n domeniul funciilor hash demonstrabil
sigure a nceput n urm cu muli ani n urm. Exist unele modele promitoare care par s
aib nevoie de doar un pic mai mult munc pentru a deveni practice.
O problem major este ntotdeauna compromisul ntre viteza i securitate. Securitatea de
obicei are legtur cu dificultatea de a rezolva o problem calculabil dificil, dar cele mai
multe probleme de acest tip implic operaiuni lente, precum exponenierea sau multiplicarea.
Funciile hash demonstrabil sigure, probabil c nu vor fi niciodat la fel de rapide ca funciile
hash proiectate special, dar acesta ar putea fi un sacrificiu necesar pentru a asigura
securitatea.
nainte de toate, ns, trebuie s se rspund la cteva ntrebri de baz: Ce fel de
proprieti are o funcie hash demonstrabil sigur, n ce const securitatea, cum este msurat
securitatea, cum este dovedit securitatea i cum pot fi proiectate funciile hash sigure?
Aceste idei de baz sunt introduse n acest capitol pentru ca n urmtoarele capitole s
prezentm cteva exemple concrete de astfel de funcii.

3.1 Tipuri de funcii hash demonstrabil sigure


Exist diferite tipuri de funcii de hash demonstrabil sigure, n funcie de proprietile de
securitate care trebuie s fie ndeplinite.
Definiie 3.1.1 (funcia hash rezistent la coliziuni FHRC)
O funcie hash rezistent la coliziuni (FHRC) este o funcie hash care este
rezistent la preimagine
rezistente la coliziuni.
Conceptul de funcii hash rezistente la coliziuni a fost introdus pentru prima dat de
Merkle [4], i prima definiie formal a fost dat de Damgrd n 1989 [51]. Deoarece
rezistena la coliziuni implic rezistena la preimagine i rezistena la a doua preimagine,
funciile hash rezistente la coliziuni au toate cele trei proprieti de securitate dorite i sunt,
prin urmare, considerate "cele mai bune" funcii hash. Cu toate acestea, ele sunt, de
asemenea, i cel mai greu de proiectat, deoarece sunt extrem de dificil de aprat mpotriva
atacurile prin coliziune. Acest fapt motiveaz definirea unei alte primitve.
Definiie 3.1.2 (funcie hash ntr-o singur direcie sau FHSD)
O funcie hash ntr-o singur direcie (FHSD) este o funcie hash care este
rezistent la preimagine
rezistent la a doua preimagine.
Funciile hash ntr-o singur direcie au fost introduse pentru prima dat de ctre Diffie i
Hellman n 1976 [40]. Deoarece rezistena la preimagine este o cerin mai slab dect
rezistena la coliziuni, funciile cu aceast proprietate sunt mai uor de proiectat dect FHRCurile. O primitiv uor diferit a fost introdus de ctre Naor i Yung n 1989 [1].
24

Definiie 3.1.3 (funcie hash universal ntr-o singur direcie sau FHUSD)
O funcie hash universal ntr-o singur direcie

este o familie de funcii hash ntr-o

singur direcie, parametrizat de o cheie


unde

este spaiul cheilor ( este mrimea cheii n bii).

De reinut faptul c, aici, cheile nu sunt elemente secrete. Ele sunt publice i au rol de
parametri, dei continu s fie numite, n mod tradiional, chei. Scopul lor nu este evident fr
o definiie mai formal a FHUSD-urilor utiliznd modelul unui algoritm atacator, care va fi
prezentat n seciunea 4.1.
Naor i Yung [1] au dovedit n mod constructiv existena FHUSD-urile i, de asemenea, au
artat c presupunerea lor de securitate, dei nu la fel de puternic precum cea a FHRC-urilor,
este suficient de puternic pentru unele aplicaii. De exemplu, ei propun o schem de
semntur digital ntr-o singur direcie care se bazeaz pe FHUSD-uri dar care poate rezista
mpotriva celui mai general tip de atac cunoscut (cu alte cuvinte, imposibil de falsificat).
Dup ce am slbit ipoteza, trecnd de la FHRC-uri la FHSD-uri, este natural s ducem
aceast idee cu un pas mai departe, s definim o alt proprietate, i s propunem un nou tip de
funcie hash demonstrabil sigur.
Definiie 3.1.4 (funcie hash rezistent la preimagine sau FHRP)
O funcie hash rezistent la preimagine (FHRP) este o funcie hash care este
rezistent n faa atacurilor prin preimagine.
Aceasta este "cel mai slab" tip de funcie hash, deoarece nu necesit nici rezisten la a
doua preimagine, nici rezisten la coliziuni. Prin urmare este, de asemenea, cel mai uor de
proiectat. Cu toate acestea, ea este suficient de bun pentru aplicaiile de autentificare cum ar
fi stocarea parolelor, aa cum se va arta n capitolul 5.

3.2 Probleme NP-complete


Toate tipurile de funcii hash demonstrabil sigure au nevoie ca anumite operaiuni (cum ar
fi gsirea preimaginilor, a preimaginilor secundare, sau a coliziunilor) s fie "dificile" sau
"nefezabile computaional, chiar dac teoretic sunt uor de rezolvat. O preimagine
ntotdeauna exist, ns nimeni nu ar trebui s o poat gsi, chiar dac deine toat puterea de
calcul, toate resursele din lume, sau un interval nelimitat de timp. Se pune problema: cum se
poate defini mai riguros acest lucru i cum ar putea fi dovedit?
n informatica teoretic exist o teorie important despre o clas de probleme numite
probleme NP-complete, considerate a fi foarte dificil de rezolvat. Dei dovada acestui fapt
rmne una dintre cele mai mari probleme nerezolvate din informatic, oamenii de tiin au
motive ntemeiate s cread c nu exist algoritmi eficieni care s rezolve astfel de
probleme. Ele sunt considerate cele mai dificile probleme ale cror soluii, ns, pot fi
verificate ntr-un mod eficient.
Pn n acest moment nu am definit riguros ce nseamn o problem "dificil". O metod
des folosit n criptografie este etichetarea unei probleme ca fiind "dificil", dac este NPcomplet. Dificultatea operaiilor este apoi dovedit prin raportarea la alte probleme NP25

complete bine-cunoscute. n cazul n care se poate dovedi c gsirea unei preimagini pentru
un hash este cel puin la fel de dificil ca rezolvarea unei anumite probleme NP-complete,
atunci acest fapt reprezint o indicaie clar c problema n discuie este dificil.
Aceast metod este diferit de modul obinuit n care se realizeaz demonstraiile n
matematic i ar putea prea imprecis i nesatisfctoare la nceput, dar este cea mai bun
metod folosit n prezent, care s-a dovedit a funciona foarte bine n practic. Este n mod
evident mult mai bine dect ceea ce se poate face pentru funciile hash proiectate special.
Mecanismul a fost formalizat de-a lungul anilor (de exemplu, n [56]) i permite probarea
unor afirmaii concrete despre securitatea anumitor operaii. Aceast seciune prezint unele
dintre cele mai importante concepte ale teoriei NP-completitudinii i explic modul n care
problemele NP-complete pot fi folosite pentru a dovedi proprietile de securitate ale
funciilor hash criptografice.
3.2.1 Terminologie i notaie
n primul rnd, trebuie s se fac distincie ntre termenii "problem", "instan" i
"algoritm". O problem este o ntrebare general la care se ateapt un rspuns i are mai
multe instane; fiecare instan are o soluie. S-ar putea s existe mai muli algoritmi care
rezolv o problem. O problem este definit formal dup cum urmeaz:
Definiie 3.2.1 (problem abstract)
O problem abstract

este o funcie

care mapeaz o isntan din mlinea

instanelor problemei la o soluie din mulimea

a soluiilor problemei respective.

De exemplu, problema drumului minim poate fi formulat astfel: Fiind dat un graf G i
dou vrfuri

, gsii drumul de lungime minim ntre

(pentru definiii i teorie a

se vedea seciunea 5.1). O instan a acestei probleme ar fi un triplet format dintr-un anumit
graf

i dou vrfuri

. O soluie ar fi o secven de vrfuri v, v1,. . . , vn, w care

descrie drum de la v la w.
O problem de decizie este o problem la care se poate rspunde fie cu da, fie cu nu.
Formal avem urmtoarea definiie:
Definiie 3.2.2 (problema de decizie)
O problem de decizie

este o funcie

care mapeaz o instan din

mulimea I de instane ale problemei la o soluie din mulimea

n mod normal teoria NP-completitudinii se aplic numai pentru probleme de decizie. Dei
multe probleme nu sunt probleme de decizie, orice problem poate fi transformat ntr-o
problem de decizie ntr-un mod natural. Problema drumului minim este o problem de
optimizare, dar care poate fi reformulat ca o problem de decizie n felul urmtor:
Considernd un graf

i dou vrfuri

i , exist un drum de la
26

la

de lungime cel mult

? Aceast problem este denumit

. Soluia 1 nseamn, de obicei, "da" iar prin

0 se nelege "nu". Este evident c, dac poate fi rezolvat problema de optimizare, atunci
problema de decizie poate fi, de asemenea, rezolvat, pur i simplu prin compararea valorii
obinute din soluia problemei de optimizare (adic lungimea drumului minim) cu cea din
problema de decizie. Aceasta nseamn c problema de optimizare este cel puin la fel de
dificil ca i problema de decizie. Prin urmare, problema de optimizare poate fi, de asemenea,
considerat NP-complet (conform definiiei din seciunea 3.2.5), dei teoria NPcompletitudinii se aplic doar problemelor de decizie.
Un algoritm este o procedur pas-cu-pas general (un program de calculator), care rezolv
o problem dat. Cu alte cuvinte, considernd o anumit instan a unei probleme, algoritmul
ncearc s gseasc soluia corespunztoare. Fiind un program de calculator, un algoritm
poate lua numai intrri sub forma de iruri de cifre binare (de exemplu, reprezentarea binar a
numerelor naturale). Prin urmare, orice instan a problemei trebuie s fie codificat n acest
mod.
Definiie 3.2.3 (codificare)
O codificare este o funcie definit pe o mulime de obiecte abstracte, cu valori n
mulimea tuturor irurilor de cifre binare

. De exemplu, un graf poate fi codificat ntr-

un ir binar prin enumerarea rndurilor matricii sale de adiacen , prin listarea tuturor
nodurilor i muchiilor ntr-un mod specificat, sau prin listarea fiecrui nod, mpreun cu toi
vecinii si. Folosind o anumit codificare, fiecare problem abstract poate fi convertit ntr-o
problem concret.
Definiie 3.2.4 (problem concret)
O problem concret este o problem abstract avnd mulimea instanelor din

Notaie 3.2.5
Dac

sunt dou funcii definite pe

cu valori n

exist o constant c, astfel nct


rezolv o problem n timp

, atunci

pentru orice

dac
. Un algoritm

dac, atunci cnd este furnizat o instan a problemei

de lungime n (adic irul binar al codificrii are lungimea n), algoritmul poate produce soluia
ntr-un timp cel mult egal cu

3.2.2 Probleme rezolvabile n timp polinomial


Definiie 3.2.6 (problem rezolvabil n timp polinomial)
O problem este rezolvabi n timp polinomial dac exist un algoritm
problema n timp

pentru un anumit numr natural

intrrii.
27

fixat, unde

care rezolv
este lungimea

Algoritmul

se numete algoritm de timp polinomial. Mulimea tuturor problemelor

rezolvabile n timp polinomial este notat de obicei cu P. Ele sunt n general considerate uor
de rezolvat.
Definiie 3.2.7 (clasa de complexitate P)
Clasa de complexitate P este definit ca mulimea problemelor de decizie concrete care
sunt rezolvabile n timp polinomial.
Un exemplu de problem n P este

, deoarece exist un algoritm care rezolv

problema n timp polinomial. Deoarece mulimea polinoamelor este nchis fa de operaia


de adunare, nmulire, respectiv compunere, P are, de asemenea, proprieti de nchidere. De
exemplu, dac un algoritm realizeaz un numr fix de apeluri la o subrutin cu un timp de
execuie polinomial, atunci acesta este de timp polinomial. n cazul n care rezultatul unui
algoritm de timp polinomial devine dat de intrare pentru un alt algoritm de timp polinomial,
algoritmul compus este de asemenea un algoritm de timp polinomial. Aceste proprieti sunt
eseniale pentru cele mai multe dovezi care se bazeaz pe algoritmi de timp polinomial.
3.2.3 Probleme verificabile n timp polinomial
Definiie 3.2.8 (problem verificabil n timp polinomial)
O problem este verificabil n timp polinomial dac exist un algoritm

de timp

polinomial care primete ca date de intrare o instan a unei probleme i o solu ie a acesteia,
i care verific dac soluia este corect. Algoritmul

se numete algoritm de verificare.

Soluia adesea poart numele de certificat deoarece atest faptul c instana este, ntr-adevr,
o instan a problemei date.
De exemplu, considerm problema

. Dat fiind o anumit instan (adic un graf

i dou vrfuri) i o soluie (adic un drum p ntre cele dou noduri), se poate uor verifica
dac lungimea drumului este de cel mult k. Dac rspunsul este afirmativ atunci p atest
faptul c instana ntr-adevr aparine problemei

Definiie 3.2.9 (clasa de complexitate NP)


Clasa de complexitate NP reprezint o mulime de probleme de decizie concrete, care sunt
verificabile n timp polinomial.
este n NP, ns este, de asemenea, n P, deoarece verificarea unui soluii
dureaz aproximativ la fel de mult ct pentru a o gsi de la zero. De fapt, orice problem n P
se afl, de asemenea, n NP, adic

. Apare ns ntrebarea dac

, adic dac

orice problem verificabil n timp polinomial, poate fi, de asemenea, rezolvat n timp
polinomial. Aceast ntrebare a rmas fr rspuns pn n ziua de azi. Clasa de probleme
28

pentru care nu este cunoscut niciun algoritm de timp polinomial dar care pot fi verificate n
timp polinomial se numete NPC. Pentru o definiie mai riguroas este nevoie s mai
introducem cteva concepte.
3.2.4 Teoria limbajelor formale
Definiia 3.2.10 (alfabet)
Un alfabet este o mulime finit de simboluri.
Definiie 3.2.11 (limbaj)
Un limbaj

peste un alfabet

este o mulime de iruri formate cu simboluri din

Limbajul format din toate irurile peste

se noteaz

Alfabetul cel mai frecvent utilizat este

.
i un limbaj peste acest alfabet este

.
Astfel, mulimea tuturor instanelor

cu privire la o anumit problem de decizie

poate

fi reprezentat ca un limbaj. Dac fiecare instan este codificat ca un ir binar, problema


poate fi considerat ntreaga mulime
De observat faptul c nu orice ir din

are sens ca instan de problem, dar acest

lucru nu conteaz pentru c putem conveni pur i simplu ca soluia problemei pentru acele
iruri s fie 0.
Din moment ce

este n ntregime caracterizat prin acele instane ale problemei care

produc ca rezultat 1, putem vedea

ca un limbaj

peste

unde

. Cu alte cuvinte, L I este stabilit de instanele problemei


care produc ca rezultat valoarea 1. n acest fel, fiecare problem de decizie poate fi descris
ca un limbaj

. Acest cadru al limbajelor formale permite acum stabilirea mult mai

riguroas a unei legturi ntre problemele de decizie i algoritmii care le rezolv.


Definiie 3.2.12 (acceptare / respingere)
Un algoritm
care

accept un ir

. Limbajul acceptat de ctre

n cazul n care
este

i l respinge n cazul n
.

Definiie 3.2.13 (decidere)


Un limbaj

este decis de ctre un algoritm

respins de ctre .

29

dac fiecare ir binar este fie acceptat, fie

De observat faptul c exist o diferen subtil ntre acceptarea i deciderea unui limbaj.
Un algoritm care accept un limbaj

(adic, care accept orice

resping toate irurile de caractere

) nu trebuie neaprat s

. Se poate, de asemenea, s nu produc nicio ieire

pentru aceste iruri de caractere (de exemplu, s intre ntr-un ciclu infinit). Un algoritm care
decide un limbaj

trebuie fie s accepte, fie s resping fiecare element

Folosind aceast terminologie, o clas de complexitate poat fi acum definit ca o mul ime
de limbaje, pentru care membrii sunt stabilii n funcie de o msur de complexitate (cum ar
fi durata timpului de execuie) pentru un algoritm care determin dac un ir dat aparine unui
anumit limbaj. Definiia lui P poate fi acum formulat astfel:
i
Acum, algoritmul de verificare

este mult mai precis definit ca fiind un algoritm cu dou

date de intrare: irul de intrare


limbajul verificat de

i un ir binar

(numit certificat). Prin urmare,

este definit astfel:

3.2.5 Probleme NP-complete


Acum putem da o definiie a clasei NPC. Aceasta este mulimea de probleme care sunt
verificabile n timp polinomial, dar pentru care nu se cunoate dac sunt rezolvabile n timp
polinomial.
Toate problemele din NPC sunt "n mod esenial echivalente", n sensul c, dac exist o
problem NP-complet care s poate fi rezolvat n timp polinomial, atunci toate problemele
NP-complete pot fi rezolvate n timp polinomial. Aceast "echivalen" poart denumirea de
reductibilitate.
O problem

poate fi redus la o alt problem

"uor reformulat", ca o instan a lui


la o instan a lui

. Descriind

, i o soluie pentru o instan a lui

. Acest lucru nseamn c, dac

de asemenea, rezolvat, prin urmare,

dac orice instan a lui

poate fi

ofer o soluie

poate fi rezolvat, atunci

poate fi,

este la fel de cel mult la fel de dificil de rezolvat ca i

ca un limbaj , acest lucru poate fi formulat astfel:

Definiie 3.2.14 (reductibilitate n timp polinomial)


Un limbaj

este reductibil n timp polinomial la un limbaj

(scriem

) dac

exist o funcie de reducere calculabil n timp polinomial (adic dac exist un algoritm de
timp polinomial care poate calcula aceast funcie)
30

astfel nct pentru orice

s avem

Evident, dac

dac i numai dac

atunci

. De asemenea, poate fi vzut destul de

uor, c aceast relaie este simetric. Dac

atunci are loc i

Definiie 3.2.15 (limbaj NP-complet)


Un limbaj L este NP-complet dac
1.
2

oricare ar fi

Un exemplu de problem NP-complet este problema ciclului hamiltonian: Exist un ciclu


hamiltonian ntr-un graf

dat? (prin ciclu hamiltonian nelegem un ciclu care viziteaz

fiecare nod al lui G). Problema ciclului hamiltonian este n mod clar n NP deoarece, fiind dat
un graf i un ciclu, se poate verifica cu uurin dac acesta este sau nu ciclu hamiltonian.
Dar, pentru un graf (suficient de mare), este foarte dificil" de gsit un ciclu hamiltonian,
chiar i numai de stabilit dac acesta conine un astfel de ciclu.
Definiie 3.2.16 (limbaj NP-dificil)
Un limbaj

este NP-dificil dac acesta ndeplinete proprietatea 2 din definiia de mai sus.

Proprietatea 2 impune ca orice limbaj


deci

s fie reductibil la un limbaj NP-complet ,

este cel puin la fel de greu ca oricare alt limbaj NP-complet. Acesta este motivul

pentru care limbajele din NPC sunt adesea numite drept cele mai dificile limbaje n NP.
Avnd n vedere c relaia "" este simetric, orice limbaj NPC poate fi mai dificil doar cu
un factor polinomial dect un alt limbaj NPC, aadar toate limbajele din NPC pot fi
considerate "echivalente", i pot fi reduse unele la altele. Prin urmare, pentru a dovedi c un
limbaj este NP-complet, trebuie artat c acesta poat fi redus la un alt limbaj despre care se
cunoate c este NP-complet. Acest lucru este afirmat n urmtoarea
Lem 3.2.17
Dac

este un limbaj de aa natur nct

n cazul n care

, atunci

unde

2. Selectm un limbaj cunoscut

este NP-dificil.

. Prin urmare, pentru a arta c un limbaj

NPC, trebuie s urmm paii de mai jos:


1. Artm c

, atunci

31

este n

3. Descriem un algoritm care calculeaz o funcie

care asociaz fiecare instan a lui

cu o instan a lui .
4. Dovedim c funcia

satisface

dac i numai dac

pentru orice

.
5. Dovedim c algoritmul

ruleaz n timp polinomial.

Aceast metod este de obicei folosit pentru a dovedi c o problem n criptografie este
NP-complet, adic suficient de dificil. Exist sute de probleme dovedite a fi NP-complete,
de aceea este adesea uor de a selecta una potrivit pentru o contrui demonstraia. Rmne s
rspundem la ntrebarea: De ce au criptografii att de mult ncredere n dificultate de
rezolvare a problemelor NP-complete?
Teorema 3.2.18 (P = NP?)
n cazul n care exist o problem NP-complet care se afl, de asemenea, n P, atunci P =
NP. n cazul n care nicio problem din NP nu este rezolvabil n timp polinomial, atunci
NPC i P au niciun element comun.
Acest lucru, n esen, spune c, dac o problema NP-complet este rezolvabil n timp
polinomial, atunci orice problem NP-complet este rezolvabil n timp polinomial; i dac o
problem NP-complet nu este rezolvabil n timp polinomial, atunci nicio problem NPcomplet nu este rezolvabil n timp polinomial. Cele dou scenarii posibile sunt:
P=NP=NPC
NP
P

NPC

ntrebarea dac P = NP a fost pus n 1971 de ctre Stephen A. Cook [50] i nu a i-a gsit
un rspuns pn n ziua de azi, n ciuda multor ani de cercetri intense. Nimeni nu a fost
capabil s dovedeasc o limit de timp inferioar superpolinomial pentru vreuna din
problemele NP-complete. Totusi, majoritatea oamenilor de tiin sunt de prere c scenariul
din stnga este adevrat, deoarece, nu a fost gsit nc niciun algoritm de timp polinomial
pentru acest tip de probleme. Avnd n vedere gama larg de probleme NP-complete studiate
pn astzi, "ar fi cu adevrat uimitor dac toate acestea ar putea fi rezolvate n timp
polinomial, spune Cormen [56].
3.2.6 Probleme NP-complete n criptografie
Sute de probleme din diferite domenii (teoria grafurilor, proiectarea reelelor, mulimi i
partiii, secveniere i planificare, programare matematic, algebr, teoria numerelor, logic,
programe de optimizare i altele) s-au dovedit a fi NP-complete (pentru o list detaliat a se
vedea [15]), i multe dintre ele pot fi legate de probleme criptografice, unele chiar n moduri
32

foarte naturale (de exemplu, problema ciclului hamiltonian, a se vedea Capitolul 5). Problema
const n faptul c nu este clar dac problemele NP-complete sunt ntr-adevr dificile, i dac
un algoritm de timp polinomial pentru una singur dintre ele ar putea conduce la rezolvarea
tuturor celorlalte, distrugnd orice schem criptografic care se bazeaz pe acestea.
Un alt aspect important l constituie faptul c o problem NP-complet este doar dificil n
cazul general, nu i n cazuri particulare. NP-completitudinea garanteaz doar c nu exist
niciun algoritm de timp polinomial care s rezolve fiecare instan a unei probleme, nu i
faptul c nu pot exista cazuri speciale care s fie uor de rezolvat. Pentru anumii algoritmi
care rezolv probleme NP-complete, exist un procent mare de cazuri care sunt rezolvate
eficient, ceea ce ar fi dezastruoas pentru aplicaii criptografice. Este nevoie de o analiz
atent pentru a determina acestor cazuri speciale, i este de dorit s se arate cel puin c cele
mai multe cazuri sunt greu de rezolvat (sau cazul medie este dificil de rezolvat), dac nu toate
cazurile posibile.
Unele probleme NP-complete pot fi rezolvate cu ajutorul unor algoritmi de aproximare.
Acetia sunt algoritmi care gsesc soluii aproape optime pentru anumite probleme NPcomplete, n timp polinomial. n practic, aproape-optimalitatea este uneori suficient.
Trebuie s se asigure c pentru problemele NP-complete pe care se bazeaz securitatea
criptografic, nu exist algoritmi de aproximare eficieni. Cu toate acestea, ntotdeauna va
exista posibilitatea ca un astfel de algoritm s fie creat n viitor. Exist, totui, probleme NPcomplete pentru care a fost dovedit c sunt "absurd de greu de aproximat" [64], adic pentru
care nu exist algoritmi eficieni de aproximare. De fapt, s-a dezvoltat chiar o teorie
interesant a problemelor NP-dificile care nu pot fi aproximate. Arora [36] arat c pentru
anumite probleme NP-dificile, realizarea unei aproximri rezonabile nu este mai uoar dect
nsui calculul soluiei optime. Cu alte cuvinte, aproximarea soluiilor acestor probleme este
NP-dificil.
O alt abordare este de a considera doar pe acei algoritmi care rezolv cazurile "tipice" sau
"medii", nu i cazul cel mai defavorabil al unor probleme NP-complete. n practic, ns
identificarea cazurilor "tipice" nu este usoar [36].
Nu n ultimul rnd, trebuie s precizm de ce problemele care pot fi rezolvate n timp
polinomial sunt considerate eficiente. Cineva ar putea argumenta c o problem rezolvabil n
timp polinomial dar care are ordinul de complexitate O(N100) este, cu siguran, nefezabil din
punct de vedere computaional. Acest lucru este adevrat, ns n practic, nu exist probleme
relevante care s aib ordinul de complexitate un polinom cu un grad att de mare.
Problemele rezolvabile n timp polinomial necesit, de obicei, mult mai puin timp. Prin
urmare, exist motive ntemeiate s credem c un algoritm de timp polinomial va fi
ntotdeauna fezabil computaional.
Pe de alt parte, nici nu conteaz dac algoritmii de timp polinomial sunt fezabili sau nu.
Ceea ce este important n criptografie este c orice problem care nu este rezolvabil n timp
polinomial este nu este fezabil computaional. Algoritmii al cror ordin de complexitate nu
poate fi mrginit de o funcie polinomial, ci doar de ctre o funcie exponenial sunt numii
algoritmi de timp exponenial, i sunt considerai ineficieni, deoarece ei nu reprezint altceva
dect o alt modalitate de a realiza o cutare exhaustiv, pe cnd algoritmii de timp
polinomial sunt construii pe baza unor observaii atente asupra structurii matematice a unei
probleme.
33

3.3 Algoritmi de extensie a domeniului


Proiectarea funciilor hash presupune, n mod normal, doi pai. n primul pas este
proiectat o funcie (eficient) de compresie , care genereaz un ir (foarte scurt) de m bii
pe baza unui ir (relativ scurt) de n bii, adic are o intrare de lungime fix i o comprim cu
n-m bii rezultnd o ieire de o lungime fix mai scurt. Apoi, este folosit un algoritm de
extensie pentru a construi o funcie hash

pe baza funciei . Funcia

intrare iruri de lungime arbitrar (cu


Funcia de compresie

primete ca date de

) i genereaz o valoare hash pe

bii.

este, de obicei, construit pentru a ndeplini anumite proprieti de

securitate, iar funcia de extensie a domeniului este conceput pentru a pstra aceste
proprieti. Acest proces n dou etape face mai uoar proiectarea funciilor hash, precum i
probarea proprietilor de securitate.
Un algoritm de extensie a domeniului foarte eficient i natural este cel propus independent
de ctre Merkle [4] i Damgrd [3] la CRYPTO '89. Acesta este utilizat pe scar larg i a
devenit cunoscut sub numele de extensia Merkle-Damgrd.
Algoritmul folosete o funcie de compresie
hash

pentru a construi o funcie

. Mesajul de intrare M este divizat ntr-un bloc


de lungime

de lungime

blocuri

. Apoi blocurile sunt procesate consecutiv. Ieirea (

produs ntr-o iteraie este concatenat cu urmtorul bloc (

bii)

bii) pentru a forma intrarea

pentru urmtoarea iteraie.


Notaie 3.3.1
Dac

sunt iruri de bii, prin notaia

nelegem concatenarea lui

cu .

Definiie 3.3.2 (Extensia Merkle-Damgrd)


Fie

o funcie de compresie i fie

unde

Extensia Merkle-Damgrd definete funcia hash


care calculeaza

dup cum urmeaz:

1. Fie mesajul
2. Fie
3. Apoi

unde
i repet

pentru

Acest proces este ilustrat n urmtoarea diagram:

34

,
.

Adesea primul bloc este iniializat cu


este mprit n blocuri
lungimea corect de

(un ir de zerouri de lungime ) iar mesajul

de lungime egal. Mesajul poate s nu aib ntotdeauna


unde L este un numr natural, pentru a putea fi mprit

n blocuri de lungimi egale. n acest caz, se efectueaz completarea cu bii suplimentari,


adugai la sfritul mesajului.
Completarea nu este un proces trivial; exist multe moduri de a realiza acest lucru, iar
unele dintre ele deschid oportuniti pentru diferite tipuri de atacuri. Merkle i Damgrd au
fost contieni de acest lucru, i amndoi au sugerat ca mesajul s fie completat cu zerouri iar
la sfarit s fie adugat o reprezentare binar a lungimii mesajului original. Astfel exist
posibilitatea ca un bloc suplimentar s fie necesar, n cazul n care ultimul bloc nu con ine
suficient spaiu liber. Dei adugarea zerourilor suplimentare face imposibil determinarea
numrului de zerouri care se aflau iniial la sfritul mesajului (nainte de completarea cu
zerouri), valoarea lungimii mesajului iniial, adugat la sfrit, permite recuperarea
mesajului original. Mai mult, lungimea de reprezentare binar este adesea fixat, de exemplu,
la 64 de bii. De remarcat, ns, c acest lucru limiteaz, cel puin teoretic, lungimea total a
mesajului la o dimensiune maxim de 264 bii.
O alt metod de completare este adugarea unui singur bit 1, apoi zerouri i apoi
lungimea mesajului original, aa cum se procedeaz pentru MD5 (seciunea 2.1) i SHA-1
(seciunea 2.2). Acestea sunt considerate cele mai sigure metode de completare a mesajului, i
din acest motiv sunt i cele mai utilizate pe scar larg, dar exist i alte metode. O discuie
pe aceast tem poate fi gsit n teza de doctorat a lui Preneel [9].
Cea mai important proprietate a extensiei Merkle-Damgrd este c pstreaz rezistena la
coliziuni. Dac o funcie de compresie

este rezistent la coliziuni, atunci i funcia hash

este, de asemenea, rezistent la coliziuni. Aceast proprietate, precum i eficiena funciei de


extensie au fcut-o extrem de popular. Astfel toate funciile hash utilizate n practic astzi
se bazeaz pe aceasta, chiar i cele pentru care rezistena la coliziuni nu poate fi dovedit,
cum ar fi MD5 i SHA-1.
De asemenea, trebuie menionat c exist o funcie de extensie a domeniului chiar mai
eficient, de asemenea propus independent de ctre Merkle i Damgrd n 1989, numit
generare paralel de hash-uri. Aceasta poate fi utilizat n cazul n care sunt disponibile mai
multe procesoare paralele i folosete o funcie de compresie
este mprit n 2k blocuri

unde

35

. Mesajul

(dup procesul de completare), iar

fiecare procesor prelucreaz cte dou blocuri la un moment dat. Procedura devine clar n
urmtoarea diagrama:

S-a dovedit de asemenea c aceast metod de generare a funciilor hash pstreaz


proprietatea de rezisten la coliziuni [4, 37].

3.4 Rezumat
Odat ce sunt dovedite diferite proprieti de securitate ale unei funcii hash, aceasta poate
fi folosit cu mult mai mult ncredere dect oricare dintre funciile hash proiectate special.
Acest capitol a pus bazele conceptelor ce vor fi prezentate n capitolele urmtoare oferind
o scurt trecere n revist a teoriei NP-completitudinii. De asemenea, a fost prezentat
extensia Merkle-Damgrd, utilizat de numeroase funcii hash, att proiectate special ct i
demonstrabil sigure.

Capitolul 4:
Funcii hash universale ntr-o singur direcie
Dup ce a devenit clar c funciile hash rezistente la coliziuni sunt foarte greu de proiectat,
Naor i Yung au propus o nou primitiv criptografic pe care au numit-o funcie hash
36

universal ntr-o singur direcie [1]. Dei acest tip de funcii hash au o securitate mai slab
dect FHRC-urile, ele sunt suficiente n cazul multor aplicaii criptografice importante. Naor
i Yung le-au folosit prima oar pentru a construi o schem de semntur digital pe care au
numit-o schema de semntur digital securizat ntr-o singur direcie , care s-a dovedit
rezistent mpotriva celui mai general tip de atac cunoscut asupra semnturilor digitale. Cei
doi cercettori au construit o FHUSD dintr-o funcie ntr-o singur direcie i au artat c
securitatea acesteia este suficient pentru generarea hash-urilor nainte ca acestea s fie
semnate cu o schem de semntur digital.
Atunci cnd au fost introduse pentru prima dat n 1989, FHUSD-urile au avut mai mult o
importan teoretic, fiind departe de orice aplicaie practic. Dar de atunci, multe FHUSDuri au fost proiectate pentru a fi mai practice, iar sunt acum considerate drept o alternativ
atractiv la FHRC-uri.
Acest capitol ofer o definiie formal a FHUSD-urilor i prezint cel mai natural i mai
promitor model de FHUSD, i anume: funcia hash bazat pe problema sumei elementelor
unei submulimi.

4.1 Funcii hash universale ntr-o singur direcie


FHUSD-urile sunt o familie parametrizat de funcii hash ntr-o singur direc ie, rezistente
la atacurile prin preimagine i prin a doua preimagine. Formal, securitatea este definit
considernd un algoritm adversar care ncearc s gseasc preimagini secundare. Algoritmul
trebuie s primeasc mai nti mesajul de intrare, i cheia care selecteaz funcia hash din
cadrul familiei. Apoi, ncearc s produc a doua preimagine pentru o valoare hash aleas.
Definiie 4.1.1 (UOWHF)
Fie

numere naturale nenule cu

. O familie de funcii hash universale ntr-o

singur direcie de parametri i este o mulime finit


parametrizat de o cheie
atac

(unde

care ruleaz n timpul

de funcii

este spaiul cheilor), astfel nct orice algoritm de


are o probabilitate de succes de cel mult

urmtorul joc:
-

ncepe: Se execut

(fr date de intrare) care returneaz o stare i

devine dat de intrare pentru funcia hash;


- Eantionarea cheilor: Este aleas la ntmplare o cheie

care este transmis apoi

lui
-

colizioneaz:

ruleaz cu intrrile

genereaz a doua intrare pentru funcia hash,

37

i starea generat la primul pas, i


.

A ctig jocul dac gsete o coliziune valid pentru


avem

, cu alte cuvinte, dac pentru

Dei aceasta este definiia unei familii de FHUSD-uri, ea este adesea numit simplu
FHUSD. Formal, informaia legat de stare reprezint ieirea lui
pentru

, care devine intrare

. Proprietatea esenial de rezisten la a doua preimagine presupune ca prima

intrare s fie fixat iar adversarul trebuie s gseasc o coliziune pentru aceast intrare.
Deoarece, n acest model, algoritmului adversar i este permis s aleag prima intrare, nu se
poate cunoate funcia hash n momentul n care ncepe algoritmul. Numai dup ce algoritmul
a fost iniializat cu prima intrare se poate cunoate care funcie hash este folosit. Din acest
motiv, proprietatea de rezisten la a doua preimagine nu poate fi dect definit pentru o
familie de funcii hash. Este important ca fiecare funcie a familiei s fie selectat cu o
probabilitate egal.
Deci, n esen, acesta este pur i simplu un alt mod de a asigura faptul c atacatorul nu
poate alege prima intrare pentru o anumit funcie hash. Acest lucru este oarecum diferit fa
de conceptul utilizat pentru funciile hash ntr-o singur direcie, n cazul crora funcia hash
este fixat iar prima intrare este transmis algoritmului, care apoi ncearc s gseasc o
coliziune pentru intrarea respectiv.
Trebuie observat c aa-numitele chei nu sunt chei secrete. Ele nu se refer la o informaie
secret. Rolul acestor chei este de a parametriza familia de funcii i sunt fcute publice. De
asemenea, este de reinut faptul c membrii acestei familii nu sunt funcii hash obinuite,
deoarece acestea primesc o intrare de lungime fix, i nu una de lungime arbitrar. Aici
intervine extensia Merkle-Damgrd, definit n seciunea 3.3. Aceasta este o metod foarte
utilizat: mai nti se construiete o funcie de comprimare care s transforme un ir de
ntr-unul mai scurt, de

bii

bii, iar apoi prin intermediul unei extensii se construiete o funcie

hash care comprim o intrare de lungime arbitrar ntr-un hash de

bii.

Avantajul acestui sistem este c securitatea poate fi dovedit n dou etape: n cazul n care
se poate dovedi c o extensie a domeniului pstreaz anumite proprieti ale funciei de
compresie, atunci mai rmne doar de artat c funcia de compresie are proprietile dorite.
Extensia cea mai simpl i mai natural este bine-cunoscuta extensie Merkle-Damgrd.
Merkle i Damgrd au dovedit independent unul de cellalt [4, 37] c aceast funcie
pstreaz proprietatea de rezisten la coliziuni. Cu alte cuvinte, dac o funcie de compresie
este rezistent la coliziuni, atunci funcia hash obinut prin aplicarea extensiei MerkleDamgrd este, de asemenea, rezistent la coliziuni. Din pcate, a fost demonstrat de ctre
Bellare i Rogaway [54] c extensia Merkle-Damgrd nu pstreaz i rezistena la a doua
preimagine. Prin urmare, ea nu poate fi utilizat, n general, pentru extensia unei FHUSD.
Hong, Preneel i Lee [32] au artat c exist o modalitate de a construi funcii hash cu
securitatea FHUSD-urilor cu ajutorul extensiei Merkle-Damgrd. Ei au definit o securitate
mai puternic pentru funcia de compresie pe care au denumit-o securitate FHUSD de ordin
38

superior i au artat c aceste FHUSD-uri de ordin superior pot fi folosite pentru a construi
funcii hash cu securitate FHUSD pe baza extensiei Merkle-Damgrd.
nainte de a da definiia FHUSD-urilor de ordin superior, trebuie s mai aruncm o privire
asupra FHUSD-urilor obinuite. n loc de a selecta cheia

dup ce algoritmul ncepe s

prelucreze prima intrare, se poate selecta mai nti cheia

, fr a fi dezvluit lui , dup

care se ncepe primul pas al algoritmului, pentru ca abia apoi cheia selectat s fie transmis
lui

. Deoarece selecia aleatoare a cheii

este independent de comportamentul lui

ordinea acestor aciuni nu determin modificarea probabilitii de succes a lui

, atta timp

ct cheia nu este dezvluit adversarului dect dup ce s-a nceput prelucrarea unei intrri.
Prin urmare, jocul din Definiia 4.11 este, n esen, echivalent cu urmtorul joc:
- Eantionarea cheii: este aleas la ntmplare o cheie
-

ncepe:

(fr a fi dezvluit lui ).

ruleaz (fara date de intrare) i furnizeaz un ir binar

ce

reprezint o intrare pentru funcia hash, i o stare.


- Revelarea cheii: cheia
-

este dezvluit lui .

colizioneaz: ruleaz

cu datele de intrare:

furnizeaz a doua intrare

i starea generat de

pentru funcia hash.

Atunci cnd se analizeaz securitatea FHUSD-urilor prin intermediul acestui joc, se poate
face o generalizare simpl: adversarului

i este permis s realizeze

interogri adaptive

unui oracol pentru calculul valorii funciei hash selectate nainte de a ncepe rularea primului
pas. Acest lucru nseamn c, fr a cunoate care funcie
furniza

intrri

este utilizat, adversarul poate

oracolului, pentru care va primi valorile

unde

. Fiecare

interogare poate depinde de rezultatele din interogrile anterioare (la acest aspect se refer
termenul "adaptiv").

poate folosi ulterior aceste informaii suplimentare obinute de la

interogri pentru a alege prima intrare. O funcie care este sigur chiar i n faa acestui atac
mai puternic se numete FHUSD de ordinul , i se noteaz FHUSD( ).
Definiie 4.1.2 (FHUSD(r))
Fie

numere naturale nenule cu

. O familie de funcii hash universale ntr-o

singur direcie cu parametrii t i de ordinul r este o mulime finit

39

de funcii

parametrizat de o cheie
atac

(unde

este spaiul cheilor), astfel nct orice algoritm de

care ruleaz n timpul t are o probabilitate de succes de cel mult n

urmtorul joc:
- Eantionarea cheii: O cheie

este aleas la ntmplare (fr a fi dezvluit lui ).

- Interogarea oracolului: A1 ruleaz (fr date de intrare) i face r interogri adaptive


unui oracol pentru calculul valorii lui
unde
-

ncepe:

pentru

furnizeaz intrarea pentru funcia hash, i o stare

- Revelarea cheii: cheia


-

, primind rspunsurile

colizioneaz:

este dezvluit lui .


primete datele de intrare:

furnizeaz a doua intrare

, i

pentru funcia hash.

ctig jocul dac gsete o coliziune valid pentru


avem

, s1 i starea generat de

, cu alte cuvinte, dac pentru

Evident FHUSD(0) este o FHUSD obinuit. De asemenea, FHUSD(r) sunt automat i


FHUSD(t) pentru orice

. Reciproca nu este adevrat. Este interesant de observat c

Hong, Preneel i Lee [32] au reuit s demonstreze c clasele de FHUSD-uri de acelai ordin
formeaz un lan ntre clasele FHRC i FHUSD.
Folosind conceptul de FHUSD de ordinul , Hong, Preneel i Lee au demonstrat c, dac
ordinul de baz al FHUSD-urilor este , extensia Merkle-Damgrd de ordinul
asemenea, FHUSD. Aici

este, de

este adesea numit factor de extensie. Este de reinut faptul

c exist algoritmi de extensie care conserv proprietile de securitate ale FHUSD-urilor


chiar i fr proprietatea de ordin superior. Bellare i Rogaway [54] au propus dou tipuri de
construcii, unul cu o structur liniar, mai trziu mbuntit de ctre Shoup [ 42] avnd
denumirea extensia Shoup cu masc XOR, i cellalt cu o structur arborescent, care a
generalizat rezultatele obinute de Naor i Yung [ 1] i care a fost mbuntit n continuare de
ctre Sarkar [54, 55] i Lee, Chang, Lee, Sung i Nandi [2]. Cu toate acestea, extensiile
menionate au o proprietate nedorit: lungimea cheii crete odat cu lungimea mesajului. Prin
urmare, este de preferat s se utilizeze extensia Merkle-Damgrd acolo unde este posibil,
deoarece aceasta pstreaz dimensiunea cheii constant.
Astfel, folosind conceptele prezentate mai sus, poate fi formulat o definiie mai precis a
securitii. Pentru un algoritm adversar

cu probabilitatea de succes la un anumit joc


40

desfurat ntr-un interval de timp , spunem c securitatea este ridicat dac

este mare.

Cu alte cuvinte, securitatea este ridicat dac A are o probabilitate mic de succes, chiar i
pentru o perioad lung de timp, i este sczut n caz contrar. Cei mai mul i autori scaleaz
raportul dintre timpul de execuie i probabilitatea de succes prin logaritmare n baza 2.
Definiie 4.1.3 (securitate)
Securitate unei FHUSD este definit ca fiind valoarea expresiei
timpul de execuie i

, unde

este

este probabilitatea de succes a unui algoritm atacator n jocul de la

definiia 4.1.1.
Securitatea unei FHUSD este definit ca fiind valoarea expresiei
timpul de execuie i

, unde

este

este probabilitatea de succes a unui algoritm atacator n jocul de la

definiia 4.1.2.

4.2 Funcie hash bazat pe problema sumei elementelor unei submulimi


S-a demonstrat recent c poate fi obinut un nivel de securitate FHUSD de ordin superior
cu ajutorul unei funcii hash bazate pe problema sumei elementelor unei submulimi. Aceast
problem bine-cunoscut, NP-complet, are urmtorul enun:
Fie
ntreg

o mulime de n numere ntregi, cu reprezentrile binare pe


. Se cere s se afle o submulime a lui

Adunarea se efectueaz modulo , unde

bii, i un numr

pentru care suma elementelor s fie

este un ntreg pe

bii.

Definiie 4.2.1 (problema sumei elementelor unei submulimi)


Fie

cu

. Pentru un vector de numere ntregi

i un numr ntreg

, ambele alese uniform aleator, gsii o

submulime

Condiia
urmare, adunarea modulo

n astfel nct

asigur faptul c

este reprezentat exact pe

ntotdeauna va avea ca rezultat un numr ntreg pe

bii i, prin
bii.

Aceast problem este un caz particular al problemei rucsacului (engl. knapsack


problem) dovedit a fi NP-complet de ctre Richard Karp n 1972 [47]. Karp a mai dovedit
NP-completitudinea a nc 21 de probleme din combinatoric i teoria grafurilor, recunoscute
pentru nivelul ridicat de dificultate al acestora.
41

Primii care au sugerat folosirea problemei sumei submulimii n criptografie au fost


Merkle i Hellman n 1978 [41]. De atunci au fost inventate numeroase scheme criptografice
cu cheie public bazate pe aceasta. Deoarece folosesc doar adunarea ca operaie de baz,
aceste scheme sunt mult mai eficiente dect cele bazate pe probleme teoretice avansate, cum
ar fi descompunerea n factori sau problema logaritmilor discrei, care implic folosirea
operaiei de multiplicare sau chiar exponeniere. Niciunul dintre aceste sisteme mai
complicate nu s-a dovedit a fi la fel de sigur ca acelea bazate pe problema sumei submul imii
(adic nu s-a putut dovedi c spargerea lor este la fel de dificil ca rezolvarea problemei
sumei submulimii). Cele mai multe dintre ele au fost chiar sparte.
Impagliazzo i Naor [61] au fost primii care au folosit problema sumei submulimii pentru
a construi o funcie hash (i un generator de numere pseudo-aleatoare). Funcia hash
construit de acetia se definete astfel:
Definiie 4.2.2 (
Fie

)
cu

. Fie

familia de funcii hash

definite astfel
,
unde:
-

este cheia (iar

este spaiul cheilor)

este mesajul, sau intrarea, pentru funcia hash

Este evident faptul c inversarea oricrei funcii

este la fel de dificil ca

rezolvarea problemei sumei submulimii. Cheia corespunde mulimii de numere, mesajul


corespunde submulimii, iar valoarea hash corespunde sumei. Pentru o anumit cheie i
valoare hash, este dificil de gsit un mesaj care s aib aceeai valoare hash ca cea dat.
Astfel funcia hash devine n mod natural ireversibil. Mai mult dect att, Impagliazzo i
Naor [28] au demonstrat c

este FHUSD. Rezultatul obinut de acetia poate fi formulat

astfel:
Teorema 4.2.3 (Impagliazzo-Naor)
Dac problema sumei submulimii

este

-dificil, atunci

o familie de funcii hash universale ntr-o singur direcie, de securitate


i

42

este
unde

Steinfeld, Pieprzyk i Wang [24] au ntrit i mai mult acest rezultat artnd c
de fapt, FHUSD de ordinul , unde

este,

. Mai precis, ei au mrginit superior gradul

de deteriorare a securitii funciilor familiei

odat cu creterea valorii lui .

Teorema 4.2.4 (Steinfeld-Pieprzyk-Wang)


Fie

cu

, astfel nct

este prim,

Dac problema sumei submulimii

este

, i
-dificil, atunci

familie de funcii hash universale ntr-o singur direcie de ordinul


unde

este o

i de securitate

, iar

reprezint timpul

necesar pentru a efectua o nmulire modulo .


Cu alte cuvinte, securitatea funciei, care este o FHUSD de ordinul , se deterioreaz cu
cel mult

bii fa de o FHUSD de ordinul 0. Prin urmare, pe baza rezultatului ob inut de

Hong, Preneel i Lee [32], putem concluziona c extensia Merkle-Damgrd, cu factor de


extensie

, poate fi aplicat funciei de compresie, pierzndu-se cel mult

bii de

securitate.
Funciile din

genereaz amprente pe

bii pentru mesaje pe

bii. Prin urmare

poate fi folosi ca o familie de funcii de compresie pe baza creia se poate


construi o familie de funcii hash
mesaje pe

, care s genereze amprente pe

bii pentru

bii, unde poate fi mult mai mare dect . Extensia Merkle-Damgrd poate fi

aplicat dup cum urmeaz: primul mesaj trebuie s fie completat cu zerouri pn la o
lungime

bii, unde

mesajul poate fi mprit n

este un numr ntreg pozitiv. Aceasta nseamn c

blocuri, primul pe

n continuare, presupunem c
Definiie 4.2.5 (
Fie

bii iar celelalte pe

bii.

i definim familia de funcii

)
unde

un mesaj oarecare i

cu

iar

o cheie aleas uniform aleatoar pentru

43

. Fie
.

Familia de funcii hash Merkle-Damgrd

este familia de funcii

care realizeaz

urmtoarele operaii:
1.mparte

ntr-un bloc pe

bii

blocuri pe

bii

.
2. Pentru

, calculeaz

3. Returneaz

Deoarece Steinfeld, Pieprzyk i Wang [24] au demonstrat c

este o FHUSD

de ordinul , pentru

, rezultatul [32] obinut de Hong, Preneel i Lee conduce la

concluzia c familia

este FHUSD pentru

. ns orict de

promitoare par a fi aceste rezultate, exist nc numeroase probleme care nu permit ca acest
tip de funcii hash s fie puse n practic. Una dintre probleme a fost deja menionat, i
anume constrngerea n ceea ce privete lungimea mesajului. Funciile hash trebuie s fie
capabile de a genera amprente pentru mesaje de lungime arbitrar, ns
restricioneaz lungimea mesajului la cel mult

blocuri de cte

bii. Deoarece

securitatea unei FHUSD de ordinul r scade cu aproximativ r bii (fa de securitatea FHUSD
de ordinul 0 corespunztoare), securitatea pentru

scade cu un bit la fiecare rund i

pentru fiecare bloc al mesajului. Acest fapt duce la un compromis ntre lungimea mesajului i
securitate. De asemenea, din moment ce

, mesajele mai lungi vor produce o

valoare hash mai mare.


O alt problem este mrimea cheii. Funcia de compresie dat de
ca pentru fiecare dintre cei
cheie. Prin urmare, cheia

presupune

bii ai mesajului s fie nevoie de un numr pe m bii, aflat n


const din n numere pe m bii i deci este de

bii lungime.
n plus, Steinfeld, Pieprzyk i Wang [24] arat c este necesar ca

pentru a

atinge un nivel de securitate rezonabil (mai concret, pentru a face probabilitatea de succes a
unui atac mai mic dect
peste

). Deoarece

, rezult c mrimea cheii trebuie s fie de

bii.

Nu n ultimul rnd, rmne valabil problema general cu privire la demonstrarea


securitii unei funcii hash prin raportarea la o problem NP-complet. O problem NP44

complet este dificil de rezolvat n cazul cel mai defavorabil, dar nu neaprat n toate cazurile
posibile. n multe cazuri particulare, o problem NP-complet poate fi chiar uor de rezolvat;
NP-completitudinea pur i simplu afirm c nu exist niciun algoritm eficient, care s rezolve
toate cazurile posibile. Problema sumei elementelor unei submulimi poate fi uor de
rezolvat, de exemplu, n cazul n care suma dorit se ntmpl s fie zero sau chiar egal cu
unul din elementele submulimii. De aceea, nainte de a utiliza o funcie hash bazat pe
aceast problem, ar trebui s fim cel puin siguri dac problema este dificil n cazul mediu
(i nu doar n cazul cel mai defavorabil). Exist algoritmi foarte buni de aproximare pentru
problema sumei elementelor unei submulimi. ns pentru a gsi o preimagine valid pentru o
anumit valoare hash, este nevoie de a gsi o submulime ale crei elemente nsumate s aib
exact valoarea dorit i nu doar una aproximativ.
Dei este nevoie nc de foarte mult munc pentru a face posibil utilizarea n practic a
FHUSD-urilor bazate pe problema sumei elementelor unei submulimi, abordarea pare una
promitoare. Operaiile necesare sunt extrem de eficient de efecutat, i exist dovezi concrete
cu privire la nivelul de securitate pe care l pot atinge aceste funcii hash.

Capitolul 5:
Crearea unei funcii hash rezistente la preimagine
Dup ce am investigat tehnicile folosite pentru a proiecta funcii hash i pentru a dovedi
diferitele proprieti de securitate ale acestora, ne propunem s prezentm complet paii
necesari pentru a crea o funcie hash.
Avnd n vedere modul natural n care problema sumei submulimilor a putut fi folosit
pentru crearea unei funcii hash, ne putem pune ntrebarea dac exist i alte probleme NPcomplete care ar putea servi n acelai scop. n lista foarte elaborat de cteva sute de
probleme NP-complete din [15], problemele din teoria grafurilor se dovedesc a fi printre cele
mai promitoare. n continuare considerm problema gsirii unui ciclu hamiltonian pentru a
proiecta o funcie hash, aa cum este descris n []. Din motive evidente, vom numi aceast
funcie HH.
Acest capitol explic construcia funciei HH i examineaz proprietile acesteia. Apoi
sunt prezentate posibilele aplicaii, precum i o modalitate de implementare a acestei funcii.
45

5.1 Teoria Grafurilor


nainte de a prezenta construcia funciei HH, este necesar o scurt prezentare a noiunilor
de teoria grafurilor care stau la baza acesteia.
Definiie 5.1.1 (graf)
Un graf

este o pereche ordonat

, unde

este o mulime finit de noduri din


este o mulime finit de perechi neordonate

, numite muchii,

Menionm c n literatura de specialitate, graful mai poart diverse denumiri:


finit ( i

sunt finite),

neordonat (muchiile sunt perechi neordonate de noduri),


simplu (nu are bucle, adic muchiile sunt date prin perechi de noduri distincte)
etichetat (nodurile sunt etichetate

Pentru scopul acestei lucrri, toate grafurile considerate vor fi de acest fel i vor fi numite
simplu grafuri. Grafurile sunt adesea reprezentate prin desene, n care nodurile sunt nite
puncte iar muchiile sunt linii care unesc dou noduri.

Un graf poate fi reprezentat, de asemenea, prin matricea de adiacen. Pentru un graf


matricea de adiacen este o matrice
n care

, dac graful nu conine muchia {i, j} i

graful de mai sus are urmtoarea matrice de adiacen:

46

de dimensiune
dac

. De exemplu,

Observm c pentru un graf neorientat, matricea de adiacen este ntotdeauna simetric,


adic

dac i numai dac

. Elementele de pe diagonala principal sunt

ntotdeauna zero, deoarece nu sunt permise bucle.


Definiie 5.1.2 (grad)
Fie

un graf. Un nod

, are gradul

dac este incident cu

muchii. De

exemplu, fiecare nod n graful de mai sus are gradul 4. n aceast situaie se spune c graful
este 4-regulat.
Definiie 5.1.3 (graf complet)
Un graf complet este un graf care conine toate muchiile posibile. De exemplu, n figura
urmtoare este prezentat un graf complet cu ase noduri:

Definiie 5.1.4 (drum, ciclu)


Un drum de lungime n graficul
, unde

este o secven
oricare ar fi

toate celelalte noduri sunt distincte, atunci

de noduri distincte
. Dac

, i

se numete ciclu.

Un drum de lungime 4 n graf de mai sus ar fi 12346. Un exemplu de ciclu este 2462.
5.1.1 Problema ciclului hamiltonian
Definiie 5.1.5 (drum hamiltonian)
Un drum care viziteaz fiecare nod ntr-un graf o singur dat este un drum hamiltonian.
Definiie 5.1.6 (ciclu Hamiltonian)
Un ciclu care viziteaz fiecare nod ntr-un graf o singur dat este un ciclu hamiltonian.
Dou exemple evidente de cicluri hamiltoniene n graful de mai sus sunt:

47

Ciclurile hamiltoniene poart numele unui matematician, fizician i astronom irlandez, Sir
William Rowan Hamilton, cel care a inventat, n 1857 [20] jocul icosian (cunoscut i sub
numele de jocul lui Hamilton, sau puzzle-ul lui Hamilton), care implic gsirea unui ciclu
hamiltonian de-a lungul muchiilor unui dodecaedru. Hamilton a intuit c gsirea unui ciclu
hamiltonian ntr-un graf nu este o sarcin trivial. De fapt, aceast problem este NPcomplet.
Definiie 5.1.7 (Problema ciclului hamiltonian)
Pentru un graf

cu

noduri se cere s se determine un ciclu hamiltonian.

Aceast problem se afl pe lista celor 21 de probleme demonstrate a fi NP-complete de


ctre Richard Karp, n 1972 [47]. De asemenea a mai fost demonstrat c problema ciclului
hamiltonian rmne NP-complet
dac

este planar, cubic, 3-conectat, i nu are nicio fa cu mai puin de 5 muchii [48]

dac

este bipartit [49]

dac

este ptratul unui graf [58]

n schimb, problema este rezolvabil n timp polinomial, n cazul n care


nod de grad mai mare dect 2, sau dac

nu are niciun

este un graf liniar [3].

5.1.2 Grafuri aleatoare


Este adesea interesant de aflat cum se comport un algoritm (sau ipotez) pentru un set
"oarecare" de date de intrare. n acest scop este folositoare generarea unor grafuri aleatoare.
Un graf aleator poate fi creat pornind de la o mulime de noduri

, prin

adugarea la ntmplare de muchii ntre acestea. Diferite modele pentru gemerarea grafurilor
aleatoare pot avea diferite distribuii de probabiliti. Cel mai natural, i n cazul nostru i cel
mai util, este modelul binomial propus de Erds [28].
Acesta se noteaz

i presupune adugarea fiecrei muchii posibile n mod

independent, cu o probabilitate . Astfel, probabilitatea de generare a unui graf G este


,
48

unde

reprezint numrul de muchii ale lui . De observat c pentru

are aceeai probabilitate


uniform de probabilitate al grafurilor cu

. Aadar

, fiecare graf

reprezint spaiul

noduri.

5.1.3 Teoria grafurilor i generarea valorilor hash


Nu exist foarte multe rezultate cu privire la aplicaiile teoriei grafurilor n domeniul
funciilor hash. Dei au existat cteva propuneri de a utiliza anumite tipuri speciale de grafuri
cum ar fi grafurile Cayley sau grafurile Ramanujan n [49, 9, 68], nici una nu a fost utilizat
n practic. Securitatea n aceste cazuri se bazeaz pe proprietile speciale ale grafurilor n
discuie.
Charles, Goren i Lauter [38] au realizat un design interesant, n care fiecare nod dintr-un
graf rar, k-regulat, are o etichet, iar mesajul este utilizat pentru a determina un drum n graf.
Ieirea o constituie eticheta ultimului nod vizitat, iar rezistena la coliziune se bazeaz pe
dificultatea de a determina drumuri distincte ntre dou noduri distincte ale grafului, n cazul
n care raportul dintre muchii i noduri este mic. n schimb, algoritmul

are o securitate

mult mai natural, bazat pe dificultatea de a gsi un ciclu hamiltonian ntr-un graf dat.

5.2 Algoritmul
Acum este momentul s prezentm detaliile tehnice ale algoritmului

. Implementarea

acestui design nou constituie principala contribuie a acestei lucrri.


5.2.1 Ideile principale
Ca orice funcie hash,

primete un mesaj de intrare (ir de bii) de o lungime arbitrar

i produce o valoare hash de lungime fix. Ieirea este un graf reprezentat prin matricea de
adiacen, care este rearanjat pentru a forma un ir de bii. Dimensiunea datelor de ieire
depinde de dimensiunea grafului, mai exact, de numrul de noduri ale grafului, care trebuie
s fie fixat n avans.
Ideea de baz este urmtoarea: mai nti este generat n mod unic un ciclu hamiltonian pe
baza mesajului de intrare. Apoi se construiete un graf care s conin acest ciclu. Pentru a
verifica dac un hash corespunde unui anumit mesaj, se genereaz din nou ciclul hamiltonian
corespunztor i se verific dac acest ciclu este coninut n graful dat de valoarea hash.
Invers, pentru a gsi o preimagine pentru o anumit valoare hash trebuie gsit un ciclu
hamiltonian al grafului dat de valoarea hash, adic trebuie gsit o soluie pentru problema
determinrii ciclului hamiltonian, care este o problem NP-complet renumit.
Algoritmului este cel mai bine descris prin urmtoarea diagram:

49

HH

Reducere

Ciclu

Deoarece un ciclu hamiltonian cu


ntreg graf cu

Graf

HH(M)

noduri poate fi reprezentat pe mai puini bii dect un

noduri, interpretarea unui mesaj ca fiind un ciclu hamiltonian, pentru ca apoi

acesta s fie transformat ntr-un graf, ar produce date de ieire de o dimensiune mult mai
mare dect datele de intrare, anulnd caracteristica principal a unei funcii hash, i anume de
a crea amprente ale mesajului. Prin urmare, trebuie s aplicm mai nti o funcie de reducere
care micoreaz mesajele M pn la o anumit dimensiune fixat.
Apoi urmeaz determinarea propriu-zis a ciclului hamiltonian dup care se genereaz
aleator un graf care s conin acest ciclu. Matricea de adiacen a grafului obinut reprezint
valoarea hash generat de funcia

5.2.2 Notaii
Inainte de a descrie pe larg cei trei pai ai algoritmului , trebuie s definim o serie de
mrimi i s le atribuim anumite denumiri:
-

este mesajul de intrare pentru funcia

i reprezint, de asemenea, dat de

intrare pentru funcia de reducere.


-

este graful prelucrat de funcia

nu apare n algoritmul propriu-zis

(numai matricea sa de adiacen).


-

este numrul de noduri ale grafului


cuvinte,

. Cu alte

. Nodurile sunt etichetate

este numrul de muchii posibile n H.


este numrul de cicluri hamiltoniene posibile ntr-un graf complet
noduri. Deoarece
permutare a numerelor

cu

, fiecare ciclu hamiltonian poate fi reprezentat ca o


. Exist

astfel de permutri. Dintre acestea ns,

permutri reprezint acelai ciclu (din moment ce nu conteaz care nod este ales ca nod
de nceput i nici sensul de parcurgere a drumului). Aadar

50

reprezint mulimea tuturor ciclurilor Hamiltoniene ale grafului


complet

i are elemente.

este dimensiunea datelor de ieire ale funciei de reducere.

este matricea de adiacen a grafului H.

Deoarece

este un graf neorientat ( este simetric) i nu are bucle (diagonala principal

conine numai zerouri),

conine informaii redundante, care ar trebui eliminate. Mai exact,

poate fi unic reprezentat prin triunghiul de sub diagonala principal a lui A, notat
.
confuzie,

reprezint rezultatul funciei


i

. Atunci cnd nu exist posibilitate de

vor fi utilizate interschimbabil pentru a ne referi la valoarea hash

generat de algoritm.
conine o singur intrare pentru fiecare muchie posibil n H, aadar
rearanjat pentru a forma un ir de bii de lungime
rndurilor sale). Prin urmare, am putea spune c

poate fi

(de exemplu, prin concatenarea


i s utilizm aceast notaie

pentru a ne referi att la triunghiul de sub diagonala principal ct i la irul de bii. n


general, ns, este mai uor de lucrat cu reprezentarea matriceal dect cu irul de bii.
5.2.3 Funcia de reducere
Funcia de reducere
constituie prima parte a algoritmului i are rolul de a transforma un mesaj M de lungime
arbitrar ntr-un ir de bii de lungime fix.
Mai trziu (a se vedea seciunea 5.3.2), se va arta c rezistena la preimagine a funciei
HH nu depinde de proprietile funciei de reducere. Dei aceste proprieti nu sunt utilizate
n demonstrarea securitii algoritmului, este ns o idee bun s eliminm nc de la nceput
posibilele puncte slabe. n plus, se poate urmri i obinerea unor proprieti suplimentare
(cum ar fi efectul de avalan), pentru care nu este nevoie de dovezi concrete.
Spre exemplu, o funcie de reducere ar putea consta n simpla trunchiere a mesajului
(considerarea primilor

bii ai acestuia). ns acest lucru ar nsemna c tot ce urmeaz dup

al -lea bit, nu are nicio influen asupra valorii hash, deci nu realizeaz un efect de avalan
satisfctor.

51

Cea mai buna alegere este de a folosi funcii hash criptografice proiectate special, cum ar
fi MD5, SHA-1, SHA-256 sau chiar SHA-512, n funcie de dimensiunea dorit pentru datele
de ieire.
De asemenea trebuie s inem cont de faptul c funcia de reducere trebuie s fie u or de
calculat. Funciile hash, n general, trebuie s fie eficiente, iar eficiena algoritmului
depinde, n mare msur de eficiena funciei de reducere. Acesta este un motiv n plus pentru
a folosi o funcie hash criptografic proiectat special ca funcie de reducere.
5.2.4 Funcia de generare a unui ciclu
Funcia de generare a unui ciclu
reprezint partea trivial a algoritmului, ns i cea mai greu de explicat, fiindc este
nevoie de mare atenie la conversia irurilor de -bii la cicluri hamiltoniene cu

noduri.

Motivul este din nou nevoia de a elimina posibilele puncte slabe. n acest caz, vom ncerca s
eliminm coliziunile banale, prin maparea injectiv a irurilor pe

bii la mulimea ciclurilor

hamiltoniene. Cu alte cuvinte, fiecare intrare este mapat la un ciclu diferit, ceea ce face
imposibil crearea de coliziuni.
Mai nti s definim o notaie unic pentru fiecare ciclu hamiltonian. Dac tuplul
reprezint o permutare a elementelor mulimii
de asemenea un ciclu hamiltonian,

atunci acesta descrie

, n graful cu nodurile

descriere nu este unic. De exemplu, tuplurile

. ns aceast
i

descriu acelai ciclu. Astfel de cazuri pot fi excluse prin fixarea primului vrf, adic, prin
reprezentarea

unui

ciclu

sub

forma

unui

tuplu

unde

. Chiar i cu primul nod fixat, tot mai exist cte dou descrieri
diferite pentru fiecare ciclu n parte. De exemplu,

descrie acelai ciclu ca i

. Putem ns elimina acest inconvenient dac impunem ca

Aceast condiie limiteaz "direcia" de parcurgere a ciclului: se pornete de la vrful 1, i se


viziteaz ntotdeauna nodul adiacent cu un numr mai mare.
Astfel, fiecare ciclu Hamiltonian ntr-un graf cu
printr-un tuplu

unde:

52

noduri poate fi descris n mod unic


n timp ce pentru

este permis orice valoare de la 2 la ,

valori mai mici dect

poate lua doar

. Aceasta este descrierea pe care o vom folosi n restul lucrrii.

Acum putem defini mulimea ciclurilor hamiltoniene ntr-un graf complet cu

noduri:
.

n continuare putem defini o relaie de ordine pe mulimea de mai sus. Mai exact,
elementele sunt puse n ordine lexicografic. Acest lucru nseamn c elementele sunt sortate
mai nti dup elementul
apoi sortate dup

este fixat). Toate tuplurile cu aceeai valoare pentru

sunt

, etc. Sortarea se face n ordine cresctoare. Acum ne putem ntoarce la

problema de la care am plecat, i anume: definirea unei funcii injective


care asociaz iruri de n bii lungime la elementele
mulimii

. Fiecare astfel de ir poate fi interpretat ca fiind reprezentarea

binar a unui numr ntre


Fie

numrul zecimal reprezentat de

fcut, este s asociem lui

al

, argumentul funciei

. Tot ce rmne de

-lea element al mulimii

(n care

elementele sunt numrate ncepnd de la zero).


Amintim faptul c

fost definit ca fiind cardinalul mulimii

. Prin urmare

, adic

asociat cu o submulime a mulimii

, iar

, deci mulimea

poate fi

, mai exact cu primele

elemente

ale acesteia.
n continuare vom descrie algoritmul care realizeaz aceast mapare. Acesta utilizeaz:
un tabel de cutare pentru perechi de elemente
rezonabil de
calculator modern. Elementele

. Tabelul are o dimensiune

elemente, ceea ce nu constituie o problem pentru niciun


ale tabelul pot fi calculate astfel:

53

pentru
pentru j

Elementele
valoarea lui

sunt folosite pentru a determina valoarea lui

iar

pentru a determina

o list indexat

cu elemente nefolosite. Aceasta este iniializat cu valorile


din care lipsesc elementele

, deoarece acestea au fost

deja utilizate. Pe msur ce sunt folosite, elementele sunt eliminate din list.
Algoritmul funcioneaz astfel:

pentru

(pas -1)

5.2.5 Funcia de generare a grafului


Funcia
primete ca date de intrare ciclul hamiltonian
al algoritmului i construiete un graf

calculat n pasul anterior

pe baza acestuia. Algoritmul mai nti iniializeaz

matricea de adiacen . Apoi, adaug muchiile ciclului , dup care ncepe s adauge i alte
muchii, n mod aleator.
54

Din moment ce fiecare graf trebuie s poat fi generat cu aceeai probabilitate, este ales
aleator un numr total de muchii , pe baza distribuiei binomiale:

Este, de asemenea, important s excludem cazurile triviale. Reamintim faptul c


securitatea funciei hash se va baza pe faptul c este dificil de gsit un ciclu hamiltonian ntrun graf.
ns, n cazul n care graful are prea puine sau prea multe muchii, devine destul de uor de
gsit un astfel de ciclu. De exemplu, dac

este ales s fie mai mic dect , nu mai este

nevoie de muchii suplimentare, ciclul hamiltonian ar fi evident, iar sarcina de a gsi o


preimagine ar deveni una trivial. Prin urmare,

este ales din mulimea

unde

. Asftel sunt tiate capetele distribuiei binomiale, eliminnd cazurile banale.

Acestea fiind spuse, graful poate fi construit astfel:


1. Iniializeaz

2. Adaug la

muchiile ciclului

3. Alege numrul de muchii aleatoare.


Alege

n mod aleator, potrivit distribuiei binomiale.

4. Genereaz uniform aleator muchii, adugate apoi la , pn cnd

55

are

muchii.

ct timp
genereaz aleator
dac

contor = contor + 1

5. Returneaz
Observm c matricea

.
este iniializat cu valoarea unu pe diagonala principal deoarece

la pasul 4 se stabilete dac trebuie adugat o anumit muchie verificnd valoarea


elementului corespunztor din .
Deoarece nu dorim s adugm o muchie n cazul n care

, elementele de pe

diagonala principal nu pot fi zero. Acest lucru oricum nu are importan, deoarece
elementele de pe diagonala principal nu fac parte din rezultatul final.
Observm, de asemenea, c lucrm cu ntreaga matrice i nu doar cu elementele de sub
diagonala principal pentru a simplifica pseudocodul. Este mai uor s inspectm direct
valoarea elementului

pentru a verifica dac exist o muchie ntre

verificm mai nti care dintre

dect s

este mai mare, sau dac acestea sunt egale pentru a ne

asigura c lucrm doar cu elementele de sub diagonala principal.


5.2.6 Algoritmul
Acum putem realiza descrierea formal a algoritmului

Atunci funcia HH este definit astfel:


5.2.7 Exemplu
Pentru a vedea cum se comport algoritmul HH, considerm urmtorul exemplu:

56

Fie

. Pentru simplitate, considerm c funcia de reducere doar

trunchiaz mesajul M la

bii. Aadar

numrul
Funcia

, care reprezint
.

de

generare

ciclului

calculeaz

apoi

al

1365-lea

ciclu

, care reprezint ciclul 174856231. Presupunem c


este ales n mod aleator

, iar cele patru muchii aleatoare care urmeaz s fie adugate

sunt (3,5), (4,5), (1,4) i (7,8). Acestea formeaz urmtorul graf:

reprezentat prin matricea de adiacen

57

Cu alte cuvinte

5.3 Proprietile algoritmului


n aceast seciune analizm o serie de proprieti diferite ale algoritmului HH i, cel mai
important, prezentm teorema de rezisten la preimagine a acestui algoritm.
5.3.1 Non-determinism i modaliti de verificare
Cea mai exotic proprietate a algoritmului HH este non-determinismul. De fiecare dat
cnd funcia hash este aplicat aceluiai mesaj, rezultatul va fi diferit. Aceasta nseamn c un
hash nu poate fi verificat prin simpla recalculare, aa cum se face de obicei. Pentru a vedea
cum poate fi totui util un hash non-deterministic, sunt necesare cteva definiii noi ale
rezistenei la preimagine, la a doua preimagine i la coliziuni.
Notaii 5.3.1
Fie

rezultatul aplicrii funciei

multe valori posibile ale lui

. Fie

obinute n urma aplicrii algoritmului


oricare ar fi

pentru mesajul

o singur dat. Exist mai

mulimea tuturor rezultatelor care pot fi


pentru mesajul

. Aadar

Observm c

pentru valori mari ale lui . Acest lucru este justificat

mai riguros n seciunea 5.3.6. Apoi avem c


oricare dou mesaje

nu sunt disjuncte pentru

Cu ajutorul acestei notaii putem explica cum putem verifica modul n care un anumit hash
corespunde unui anumit mesaj. O funcie hash convenional poate verifica uor dac
. Acest lucru nu este posibil n cazul nostru, din moment ce este foarte puin
probabil ca funcia

aplicat aceluiai mesaj s genereze acelai hash. n schimb, trebuie

58

verificat dac ciclul hamiltonian corespunztor lui

se afl n graful

. Funcia de verificare

realizeaz acest lucru:

Cu alte cuvinte,
Relaia

dac i numai dac ciclul


este echivalent cu

se gsete n graful
unde

este o funcie hash

convenional.
Acum putem defini rezistena la preimagine, rezistena la a doua preimagine i rezistena
la coliziuni ntr-un mod aproape identic cu definiiile din seciunea 1.2.
Definiie 5.3.2 (rezistena la preimagine)
O funcie hash non-deterministic

se numete rezistent la preimagine dac pentru o

anumit valoare hash este dificil de gsit un mesaj

astfel nct

Definiie 5.3.3 (rezistena la a doua preimagine)


O funcie hash non-deterministic
pentru

dat, este dificil de gsit

se numete rezistent la a doua preimagine dac

, astfel nct

Definiie 5.3.4 (rezistena la coliziune)


O funcie hash non-deterministic
,

este rezistent la coliziuni dac sunt dificil de gsit

, astfel nct

5.3.2 Rezistena la preimagine a algoritmului HH


Rezultatul cel mai interesant este faptul c funcia

este rezistent la preimagine

indiferent de proprietile funciei de reducere.


Teorema 5.3.5 (rezistena la preimagine a funciei HH)
Determinarea unei preimagini pentru o valoare hash generat prin algoritmul

este cel

puin la fel de dificil ca rezolvarea problemei ciclului hamiltonian, adic este NP-complet.
Demonstraie. Dovada acestui fapt se face prin reducere la absurd. Pentru a demonstra
faptul c generarea unei preimagini este cel puin la fel de dificil ca rezolvarea problemei
ciclului hamiltonian, trebuie s artm c, dac se poate gsi n timp polinomial o
59

preimagine, atunci se poate gsi n timp polinomial i o soluie pentru problema ciclului
hamiltonian.
S presupunem c exist un algoritm de timp polinomial , care pentru intrarea
un mesaj

, astfel nct

. Conform definiiei lui

i, prin urmare,

, gsete

, acest lucru nseamn c

este ciclul hamiltonian corespunztor lui M, adic

.
Cu alte cuvinte, putem defini un algoritm
.

, care are ca date de intrare

determin un ciclu hamiltonian ntr-un graf dat, deci rezolv

problema ciclului hamiltonian. Deoarece


i

i ca date de ieire

este un algoritm de timp polinomial iar funciile

sunt calculabile n timp polinomial, avem c

este, de asemenea, un algoritm de timp

polinomial. Contradicie. Prin urmare, presupunerea fcut este fals, deci gsirea unei
preimagini este cel puin la fel de dificil ca problema ciclului hamiltonian. Este evident c
determinarea unei preimagini este n NP, deoarece corectitudinea unei soluii poate fi uor
verificat prin calculul valorii funciei
valoare hash generat prin

. Prin urmare gsirea unei preimagini pentru o

este o problem NP-complet. Acest lucru nseamn c HH

este o funcie rezistent la preimagine.


5.3.3 Rezistena la a doua preimagine a algoritmului
Un alt rezultat important este faptul c rezistena la a doua preimagine a func iei

rezistena la a doua preimagine a funciei de reducere sunt echivalente.


Teorema 5.3.6 (rezistena la a doua preimagine a funciei

este rezistent la a doua preimagine dac i numai dac funcia de reducere este
rezistent la a doua preimagine.
Demonstraie. S presupunem c
conform definiiei, pentru un mesaj
oricare ar fi

este rezistent la a doua preimagine. Atunci,


, este dificil de gsit un mesaj
.

Avem
60

, astfel nct

Prin urmare, pentru un mesaj

dat, este greu de gsit un mesaj

, astfel nct

, adic funcia de reducere este rezistent la a doua preimagine.


Reciproc, presupunem c funcia de reducere este rezistent la a doua preimagine. Atunci,
pentru

dat, este dificil de gsit

astfel nct

. Ca la demonstraia

amterioar, problema de rezolvat este echivalent cu urmtoarea problem: Pentru

dat,

este dificil de gsit

este

astfel nct

oricare ar fi

. Aadar

rezistent la a doua preimagine.


5.3.4 Rezistena la coliziuni a algoritmului HH
Rezistena la coliziuni se comport la fel ca rezistena la a doua preimagine, i anume:
rezistena la coliziuni a algoritmului

i rezistena la coliziuni a funciei de reducere sunt

echivalente.
Teorema 5.3.7 (rezistena la coliziuni a algoritmului HH)
Funcia hash

este rezistent la coliziuni dac i numai dac funcia de reducere este

rezistent la coliziuni.
Demonstraie. Presupunem c

este rezistent la coliziuni. Atunci sunt dificil de gsit

, astfel nct:
i

Prin urmare, sunt dificil de gsit

, astfel nct

, deci funcia de

reducere este rezistent la coliziune.


Reciproc, presupunem c funcia de reducere este rezistent la coliziune. Atunci este
dificil de gsit

, astfel nct

. La fel ca mai sus, aceasta nseamn c

61

sunt dificil de gsit dou mesaje

, astfel nct
, prin urmare,

este rezistent la coliziuni.

Mai important dect rezistena la coliziuni produse n mod deliberat (de ctre un atacator)
este problema coliziunilor care pot fi produse "accidental". Chiar si funciile hash noncriptografice devin inutile n cazul n care dou intrri diferite produc aceeai amprent. n
cazul nostru, probabilitatea ca dou mesaje diferite s fie verificate de ctre aceeai valoare
hash depinde foarte mult de calitatea funciei de reducere, deoarece orice coliziune n funcia
de reducere produce o coliziune n funcia

, dup cum s-a vzut mai sus. Exist ns o

mulime de candidai pentru funcia de reducere, deci acest lucru nu va constitui o problem.
Funcia de generare a ciclului nu poate produce niciodat coliziuni, deoarece este bijectiv.
ntrebarea pe care ne-o punem este: Pentru dou cicluri hamiltoniene

i , ct este de

probabil ca amprenta unuia (adic unul din grafurile care conin acest ciclu) s verifice i pe
cellalt? Cu alte cuvinte, ct de mare este probabilitatea ca

s conin ciclul ?

Pentru a rspunde la aceast ntrebare, trebui s facem anumite presupuneri


simplificatoare. S presupunem c un graf generat are aproximativ jumtate din toate
muchiile posibile, i c fiecare muchie are o probabilitate de existen de
seciunea 5.3.7). Atunci probabilitatea ca un anumit ciclu
este

din moment ce

fixeaz

(a se vedea

s fie coninut n graful

muchii. Dac, de exemplu,

, atunci

, care este o valoare suficient de mic. De aceea, probabilitatea de


generare (accidental) a coliziunilor este considerat satisfctoare.
5.3.5 Efectul de avalan al algoritmului HH
Exist mai multe proprieti ale funciilor hash, care sunt dorite, dar care nu trebuie s fie
neaprat dovedite. Unul extrem de important este efectul de avalan, adic proprietatea ca
oricare dou iruri adiacente de bii s aib valori hash complet diferite. Cu alte cuvinte,
atunci cnd o intrare a unei funcii hash este modificat uor (de exemplu, este inversat un
bit), datele de ieire trebuie s fie modificate n mod semnificativ (de exemplu, aproximativ
jumtate din biii de ieire s fie inversai). Dac o funcie hash nu prezint efectul de
avalan, un criptanalist poate fi capabil s fac predicii cu privire la datele de intrare, pentru
un anumit set de date de ieire, ceea ce poate fi suficient pentru a sparge algoritmul parial
sau complet al funciei hash considerate. Astfel, "construirea unui cifru sau a unei funcii
hash cu un efect de avalan puternic este unul dintre obiectivele principale" ale proiectrii
acestora [18].
62

Experimentele realizate n urma rulrii algoritmului (a se vedea seciunea 5.5) sugereaz


c HH are un efect de avalan foarte bun. Chiar i atunci cnd o singur liter este schimbat
din mesajul de intrare, amprenta acestuia arat complet diferit. Mai jos sunt prezentate cteva
exemple:

5.3.6 Surjectivitatea funciei HH


O alt proprietate interesant este surjectivitatea funciei
"Poate fi generat orice graf de ctre algoritmul

. Apar ntrebri cum ar fi:

?" sau "Toate ieirile posibile sunt sunt la

fel de probabile?"
Rspunsul imediat la prima ntrebare este "nu".

nu este surjectiv. Este evident c

orice graf de ieire trebuie s conin un ciclu hamiltonian. Prin urmare, toate grafurile care
nu conin un ciclu hamiltonian, i, n special cele cu mai puin dect

muchii, nu pot

constitui date de ieire ale algoritmului. Ne propunem ns s investigm numrul de grafuri


care pot fi generate prin

Este greu de gsit o formul pentru numrul de grafuri cu

noduri care conin un anumit

ciclu hamiltonian. Bollobas [60] demonstreaz c un element al lui


hamiltonian cu o probabilitate care tinde la 1 pe msur ce

tinde la

conine un ciclu
. Prin urmare, pentru

valori mari ale lui , cele mai multe grafuri conin cicluri hamiltoniene.
n plus, n cazul n care parametrul

al funciei de generare a grafului este setat s fie

zero, atunci orice graf care conine cel puin un ciclu hamiltonian constituie o posibil ieire a
algoritmului

Un alt obiectiv important n designul funciilor hash este ca toate ieirile posibile s fie la
fel de probabile. n caz contrar, un atacator ar putea face din nou predicii cu privire la o
anumit ieire, care poate ajuta la spargerea funciei hash. Considerm mulimea tuturor
amprentelor i dorim s verificm dac toate elementele acesteia au aceeai probabilitate de a
fi generate. Presupunem c funcia de reducere este o funcie hash bun, adic toate irurile
de n-bii au aceeai probabilitate de a fi generate. Observm c nu toate ciclurile sunt
posibile, deoarece n=log2(c), adic

, ceea ce nseamn c ultimele

cicluri

nu pot fi generate. Prin urmare, unele muchii ale ciclului generat au o probabilitate mai mare
dect altele. Dar, deoarece aceste muchii reprezint doar un mic procent din numrul total de
63

muchii posibile, muchiile care sunt adugate uniform aleator au aproximativ aceeai
probabilitate de a fi incluse n graful final. Prin urmare, fiecare graf care constituie un posibil
rezultat al funciei

are aproximativ aceeai probabilitate de a fi generat.

5.3.7 Caracterul aleator al funciei HH


Este de asemenea important ca o funcie hash s se comporte ca o funcie aleatoare, adic
ar trebui s fie imposibil de prezis un singur bit de ieire pentru un anumit set de date de
intrare fr a aplica explicit funcia

Fr a recurge la o analiz statistic, putem spune c datele de ieire au un "aspect


aleator". Numrul de muchii este, n medie, aproximativ , iar astfel, numrul de bii de zero
este aproximativ egal cu numrul de bii de unu. Fiecare muchie este la fel de probabil, i,
prin urmare, fiecare bit are aceeai probabilitate de a fi 0 sau 1.
Rezultatele obinute cu ajutorul programului nostru (a se vedea seciunea 5.5) ilustreaz
foarte bine aceast proprietate. De asemenea, este evident faptul c este imposibil de prezis o
anumit ieire fr a aplica efectiv cel puin anumite pri ale algoritmului

, cu condiia ca

numerele aleatoare folosite n algoritm s fie imposibil de prezis. Acest aspect constituie o
problem fundamental n criptografie: generarea numerelor aleatoare criptografic sigure.
Trebuie s inem cont c doar aplicarea funciei de reducere i de generare a ciclului
hamiltonian permit prezicerea a exact

bii de ieire, i anume a celor din ciclul

corespunztor mesajului.
5.3.8 Eficiena algoritmului HH
Funciile hash reprezint, de obicei, componente ale unor protocoale criptografice mai
complexe, care ar putea necesita numeroase generri de amprente. De aceea, acestea trebuie
s fie eficiente din punct de vedere computaional. Acest lucru reprezint un dezavantaj al
funciilor hash demonstrabil sigure, n comparaie cu cele proiectate special. Funciile hash
sigure adesea implic operaiuni costisitoare. Algoritmul

nu poate fi la fel de eficient

ca algoritmii proiectai special, care sunt concepui pentru a rula rapid pe maini pe 32 de bii,
dar este destul de eficient pentru o funcie hash demonstrabil sigur. S analizm, pe rnd,
cele trei componente ale algoritmului.
Eficiena funciei de reducere depinde, desigur, de funcia aleas. Astfel, putem alege ca
funcie de reducere o funcie hash proiectat special, care s se bazeze doar pe operaii logice
pe bii, deci foarte eficient.
Funcia de generare a ciclului are ordinul de complexitate O(v), adic o complexitate
liniar, deci este foarte eficient.
Urmtoarea component este funcia de generare a grafului. Eficiena acesteia depinde
exclusiv de ct de repede pot fi generate numerele aleatoare. n medie, trebuie s fie generate

64

aproximativ

numere aleatoare ntre 1 i . Pentru

, avem nevoie de

aproximativ 4000 de numere aleatoare sau 32000 de bii aleatori. Exist foarte multe
generatoare de numere aleatoare eficiente, dar nu toate sunt potrivite pentru a fi folosite n
criptografie. Algoritmul

are nevoie de un generator de numere aleatoare securizat

criptografic. Cele mai bune astfel de generatoare sunt cele care se bazeaz pe entropia
proceselor fizice. Cel mai rapid generator disponibil astzi este capabil s produc circa 32
Mbii aleatori pe secund [33]. Algoritmul

are nevoie de mai puin de 30 kbii, care pot fi

generai n mai puin de o milisecund. Prin urmare, funcia de generare a grafului este, de
asemenea, eficient.
n concluzie ntregul algoritm

este eficient din punct de vedere computaional.

5.3.9 Biii de securitate ai algoritmului HH


Una dintre cele mai importante ntrebri la care nu am rspuns nc este: Ct de mare este
trebuie s fie

pentru a obine un nivel de securitate rezonabil? Pentru a rspunde la aceasta

ntrebare, trebuie s examinm numrul de cicluri hamiltoniene dintr-un graf generat de

Aa cum am explicat n seciunile anterioare, toate grafurile rezultate sunt aproximativ la


fel de probabile. Greenhill [26] demonstreaz c numrul estimat de cicluri hamiltoniene ntrun graf oarecare

este

. Acum, s presupunem c un atacator dorete s

lanseze un atac prin for brut, pentru a gsi o preimagine pentru un anumit hash
Deoarece exist

cicluri posibile la care poate fi mapat un mesaj

acestea sunt prezente n

, atacatorul ar trebui s ncerce n medie

a gsi o preimagine valid. Avem

65

, i

dintre

mesaje pentru

astfel

nct

Deoarece

noduri

genereze

cel

puin

bii

de

securitate.

nu este rezistent la coliziuni i, prin urmare, nu este supus atacului naterilor,

sunt de dorit cel puin 128 de bii de securitate (a se vedea seciunea 1.3.1).
Obinem aadar urmtoarele valori pentru o implementare securizat a funciei hash

Aceste valori dau o valoare hash de aproximativ 1 kilooctet.

5.4 Aplicaii ale algoritmului


Orice funcie hash devine inutil n cazul n care nu poate fi folosit n scopuri practice. n
general, rezistena la preimagine este suficient pentru scopuri de autentificare. Aceast
seciune ofer cel puin dou aplicaii posibile ale funcei

5.4.1 Stocarea parolelor


Stocarea parolelor, despre care am vorbit n seciunea 1.4.2, este o modalitate foarte bun
de a utiliza funcia

. Reinem faptul c nu parolele sunt stocate n fiier, ci valorile hash

ale acestora. Dac fiierul este compromis de ctre un atacator, acesta nu are acces la parole
deoarece funcia hash

este rezistent la preimagine. n acest scenariu, atacatorul este

interesat s obin accesul la contul unui utilizator. Prin urmare, nu este interesat s gseasc
preimagini secundare. O singur preimagine ar fi suficient. De asemenea, el nu este interesat
sa gseasc coliziuni. Cel mai important, nu conteaz c funcia hash este non-deterministic
deoarece se poate verifica dac un hash stocat corespunde parolei introduse de ctre un
utilizator sau nu.
5.4.2 Compararea rezultatelor
S presupunem c am gsit solutia pentru un anumit joc. Prietenul nostru joac acelai joc
i vrea s verifice dac soluia lui este corect. Eu nu sunt de acord s i trimit soluia mea, iar
nici prietenul meu nu dorete s mi trimit soluia lui, pentru c i este fric s nu fie n elat,
aa c i trimit valoarea hash a soluiei mele. n acest fel, el poate verifica propria lui soluie,
dar nu poate determina i soluia mea, deoarece nu poate calcula o preimagine a amprentei.
Din nou, nu conteaz c funcia hash este non-deterministic, deoarece valoarea hash poate s
fie folosit pentru a verifica dac o soluie este corect. De asemenea, rezistena la a doua
preimagine i rezistena la coliziuni nu aduc niciun avantaj n aceast situaie.

66

5.5 Implementarea funciei HH


Codul surs poate fi gsit n anex i pe CD-ROM-ul care nsoete aceast lucrare.
Algoritmul este implementat n C# i folosete algoritmul SHA-1 ca funcie de reducere.
Deoarece SHA-1 are o ieire pe 160 de bii, poate fi atins cel mult o securitate pe 41 de bii.
Parametrii

pot fi alei de ctre utilizator. Am creat att o interfa grafic ct i un

program de consol care primete dou argumente,

(n aceast ordine). Orice

argumente suplimentare sunt ignorate. Dac este dat un singur argument, atunci

este setat la

zero. n cazul n care nu se dau argumente, sunt folosite valorile implicite

Implementarea nu a fost optimizat pentru vitez ci a fost facut pentru a avea o structur
foarte asemntoare cu descrierea algoritmului prezentat n acest capitol. De asemenea,
precizm c a fost utilizat metoda standard de generare a numerelor aleatoare pus la
dispoziie de platforma .NET.

5.6 Concluzie
Acest capitol a introdus un tip de funcie hash demonstrabil sigur, precum i designul i
implementarea acesteia. S-a artat c funcia HH, ca funcie hash non-deterministic este
rezistent la preimagine. Cu toate acestea, nu este rezistent la a doua preimagine, nici
rezistent la coliziuni, cu excepia cazului n care folosim o funcie de reducere care s aib
aceleai proprieti. Cu toate acestea, securitatea este suficient pentru anumite aplicaii, cum
ar fi autentificarea utilizatorilor unei soluii software. Este un design interesant i, o dat ce
vor putea fi depite limitrile sale, va putea dobndi o importan practic, devenind primul
model de funcie hash de acest gen.

67

Concluzie
Funciile hash criptografice reprezint un domeniu important i interesant de studiat. Mai
ales n ultimii ani fost fcute progrese impresionante, care au deschis numeroase direc ii noi
de cercetare. Cele mai promitoare sunt reprezentate de funciile hash demonstrabil sigure,
ale cror proprieti sunt extrem de dorite, dar care sunt extrem de dificil de proiectat. Metoda
cea mai practic i mai utilizat pe scar larg n cercetarea curent este legat de
proprietile de securitate ale problemelor NP-complete. Acestea furnizeaz o metod
recunoscut de cuantificare a "dificultii", iar sarcina de a dovedi proprietile de securitate
se rezum la dovezi prin reducere la absurd, care sunt adesea uor de schiat. Numrul mare
de probleme NP-complete furnizeaz o gam larg de posibiliti pentru proiectarea funciilor
hash demonstrabil sigure. Multe dintre aceste probleme pot fi transformate n funcii hash
ntr-un mod foarte natural.
Totui, exist numeroase probleme legate de aceast abordare. Funciile hash demonstrabil
sigure sunt, de obicei, mult mai greu de calculat dect cele proiectate special, deoarece
problemele NP-complete implic adesea operaii care sunt foarte costisitoare pentru un
calculator, cum ar fi multiplicarea sau exponenierea. Dei problemele NP-complete pot oferi
o indicaie asupra dificultii unei probleme, se poate s existe algoritmi de aproximare a
soluiilor acestora, n timp polinomial. Mai mult, chiar dac nu exist algoritmi de aproximare
eficieni, NP-completitudinea nu ofer nicio indicaie cu privire la numrul cazurilor triviale
ale unei anumite probleme. n ciuda acestor dificulti ns, se pare c aceasta este direcia n
care se ndreapt cercetarea actual.
Astzi, gestiunea corespunztoare a documentelor n format electronic face necesar
implementarea unei securiti riguroase, care s asigure protecia informatiilor mpotriva
pierderii, distrugerii sau divulgarii neautorizate.
Cel mai sensibil aspect este acela de a asigura securitatea informaiei gestionate de
sistemele informatice n noul context tehnologic.
Ultimii ani au artat n mod clar c funciile hash criptografice folosite astzi nu ofer un
nivel de securitate suficient de ridicat. Oricine nelege pe deplin implicaiile evoluiilor
curente ale criptanalizei trebuie s fie dispus s accepte micile dezavantajele ale unor calcule
mai lente n schimbul unei securiti de nivel superior, care s poat fi dovedit matematic.
De aceea, sperana noastr este ca funciile hash utilizate n prezent, care au o securitate
discutabil, s fie nlocuite, ct mai curnd, de funcii hash criptografice demonstrabil sigure.

Anexe
68

A. Implementarea algoritmilor MD5 i SHA1 n JavaScript:


/*
* Implementare JavaScript a algoritmului MD5
*/
/*
* variabile configurabile
*/
var hexcase = 0;
/* format de afisare a numerelor hexazecimale.
0 litere mici; 1 litere mari
var b64pad = ""; /* caracter de completare pentru base-64

*/
*/

/*
* Functiile cele mai importante
*/
function hex_md5(s)
{ return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
function b64_md5(s)

{ return rstr2b64(rstr_md5(str2rstr_utf8(s))); }

function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }


function hex_hmac_md5(k, d)
{ return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_md5(k, d)
{ return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_md5(k, d, e)
{ return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)),
e); }
/*
* Calculeaza amprenta MD5 a unui string dat
*/
function rstr_md5(s)
{
return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}
/*
* Calculeaza HMAC-MD5 cu o anumita cheie si niste date (sir de stringuri)
*/
function rstr_hmac_md5(key, data)
{
var bkey = rstr2binl(key);
if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}

var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);


return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));

69

/*
* Conversia unui string obisnuit intr-un string hexazecimal
*/
function rstr2hex(input)
{
try { hexcase } catch(e) { hexcase=0; }
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var output = "";
var x;
for(var i = 0; i < input.length; i++){
x = input.charCodeAt(i);
output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
}
return output;
}
/*
* Conversia unui string obisnuit intr-un string base-64
*/
function rstr2b64(input)
{
try { b64pad } catch(e) { b64pad=''; }
var tab =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var output = "";
var len = input.length;
for(var i = 0; i < len; i += 3)
{
var triplet = (input.charCodeAt(i) << 16)
| (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
| (i + 2 < len ? input.charCodeAt(i+2)
: 0);
for(var j = 0; j < 4; j++)
{
if(i * 8 + j * 6 > input.length * 8) output += b64pad;
else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
}
}
return output;
}
/*
* Conversia unui string obisnuit intr-unul cu o codificare data
*/
function rstr2any(input, encoding)
{
var divisor = encoding.length;
var i, j, q, x, quotient;
var dividend = Array(Math.ceil(input.length / 2));
for(i = 0; i < dividend.length; i++)
{
dividend[i] = (input.charCodeAt(i * 2) << 8)|input.charCodeAt(I*2+1);
}
var full_length = Math.ceil(input.length * 8 /
(Math.log(encoding.length) /
Math.log(2)));
var remainders = Array(full_length);
for(j = 0; j < full_length; j++)

70

quotient = Array();
x = 0;
for(i = 0; i < dividend.length; i++)
{
x = (x << 16) + dividend[i];
q = Math.floor(x / divisor);
x -= q * divisor;
if(quotient.length > 0 || q > 0)
quotient[quotient.length] = q;
}
remainders[j] = x;
dividend = quotient;

var output = "";


for(i = remainders.length - 1; i >= 0; i--)
output += encoding.charAt(remainders[i]);
return output;
}
/*
* Codifica un string ca utf-8. Consideram ca inputul este utf-16 valid
*/
function str2rstr_utf8(input)
{
var output = "";
var i = -1;
var x, y;
while(++i < input.length)
{
x = input.charCodeAt(i);
y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
{
x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
i++;
}
if(x <= 0x7F)
output += String.fromCharCode(x);
else if(x <= 0x7FF)
output += String.fromCharCode(0xC0
0x80
else if(x <= 0xFFFF)
output += String.fromCharCode(0xE0
0x80
0x80
else if(x <= 0x1FFFFF)
output += String.fromCharCode(0xF0
0x80
0x80
0x80

}
return output;

/*

71

| ((x >>> 6 ) & 0x1F),


| ( x
& 0x3F));
| ((x >>> 12) & 0x0F),
| ((x >>> 6 ) & 0x3F),
| ( x
& 0x3F));
|
|
|
|

((x >>> 18) & 0x07),


((x >>> 12) & 0x3F),
((x >>> 6 ) & 0x3F),
( x
& 0x3F));

* Codifica un string ca utf-16


*/
function str2rstr_utf16le(input)
{
var output = "";
for(var i = 0; i < input.length; i++)
output += String.fromCharCode( input.charCodeAt(i)
& 0xFF,
(input.charCodeAt(i) >>> 8) & 0xFF);
return output;
}
function str2rstr_utf16be(input)
{
var output = "";
for(var i = 0; i < input.length; i++)
output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
input.charCodeAt(i)
& 0xFF);
return output;
}
/*
* Conversia unui string obisnuit intr-un sir de cuvinte little-endian
*/
function rstr2binl(input)
{
var output = Array(input.length >> 2);
for(var i = 0; i < output.length; i++)
output[i] = 0;
for(var i = 0; i < input.length * 8; i += 8)
output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
return output;
}
/*
* Conversia unui sir de cuvinte little-endian intr-un string
*/
function binl2rstr(input)
{
var output = "";
for(var i = 0; i < input.length * 32; i += 8)
output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
return output;
}
/*
* Calculeaza amprenta MD5 a unui sir de cuvinte little-endian
*/
function binl_md5(x, len)
{
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var
var
var
var

a
b
c
d

= 1732584193;
= -271733879;
= -1732584194;
= 271733878;

for(var i = 0; i < x.length; i += 16)

72

var olda = a;
var oldc = c;

var oldb = b;
var oldd = d;

a
d
c
b
a
d
c
b
a
d
c
b
a
d
c
b

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

md5_ff(a,
md5_ff(d,
md5_ff(c,
md5_ff(b,
md5_ff(a,
md5_ff(d,
md5_ff(c,
md5_ff(b,
md5_ff(a,
md5_ff(d,
md5_ff(c,
md5_ff(b,
md5_ff(a,
md5_ff(d,
md5_ff(c,
md5_ff(b,

b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,

c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,

d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,

x[i+ 0],
x[i+ 1],
x[i+ 2],
x[i+ 3],
x[i+ 4],
x[i+ 5],
x[i+ 6],
x[i+ 7],
x[i+ 8],
x[i+ 9],
x[i+10],
x[i+11],
x[i+12],
x[i+13],
x[i+14],
x[i+15],

7 ,
12,
17,
22,
7 ,
12,
17,
22,
7 ,
12,
17,
22,
7 ,
12,
17,
22,

-680876936);
-389564586);
606105819);
-1044525330);
-176418897);
1200080426);
-1473231341);
-45705983);
1770035416);
-1958414417);
-42063);
-1990404162);
1804603682);
-40341101);
-1502002290);
1236535329);

a
d
c
b
a
d
c
b
a
d
c
b
a
d
c
b

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

md5_gg(a,
md5_gg(d,
md5_gg(c,
md5_gg(b,
md5_gg(a,
md5_gg(d,
md5_gg(c,
md5_gg(b,
md5_gg(a,
md5_gg(d,
md5_gg(c,
md5_gg(b,
md5_gg(a,
md5_gg(d,
md5_gg(c,
md5_gg(b,

b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,

c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,

d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,

x[i+ 1],
x[i+ 6],
x[i+11],
x[i+ 0],
x[i+ 5],
x[i+10],
x[i+15],
x[i+ 4],
x[i+ 9],
x[i+14],
x[i+ 3],
x[i+ 8],
x[i+13],
x[i+ 2],
x[i+ 7],
x[i+12],

5 ,
9 ,
14,
20,
5 ,
9 ,
14,
20,
5 ,
9 ,
14,
20,
5 ,
9 ,
14,
20,

-165796510);
-1069501632);
643717713);
-373897302);
-701558691);
38016083);
-660478335);
-405537848);
568446438);
-1019803690);
-187363961);
1163531501);
-1444681467);
-51403784);
1735328473);
-1926607734);

a
d
c
b
a
d
c
b
a
d
c
b
a
d
c
b

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

md5_hh(a,
md5_hh(d,
md5_hh(c,
md5_hh(b,
md5_hh(a,
md5_hh(d,
md5_hh(c,
md5_hh(b,
md5_hh(a,
md5_hh(d,
md5_hh(c,
md5_hh(b,
md5_hh(a,
md5_hh(d,
md5_hh(c,
md5_hh(b,

b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,

c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,

d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,
d,
c,
b,
a,

x[i+ 5],
x[i+ 8],
x[i+11],
x[i+14],
x[i+ 1],
x[i+ 4],
x[i+ 7],
x[i+10],
x[i+13],
x[i+ 0],
x[i+ 3],
x[i+ 6],
x[i+ 9],
x[i+12],
x[i+15],
x[i+ 2],

4 ,
11,
16,
23,
4 ,
11,
16,
23,
4 ,
11,
16,
23,
4 ,
11,
16,
23,

-378558);
-2022574463);
1839030562);
-35309556);
-1530992060);
1272893353);
-155497632);
-1094730640);
681279174);
-358537222);
-722521979);
76029189);
-640364487);
-421815835);
530742520);
-995338651);

a
d
c
b
a
d

=
=
=
=
=
=

md5_ii(a,
md5_ii(d,
md5_ii(c,
md5_ii(b,
md5_ii(a,
md5_ii(d,

b,
a,
d,
c,
b,
a,

c,
b,
a,
d,
c,
b,

d,
c,
b,
a,
d,
c,

x[i+ 0],
x[i+ 7],
x[i+14],
x[i+ 5],
x[i+12],
x[i+ 3],

6 ,
10,
15,
21,
6 ,
10,

-198630844);
1126891415);
-1416354905);
-57434055);
1700485571);
-1894986606);

73

c
b
a
d
c
b
a
d
c
b

=
=
=
=
=
=
=
=
=
=

md5_ii(c,
md5_ii(b,
md5_ii(a,
md5_ii(d,
md5_ii(c,
md5_ii(b,
md5_ii(a,
md5_ii(d,
md5_ii(c,
md5_ii(b,

d,
c,
b,
a,
d,
c,
b,
a,
d,
c,

a
b
c
d

=
=
=
=

safe_add(a,
safe_add(b,
safe_add(c,
safe_add(d,

a,
d,
c,
b,
a,
d,
c,
b,
a,
d,

b,
a,
d,
c,
b,
a,
d,
c,
b,
a,

x[i+10],
x[i+ 1],
x[i+ 8],
x[i+15],
x[i+ 6],
x[i+13],
x[i+ 4],
x[i+11],
x[i+ 2],
x[i+ 9],

15,
21,
6 ,
10,
15,
21,
6 ,
10,
15,
21,

-1051523);
-2054922799);
1873313359);
-30611744);
-1560198380);
1309151649);
-145523070);
-1120210379);
718787259);
-343485551);

olda);
oldb);
oldc);
oldd);

}
return Array(a, b, c, d);

/*
* Aceste functii implementeaza cele 4 operatii de
*/
function md5_cmn(q, a, b, x, s, t)
{
return safe_add(bit_rol(safe_add(safe_add(a, q),
}
function md5_ff(a, b, c, d, x, s, t)
{
return md5_cmn((b & c) | ((~b) & d), a, b, x, s,
}
function md5_gg(a, b, c, d, x, s, t)
{
return md5_cmn((b & d) | (c & (~d)), a, b, x, s,
}
function md5_hh(a, b, c, d, x, s, t)
{
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

baza ale algoritmului

safe_add(x, t)), s),b);

t);

t);

/*
* Metoda speciala de adunanare a intregilor pe 32 biti
*/
function safe_add(x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/*
* Roteste un intreg pe 32 biti la stanga.
*/
function bit_rol(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}
/*

74

* Implementare JavaScript a algoritmului SHA-1


*/
/*
* Functii principale
*/
function hex_sha1(s)

{ return rstr2hex(rstr_sha1(str2rstr_utf8(s))); }

function b64_sha1(s)

{ return rstr2b64(rstr_sha1(str2rstr_utf8(s))); }

function any_sha1(s, e) { return rstr2any(rstr_sha1(str2rstr_utf8(s)), e);}


function hex_hmac_sha1(k, d)
{ return rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_sha1(k, d)
{ return rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_sha1(k, d, e)
{ return rstr2any(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)),e); }
/*
* Calculeaza amprenta SHA1 a unui string obisnuit
*/
function rstr_sha1(s)
{
return binb2rstr(binb_sha1(rstr2binb(s), s.length * 8));
}
/*
* Calculeaza HMAC-SHA1 cu o anumita cheie si niste date (sir de stringuri)
*/
function rstr_hmac_sha1(key, data)
{
var bkey = rstr2binb(key);
if(bkey.length > 16) bkey = binb_sha1(bkey, key.length * 8);
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = binb_sha1(ipad.concat(rstr2binb(data)),512 + data.length * 8);
return binb2rstr(binb_sha1(opad.concat(hash), 512 + 160));
}
/*
* Calculate the SHA-1 of an array of big-endian words, and a bit length
*/
function binb_sha1(x, len)
{
/* append padding */
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
var
var
var
var

w
a
b
c

= Array(80);
= 1732584193;
= -271733879;
= -1732584194;

75

var d = 271733878;
var e = -1009589776;
for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
var olde = e;
for(var j = 0; j < 80; j++)
{
if(j < 16) w[j] = x[i + j];
else w[j] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
var t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
safe_add(safe_add(e, w[j]), sha1_kt(j)));
e = d;
d = c;
c = bit_rol(b, 30);
b = a;
a = t;
}
a
b
c
d
e

=
=
=
=
=

safe_add(a,
safe_add(b,
safe_add(c,
safe_add(d,
safe_add(e,

olda);
oldb);
oldc);
oldd);
olde);

}
return Array(a, b, c, d, e);
}
/*
* Perform the appropriate triplet combination function for the current
* iteration
*/
function sha1_ft(t, b, c, d)
{
if(t < 20) return (b & c) | ((~b) & d);
if(t < 40) return b ^ c ^ d;
if(t < 60) return (b & c) | (b & d) | (c & d);
return b ^ c ^ d;
}
/*
* Determine the appropriate additive constant for the current iteration
*/
function sha1_kt(t)
{
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
(t < 60) ? -1894007588 : -899497514;
}

B. Implementarea algoritmului HH n C#:


76

using
using
using
using
using
using

System;
System.IO;
System.Text;
System.Numerics;
System.Collections;
System.Security.Cryptography;

namespace HamiltonianHash
{
class Program
{
static void Main(string[] args)
{
Console.Out.WriteLine("Bine ati venit!");
if (args.Length == 0)
{
setConstants(41, 0);
}
else if (args.Length == 1)
{
int vv = Convert.ToInt32(args[0]);
if (vv < 6 || vv > 41)
{
Console.Out.WriteLine("v trebuie sa fie intre 6 si 41.");
Console.Out.WriteLine("Programul se va inchide!");
Environment.Exit(1);
}
setConstants(vv, 0);
}
else
{
int vv = Convert.ToInt32(args[0]);
int ff = Convert.ToInt32(args[1]);
if (vv < 6 || vv > 41)
{
Console.Out.WriteLine("v trebuie sa fie intre 6 si 41. ");
Console.Out.WriteLine("Programul se va inchide!");
Environment.Exit(1);
}
if (ff < 0 || ff > vv * (vv - 1) / 4)
{
Console.Out.WriteLine("f trebuie sa fie mai mic decat v(v-1)/4.");
Console.Out.WriteLine("Programul se va inchide!");
Environment.Exit(1);
}
setConstants(vv, ff);
}
int done = 1;
while (done != 0)
{
done = menu();
}
Console.Out.WriteLine("\nLa revedere! ");
}

public class HH
{

77

private
private
private
private
private

static
static
static
static
static

int v;
int m;
int n;
int f;
int[,] t;

/* numarul de noduri
*/
/* numarul de muchii
*/
/* lungimea iesirii dupa reducere */
/* parametru de securitate
*/
/* tabel de cautare
*/

private static int[] tn = { 0, 0, 0, 0, 1, 3, 5,


8, 11, 14, 17, 20, 24, 27,
31, 35, 39, 43, 47, 51, 55,
60, 64, 68, 73, 78, 82, 87,
92, 96, 101, 106, 111, 116, 121,
126, 131, 137, 142, 147, 152, 158};
static char[] hexChar = { '0' , '1' , '2' , '3',
'4' , '5' , '6' , '7',
'8' , '9' , 'a' , 'b',
'c' , 'd' , 'e' , 'f'};
/*
* Calculeaza valoarea hash a mesajului
*/
public static int[,] computeHamHash(String msg)
{
return Graph(Cyc(Red(msg)));
}
/*
* Verifica daca un hash este valid pentru un mesaj
* 0 - este valid; 1 - nu este valid;
*/
private static int hamCheck(String msg, String hash)
{
if (hash.Length != m)
{
return 0;
}
for (int i = 0; i < hash.Length; i++)
{
if (hash.Substring(i, 1) != "0" && hash.Substring(i, 1) != "1")
{
return 0;
}
}
int[,] A = new int[v, v];
int k = 0;
for (int i = 0; i < v; i++)
{
for (int j = 0; j < i; j++)
{
A[i, j] = Convert.ToInt32(hash.Substring(k, k + 1));
k++;
}
}
int[] p = Cyc(Red(msg));
int result = 1;
for (int i = 0; i < v - 1; i++)
{
if (p[i] > p[i + 1])

78

if (A[p[i] - 1, p[i + 1] - 1] != 1)
{
result = 0;
}

}
else
{
if (A[p[i + 1] - 1, p[i] - 1] != 1)
{
result = 0;
}
}

}
if (p[v - 1] > p[0])
{
if (A[p[v - 1] - 1, p[0] - 1] != 1) result = 0;
}
else
{
if (A[p[0] - 1, p[v - 1] - 1] != 1) result = 0;
}
return result;

/*
* Genereaza un string pe baza unui sir de biti
*/
private static string ByteToHex(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("x2");
}
return (sbinary);
}
/*
* Calculeaza amprenta SHA1 a mesajului, trunchiata la n caractere
*/
private static String Red(String text)
{
UTF8Encoding encoding = new UTF8Encoding();
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] messageBytes = encoding.GetBytes(text);
byte[] hashmessage = sha1.ComputeHash(messageBytes);
return toBinaryString(hashmessage).Substring(0, n);
}
/*
* Calculeaza factorialul
*/
private static BigInteger factorial(int n)
{
if (n == 0)
{
return BigInteger.One;
}
BigInteger bn = new BigInteger(n);
for (int i = 1; i < n; i++)
{
bn = bn * (n - i);

79

}
return bn;
}
/*
* Genereaza un ciclu hamiltonian corespunzator sirului de biti
*/
private static int[] Cyc(String bin)
{
int[] p = new int[v]; // c y c l e
p[0] = 1;
BigInteger d = BigInteger.Zero;
BigInteger.TryParse(bin, out d);
p[1] = t[(int)(d / factorial(v - 3)), 0];
p[v - 1] = t[(int)(d / factorial(v - 3)), 1];
d = d % factorial(v - 3);

ArrayList a = new ArrayList();


for (int i = 2; i <= v; i++)
{
if (i != p[1] && i != p[v - 1])
{
a.Add(i);
}
}
for (int i = v - 4; i >= 0; i--)
{
p[v - i - 2] = Convert.ToInt32(a.Contains(d / factorial(i)));
a.Remove((d / factorial(i)).ToString());
d = d % factorial(i);
}
return p;

/*
* Genereaza un graf care contine ciclul plus niste muchii aleatoare
*/
private static int[,] Graph(int[] p)
{
int[,] A = new int[v, v];
for (int i = 0; i < v; i++)
{
A[i, i] = 1;
}
for (int i = 0; i < v - 1; i++)
{
A[p[i] - 1, p[i + 1] - 1] = 1;
A[p[i + 1] - 1, p[i] - 1] = 1;
}
A[p[v - 1] - 1, p[0] - 1] = 1;
A[p[0] - 1, p[v - 1] - 1] = 1;
int e = -1;
RandomNumberGenerator.BinomialDistribution binGenerator =
new RandomNumberGenerator.BinomialDistribution();
while ( (e < f) || (e > m - f) ){
e = binGenerator.Next();

80

}
int r1 = 0;
int r2 = 0;
int count = v;
Random generator = new Random();
while (count < e)
{
r1 = generator.Next(v);
r2 = generator.Next(v);
if (A[r1, r2] == 0)
{
A[r1, r2] = 1;
A[r2, r1] = 1;
count++;
}

}
return A;

/*
* Seteaza constantele de lucru
*/
private static void setConstants(int vv, int ff)
{
v = vv;
m = v * (v - 1) / 2;
n = tn[v];
f = ff;
t = new int[(v - 1) * (v - 2) / 2, 2];
int k = 0;
for (int i = 3; i < v; i++)
{
for (int j = 2; j < i; j++)
{
t[k, 0] = i;
t[k, 1] = j;
k++;
}
}

Console.Out.WriteLine("\nAti ales + v + biti de securitate.");


Console.Out.WriteLine("v = " + v);
Console.Out.WriteLine("m = " + m);
Console.Out.WriteLine("n = " + n);
Console.Out.WriteLine("f = " + f);

/*
* Afiseaza un meniu
*/
private static int menu()
{
int choice = 0;
Console.Out.WriteLine("\nCe operatie doriti sa realizati? Introduceti");
Console.Out.WriteLine("0 pentru iesire");
Console.Out.WriteLine("1 pentru a calcula un hash");
Console.Out.WriteLine("2 pentru a verifica un hash");
try
{
choice = Convert.ToInt32(Console.In.ReadLine());

81

}
catch (IOException ioe)
{
Console.Out.WriteLine("Eroare la citire. Programul se va inchide. ");
Environment.Exit(1);
}
catch (FormatException fe)
{
Console.Out.WriteLine("Trebuie sa introduceti un numar.");
return 1;
}
switch (choice)
{
case 1:
computeHash();
break;
case 2:
verifyHash();
break;
}
return choice;

/*
* Interfata pentru calculul valorii hash
*/
private static void computeHash()
{
Console.Out.WriteLine("Introduceti un mesaj: ");
String msg = "";
try
{
msg = Console.In.ReadLine();
}
catch (IOException ioe)
{
Console.Out.WriteLine("Eroare la citire. Programul se va inchide! ");
Environment.Exit(1);
}

int[,] A = computeHamHash(msg);
printHash(A);
printHashString(A);

/*
* Interfata pentru verificarea hashului
*/
private static void verifyHash()
{
Console.Out.WriteLine("Introduceti un mesaj:");
String msg = "";
try
{
msg = Console.In.ReadLine();
}
catch (IOException ioe)
{
Console.Out.WriteLine("Eroare la citire. Programul se va inchide!");
Environment.Exit(1);
}
Console.Out.WriteLine("Enter a hash s t r i n g : ");
String hash = "";

82

try
{
hash = Console.In.ReadLine();
}
catch (IOException ioe)
{
Console.Out.WriteLine("Eroare la citire. Programul se va inchide!");
Environment.Exit(1);
}
int result = hamCheck(msg, hash);

if (result == 1)
{
Console.Out.WriteLine("Valoarea hash este valida!");
}
else
{
Console.Out.WriteLine("Valoarea hash nu este valida!");
}

/*
* Afiseaza elementele de sub diagonala principala a matricii
*/
private static void printHash(int[,] A)
{
Console.Out.Write("\nAmprenta este: ");
for (int i = 0; i < v; i++)
{
for (int j = 0; j < i; j++)
{
Console.Out.Write(A[i, j]);
}
Console.Out.WriteLine();
}
}
/*
* Afiseaza elementele de sub diagonala principala sub forma de string
*/
private static void printHashString(int[,] A)
{
Console.Out.WriteLine("\nValoarea hash este: ");
for (int i = 0; i < v; i++)
{
for (int j = 0; j < i; j++)
{
Console.Out.Write(A[i, j]);
}
}
Console.Out.WriteLine();
}
/*
* Converteste un sir de biti intr-un string hexazecimal
*/
private static String toHexString(byte[] b)
{
StringBuilder sb = new StringBuilder(b.Length * 2);
for (int i = 0; i < b.Length; i++)
{

83

sb.Append(hexChar[(b[i] & 0xf0) >> 4]);


sb.Append(hexChar[b[i] & 0x0f]);
}
return sb.ToString();
}
/*
* Converteste un sir de biti intr-un string obisnuit
*/
private static String toBinaryString(byte[] b)
{
String hex = toHexString(b);
String bin = "";
for (int i = 0; i < hex.Length; i++)
{
bin += hexDigitToBinaryString(Convert.ToChar(hex.Substring(i, 1)));
}
return bin;
}
/*
* Converteste o cifra hexazecimala intr-un string binar
*/
private static String hexDigitToBinaryString(char d)
{
switch (d)
{
case '0': return "0000";
case '1': return "0001";
case '2': return "0010";
case '3': return "0011";
case '4': return "0100";
case '5': return "0101";
case '6': return "0110";
case '7': return "0111";
case '8': return "1000";
case '9': return "1001";
case 'a': return "1010";
case 'b': return "1011";
case 'c': return "1100";
case 'd': return "1101";
case 'e': return "1110";
case 'f': return "1111";
default: return "eroare";
}
}
}

namespace RandomNumberGenerator
{
public abstract class Generator
{
public abstract bool CanReset
{
get;
}

84

public
public
public
public
public
public
public
public
public

abstract
abstract
abstract
abstract
abstract
abstract
abstract
abstract
abstract

bool Reset();
int Next();
int Next(int maxValue);
int Next(int minValue, int maxValue);
double NextDouble();
double NextDouble(double maxValue);
double NextDouble(double minValue, double maxValue);
bool NextBoolean();
void NextBytes(byte[] buffer);

public class StandardGenerator : Generator


{
private System.Random generator;
private int seed;
private int bitBuffer;
private int bitCount;
public StandardGenerator() : this(Environment.TickCount)
{
}
public StandardGenerator(int seed)
{
this.seed = Math.Abs(seed);
this.ResetGenerator();
}
private void ResetGenerator()
{
this.generator = new System.Random(this.seed);
this.bitBuffer = 0;
this.bitCount = 0;
}
public override bool CanReset
{
get
{
return true;
}
}
public override bool Reset()
{
this.ResetGenerator();
return true;
}
public override int Next()
{
return this.generator.Next();
}
public override int Next(int maxValue)
{
return this.generator.Next(maxValue);
}
public override int Next(int minValue, int maxValue)
{
return this.generator.Next(minValue, maxValue);
}

85

public override double NextDouble()


{
return this.generator.NextDouble();
}
public override double NextDouble(double maxValue)
{
if (maxValue < 0)
{
throw new ArgumentException("Valoarea maxima este negativa.");
}
return this.generator.NextDouble() * maxValue;
}
public override double NextDouble(double minValue, double maxValue)
{
if (minValue > maxValue)
{
throw new ArgumentException("Valoarea minima > valoarea maxima.");
}
double range = maxValue - minValue;
if (range == double.PositiveInfinity)
{
throw new ArgumentException("Intervalul este prea mare.");
}
}

return minValue + this.generator.NextDouble() * range;

public override bool NextBoolean()


{
if (this.bitCount == 0)
{
this.bitBuffer = this.generator.Next();
this.bitCount = 30;
return (this.bitBuffer & 0x1) == 1;
}
this.bitCount--;
return ((this.bitBuffer >>= 1) & 0x1) == 1;
}
public override void NextBytes(byte[] buffer)
{
this.generator.NextBytes(buffer);
}
}
public abstract class Distribution
{
protected Generator Generator
{
get
{
return this.generator;
}
set
{
this.generator = value;

86

private Generator generator;


public bool CanReset
{
get
{
return this.generator.CanReset;
}
}
protected Distribution() : this(new StandardGenerator())
{
}
protected Distribution(Generator generator)
{
if (generator == null)
{
throw new ArgumentException("Argumentul este vid.");
}
this.generator = generator;
}
public virtual bool Reset()
{
return this.generator.Reset();
}
public abstract double Minimum
{
get;
}
public abstract double Maximum
{
get;
}
public abstract double Mean
{
get;
}
public abstract double Median
{
get;
}
public abstract double Variance
{
get;
}
public abstract double[] Mode
{
get;
}
public abstract double NextDouble();
}

87

public class BinomialDistribution : Distribution


{
public double Alpha
{
get
{
return this.alpha;
}
set
{
if (this.IsValidAlpha(value))
{
this.alpha = value;
}
}
}
private double alpha;
public int Beta
{
get
{
return this.beta;
}
set
{
if (this.IsValidBeta(value))
{
this.beta = value;
}
}
}
private int beta;
public BinomialDistribution() : this(new StandardGenerator())
{
}
public BinomialDistribution(Generator generator)
: base(generator)
{
this.alpha = 0.5;
this.beta = 1;
}
public bool IsValidAlpha(double value)
{
return (value >= 0.0 && value <= 1.0);
}
public bool IsValidBeta(int value)
{
return value >= 0;
}
public int Next()
{
int successes = 0;
for (int i = 0; i < this.beta; i++)
{

88

if (this.Generator.NextDouble() < this.alpha)


{
successes++;
}
}
}

return successes;

public override double Minimum


{ get { return 0.0; } }
public override double Maximum
{ get { return this.beta; } }
public override double Mean
{ get { return this.alpha * this.beta; } }
public override double Median
{ get { return double.NaN; } }
public override double Variance
{ get { return this.alpha * (1.0 - this.alpha) * this.beta; } }
public override double[] Mode
{
get
{
return new double[] {Math.Floor(this.alpha * (this.beta + 1.0))};
}
}
public override double NextDouble()
{
double successes = 0.0;
for (int i = 0; i < this.beta; i++)
{
if (this.Generator.NextDouble() < this.alpha)
{
successes++;
}
}
return successes;
}
}

Bibliografie
[1] M. Naor, M. Yung, Universal One-Way Hash Functions and their Cryptographic
Applications, Proceedings of the Twenty-rst ACM Symposium on Theory of
Computing, p. 33-43, ACM Press, New York, 1989.
[2] W. Lee, D. Chang, S. Lee, S. Sung, M. Nandi, New Parallel Domain Extenders for
UOWHF, Advances in Cryptology - ASIACRYPT 03, Lecture Notes in Computer
Science 2894, p. 208-227, Springer-Verlag, Berlin, 2003.
89

[3] C. L. Liu, Introduction to Combinatorial Mathematics, McGraw-Hill, New York,


1968.
[4] R. Merkle, One Way Hash Functions and DES, Advances in Cryptology - CRYPTO
89. Lecture Notes in Computer Science 435, p. 428-446, Springer-Verlag, Berlin,
1990.
[5] U. Manber, Introduction to Algorithms. Addison-Wesley, Reading, 1989.
[6] B. Schneier, Applied Cryptography, Protocols, Algorithms, and Source Code in C,
2nd edn, John Wiley & Sons, Inc., New York, 1996.
[7] C. H. Papadimitriou, K. Steiglitz, Some Complexity Results for the Traveling
Salesman Problem, Proceedings of the 8th Annual ACM Symposium on Theory of
Computing, p. 1-9, Association for Computing Machinery, New York, 1976.
[8] H. Dobbertin, Cryptanalysis of MD5 Compress, Anun pe Internet, 1996.
[9] B. Preneel, Analysis and Design of Cryptographic Hash Functions, Tez de
Doctorat, Katholieke Universiteit Leuven, 1993.
[10] X. Wang, D. Feng, X. Lai, H. Yu, Collisions for Hash Functions MD4, MD5,
HAVAL-128 and RIPEMD, Cryptology ePrint Archive, Report 2004/199, 2004.
Vizualizat la 15.06.2011, http://eprint.iacr.org/2004/199.
[11] Random Number Generator. Wikipedia. Vizualizat la 15.06.2011,
http://en.wikipedia.org/wiki/Random number generator.
[12] V Klima, Tunnels in Hash Functions: MD5 Collisions Within a Minute, Cryptology
ePrint Archive, Report 2006/105, 2006, Vizualizat la 15.06.2011,
http://eprint.iacr.org.
[13] SHA-1 Hash Function under Pressure, Heise Security, 2006. Vizualizat la
15.06.2011, http://www.heise-security.co.uk/news/77244.
[14] Hash Function. Wikipedia. Vizualizat la 15.06.2011,
http://en.wikipedia.org/wiki/Hash function.
[15] M. R. Garey, D. S. Johnson, Computers and Intractability, a Guide to the Theory of
NP-Completeness, W. H. Freeman and Company, New York, 2000.
[16] G. Zemor, Hash Functions and Graphs with Large Girths, Advances in Cryptology EUROCRYPT 91. Lecture Notes in Computer Scienece 0547, p. 508-511. SpringerVerlag, Berlin, 1991.
[17] B. den Boer, A. Bosselaers, Collisions for the Compression Function of MD5,
Advances in Cryptology - EUROCRYPT 93. Lecture Notes in Computer Science
765, p. 293-304. Springer-Verlag, Berlin, 1994.
[18] Avalanche Effect. Wikipedia. Vizualizat la 15.06.2011,
http://en.wikipedia.org/wiki/Avalanche effect.

90

[19] F. Chabaud, A. Joux, Dierential Collisions in SHA-0, Advances in Cryptology CRYPTO 98. Lecture Notes in Computer Science 1462, p. 56. Springer-Verlag,
Berlin, 1998.
[20] Icosian Game, Wolfram Math World, 2003. Vizualizat la 15.06.2011,
http://mathworld.wolfram.com/IcosianGame.html.
[21] D. E. Knuth, The Art of Computer Programming. Vol. 1 Fundamental Algorithms,
2nd edn, Addison-Wesley Publishing Company, Reading, 1973.
[22] Maike Massierre, Provably secure cryptographic hash functions, Scientia, New
South Wales, 2006
[23] R. L. Rivest, The MD5 Message-Digest Algorithm, Request for Comments (RFC)
1321, 1992. Vizualizat la 11/12/2006, http://www.ietf.org/rfc/rfc1321.txt.
[24] R. Steinfeld, J. Pieprzyk, H. Wang, Higher Order Universal One-Way Hash
Functions from the Subset Sum Assumption, Public Key Cryptography - PCK 2006.
Lecture Notes in Computer Science 3958, p. 157-173. Springer-Verlag, Berlin, 2006.
[25] P. Sarkar, Construction of UOWHF: Tree Hashing Revisited, Cryptology ePrint
Archive, Report 2002/058, 2002. Viewed 11/12/2006, http://eprint.iacr.org/2002/058.
[26] C. Greenhill, Graph Theory Lecture Notes, UNSW, Westminster, 2006.
[27] NIST Brief Comments on Recent Cryptanalytic Attacks on Secure Hashing
Functions and the Continued Security Provided by SHA-1, NIST, 2004. Vizualizat la
15.06.2011, http://csrc.nist.gov/news-highlights/NIST-Brief-Comments-on-SHA1attack.pdf.90 References
[28] P. Erds, A. Rnyi, On Random Graphs, Publicationes Mathematicae Debrecen 6, p.
290-297, Institutul de Mathemat, Universitatea din Debrecen, Ungaria, 1959.
[29] Cryptographically Secure Pseudorandom Number Generator. Wikipedia. Vizualizat
la 06/12/2006, http://en.wikipedia.org/wiki/CSPRNG.
[30] J. Pieprzyk, Hash Functions: Provable Security versus Custom Design, ICE-EM
workshop on stream ciphers and hash functions, 2006.
[31] A. Lenstra, X. Wang, B. de Weger, Colliding X.509 Certicates, Cryptology ePrint
Archive, Report 2005/067, 2005. Vizualizat la 15.06.2011,
http://eprint.iacr.org/2005/067.
[32] D. Hong, B. Preneel, S. Lee, Higher Order Universal One-Way Hash Functions,
Advances in Cryptology - ASIACRYPT 04. Lecture Notes in Computer Science
3329, p. 201-213. Springer-Verlag, Berlin, 2004.
[33] HG400 Random Number Generators, random.com.hr, 2005. Vizualizat la
15.06.2011, http://random.com.hr/products/hg400/index.html.
[34] B. Schneier, SHA-1 Broken. Schneier on Security, 2005. Vizualizat la 15.06.2011,
http://www.schneier.com/blog/archives/2005/02/sha1 broken.html.
91

[35] P. Barreto, The Hashing Function Lounge, 2006. Vizualizat la 15.06.2011,


http://paginas.terra.com.br/informatica/paulobarreto/hflounge.html.
[36] S. Arora, The Approximability of NP-hard Problems, Proceedings of the thirtieth
annual ACM symposium on Theory of computing, p. 337-348. ACM Press, New
York, 1998.
[37] I. B. Damgrd, A Design Principle for Hash Functions, Advances in Cryptology CRYPTO 89, Lecture Notes in Computer Science 435, p. 428-446. Springer-Verlag,
Berlin, 1989.
[38] D. X. Charles, E. Z. Goren, K. E. Lauter, Cryptographic Hash Functions from
Expander Graphs, Cryptology ePrint Archive, Report 2006/021, 2006. Vizualizat la
15.06.2011, http://eprint.iacr.org/2006/021.pdf.
[39] MD5. Wikipedia, 2006. Vizualizat la 15.06.2011, http://en.wikipedia.org/wiki/Md5.
[40] S. Diffie, M. E. Hellman, New Directions in Cryptography, IEEE Transactions on
Information Theory 22(6), p. 644-654, 1976.
[41] R. Merkle, M. Hellman, Hiding Information and Signature in Trapdoor Knapsack,
IEEE Transaction on Information Theory 24(5), p. 525-530, 1978.
[42] V. Shoup, A Composition Theorem for Universal One-Way Hash Functions,
Advances in Cryptology - EUROCRYPT 00, Lecture Notes in Computer Science
1807, p. 445-452. Springer-Verlag, Berlin, 2000.
[43] Z. G. Gutin, P. Moscato, The Hamiltonian Page, 2000. Vizualizat la 15.06.2011,
http://www.densis.fee.unicamp.br/~moscato/Hamilton.html.
[44] What is MD5? Tech FAQ, Vizualizat la 15.06.2011,
http://www.techfaq.com/md5.shtml.
[45] SHA Hash Functions. Wikipedia, 2006. Viewed 09/12/2006,
http://en.wikipedia.org/wiki/Sha1.
[46] B. Schneier, New Cryptanalytic Results Against SHA-1, Schneier on Security, 2005.
Vizualizat la 15.06.2011, http://www.schneier.com/blog/archives/2005/08/new
cryptanalyt.html.
[47] R. M. Karp, Reducibility Among Combinatorial Problems. Complexity of Computer
Computations, p. 85-103. Plenum Press, New York, 1972.
[48] M. R. Garey, D. S. Johnson, The Complexity of Near-Optimal Graph Coloring,
Journal of the ACM 23(1), p. 43-49. ACM Press, New York, 1976.
[49] S. S. Skiena, The Algorithm Design Manual, Springer-Verlag, New York, 1997.
Vizualizat la 15.06.2011, http://ranau.cs.ui.ac.id/book/AlgDesignManual/
book/book/book.htm.
[50] S. A. Cook, The Complexity of Theorem Proving Procedures, Third Annual ACM
Symposium on Theory of Computing, p. 151-158. ACM, 1971.
92

[51] I. B. Damgrd, Collision Free Hash Functions and Public Key Signature Schemes,
Advances in Cryptology - EUROCRYPT 87. Lecture Notes in Computer Science
304, p. 203-216. Springer-Verlag, Berlin, 1988. 8788 References
[52] B. Rijmen, E. Oswald, Update on SHA-1, Cryptology ePrint Archive, Report
2005/010, 2005. Vizualizat la 15.06.2011, http://eprint.iacr.org/2005/010.
[53] MD5CRK, Wikipedia, Vizualizat la 15/12/2006,
http://en.wikipedia.org/wiki/MD5CRK.
[54] M. Bellare, P. Rogaway, Collision-Resistant Hashing: TowardsMaking UOWHFs
Practical, Advances in Cryptology - CRYPTO 97. Lecture Notes in Computer
Science 1294, p. 470-484, Springer-Verlag, Berlin, 1997.
[55] Subset Sum Problem. Wikipedia, Vizualizat la 15.06.2011,
http://en.wikipedia.org/wiki/Subset sum problem.
[56] T. H. Cormen, C. E. Leiserson, R. L. Rivest, Introduction to Algorithms, The MIT
Press, Cambridge, 1996.
[57] B. Preneel, The State of Cryptographic Hash Functions. Lectures on Data Security,
Lecture Notes in Computer Science 1561, p. 158-182. Springer-Verlag, Berlin, 1999.
[58] H. J. Broersma, L. Xiong, K. Yoshimoto, Toughness and Hamiltonicity in k-trees,
Memorandum No. 1576, Faculty of Mathematical Sciences, University of Twente,
2001.
[59] Secure Hashing, Computer Security Resource Center, Cryptographic Toolkit, NIST,
Vizualizat la 15.06.2011, http://csrc.nist.gov/CryptoToolkit/tkhash.html.
[60] B. Bollobas, Random Graphs, 2nd edn, Cambridge University Press, Cambridge,
2001.
[61] R. Impagliazzo, M. Naor, Ecient Cryptographic Schemes Provably as Secure as
Subset Sum, Journal of Cryptology 9, p. 199-216. Springer-Verlag, Berlin, 1996.
[62] Random Number Generation, Computer Security Resource Center, Cryptographic
Toolkit, Vizualizat la15.06.2011, http://csrc.nist.gov/CryptoToolkit/tkrng.html.
[63] M. S. Krishnamoorthy, An NP-hard Problem in Bipartite Graphs, ACM SIGACT
News 7(1), p. 26. ACM Press, New York, 1975.
[64] D. Zuckerman, On Unapproximable Versions of NP-Complete problems, SIAM
Journal on Computing 25(6), p. 1293-1304, 1996.
[65] V. Klima, Finding MD5 Collisions - a Toy for a Notebook, Cryptology ePrint
Archive, Report 2005/075. Vizualizat la 15.06.2011, http://eprint.iacr.org/2005/075.
[66] J. J. Quisquater, Cryptology and Graph Theory, UCL Crypto group. Vizualizat la
15.06.2011, http://www.win.tue.nl/diamant/symposium05/abstracts/quisquater.pdf.

93

[67] D. Eastlake, P. Jones, US Secure Hash Algorithm 1 (SHA1), Request for Comments
(RFC) 3174, 2001. Vizualizat la 15.06.2011, http://www.ietf.org/rfc/rfc3174.txt.
[68] P. Sarkar, Domain Extenders for UOWHF: A Generic Lower Bound on Key
Expansion and a Finite Binary Tree Algorithm, Cryptology ePrint Archive, Report
2003/009, 2004. Vizualizat la 15.06.2011, http://eprint.iacr.org/2003/009.
[69] P. Gauravaram, Cryptographic Hash Functions, ICE-EM workshop on stream
ciphers and hash functions, 2006.

94

S-ar putea să vă placă și