Documente Academic
Documente Profesional
Documente Cultură
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
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
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
56
.......56
................................................................... 55
.57
...... 58
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.
, i
numit mesaj, iar ieirea este un ir binar de lungime fix numit rezumatul mesajului (engl.
message digest). Aadar
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.
astfel nct
O funcie hash
un mesaj
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
, 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
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
Presupunem, de asemenea, c fiecare an are 365 de zile i toate zilele de natere sunt la fel de
probabile. Atunci
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
obinem
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
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
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.
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
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.
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 "
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
bii.
. 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
execut
(a) mparte
n cuvinte
(b) Salveaz
n ,
(c) pentru
n ,
, unde
n
execut
17
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
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
. Dup ce
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:
execut
n 16 cuvinte
(b) Pentru
(c) Salveaz
(d) pentru
, unde
fie
ca ,
ca ,
ca
as
execut
(e) Apoi incrementeaz pe fiecare din cei patru regitri cu valoarea pe care o avea nainte
de nceputul acestui bloc:
22
23
Definiie 3.1.3 (funcie hash universal ntr-o singur direcie sau FHUSD)
O funcie hash universal ntr-o singur direcie
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.
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
De exemplu, problema drumului minim poate fi formulat astfel: Fiind dat un graf G i
dou vrfuri
se vedea seciunea 5.1). O instan a acestei probleme ar fi un triplet format dintr-un anumit
graf
i dou vrfuri
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
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
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
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
cu valori n
, atunci
pentru orice
dac
. Un algoritm
de lungime n (adic irul binar al codificrii are lungimea n), algoritmul poate produce soluia
ntr-un timp cel mult egal cu
intrrii.
27
fixat, unde
care rezolv
este lungimea
Algoritmul
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
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
Soluia adesea poart numele de certificat deoarece atest faptul c instana este, ntr-adevr,
o instan a problemei date.
De exemplu, considerm problema
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
, 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
se noteaz
.
i un limbaj peste acest alfabet este
.
Astfel, mulimea tuturor instanelor
poate
lucru nu conteaz pentru c putem conveni pur i simplu ca soluia problemei pentru acele
iruri s fie 0.
Din moment ce
ca un limbaj
peste
unde
accept un ir
n cazul n care
este
i l respinge n cazul n
.
respins de ctre .
29
De observat faptul c exist o diferen subtil ntre acceptarea i deciderea unui limbaj.
Un algoritm care accept un limbaj
) nu trebuie neaprat s
pentru aceste iruri de caractere (de exemplu, s intre ntr-un ciclu infinit). Un algoritm care
decide un limbaj
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
i un ir binar
. Descriind
poate fi
ofer o soluie
poate fi,
(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
s avem
Evident, dac
atunci
oricare ar fi
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.
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
n cazul n care
, atunci
unde
este NP-dificil.
, atunci
31
este n
cu o instan a lui .
4. Dovedim c funcia
satisface
pentru orice
.
5. Dovedim c algoritmul
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
primete ca date de
bii.
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
de lungime
blocuri
bii)
cu .
unde
1. Fie mesajul
2. Fie
3. Apoi
unde
i repet
pentru
34
,
.
unde
35
. Mesajul
fiecare procesor prelucreaz cte dou blocuri la un moment dat. Procedura devine clar n
urmtoarea diagrama:
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.
(unde
de funcii
urmtorul joc:
-
ncepe: Se execut
lui
-
colizioneaz:
ruleaz cu intrrile
37
Dei aceasta este definiia unei familii de FHUSD-uri, ea este adesea numit simplu
FHUSD. Formal, informaia legat de stare reprezint ieirea lui
pentru
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.
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
care se ncepe primul pas al algoritmului, pentru ca abia apoi cheia selectat s fie transmis
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:
ce
colizioneaz: ruleaz
cu datele de intrare:
i starea generat de
Atunci cnd se analizeaz securitatea FHUSD-urilor prin intermediul acestui joc, se poate
face o generalizare simpl: adversarului
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
unde
. Fiecare
interogare poate depinde de rezultatele din interogrile anterioare (la acest aspect se refer
termenul "adaptiv").
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
39
de funcii
parametrizat de o cheie
atac
(unde
urmtorul joc:
- Eantionarea cheii: O cheie
ncepe:
pentru
, primind rspunsurile
colizioneaz:
, i
, s1 i starea generat de
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 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
definiia 4.1.1.
Securitatea unei FHUSD este definit ca fiind valoarea expresiei
timpul de execuie i
, unde
este
definiia 4.1.2.
bii, i un numr
este un ntreg pe
bii.
cu
i un numr ntreg
submulime
Condiia
urmare, adunarea modulo
n astfel nct
asigur faptul c
bii i, prin
bii.
)
cu
. Fie
definite astfel
,
unde:
-
astfel:
Teorema 4.2.3 (Impagliazzo-Naor)
Dac problema sumei submulimii
este
-dificil, atunci
42
este
unde
Steinfeld, Pieprzyk i Wang [24] au ntrit i mai mult acest rezultat artnd c
de fapt, FHUSD de ordinul , unde
este,
cu
, astfel nct
este prim,
este
, i
-dificil, atunci
este o
i de securitate
, iar
reprezint timpul
bii de
securitate.
Funciile din
genereaz 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
blocuri, primul pe
n continuare, presupunem c
Definiie 4.2.5 (
Fie
bii.
)
unde
un mesaj oarecare i
cu
iar
43
. Fie
.
care realizeaz
urmtoarele operaii:
1.mparte
ntr-un bloc pe
bii
blocuri pe
bii
.
2. Pentru
, calculeaz
3. Returneaz
este o FHUSD
de ordinul , pentru
concluzia c familia
. 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
pentru fiecare bloc al mesajului. Acest fapt duce la un compromis ntre lungimea mesajului i
securitate. De asemenea, din moment ce
presupune
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
bii.
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
, unde
, numite muchii,
sunt finite),
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.
46
de dimensiune
dac
. De exemplu,
un graf. Un nod
, are gradul
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:
este o secven
oricare ar fi
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
este planar, cubic, 3-conectat, i nu are nicio fa cu mai puin de 5 muchii [48]
dac
dac
nu are niciun
, 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
unde
. Aadar
, fiecare graf
reprezint spaiul
noduri.
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
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
Graf
HH(M)
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:
-
. Cu alte
cu
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
i are elemente.
Deoarece
poate fi unic reprezentat prin triunghiul de sub diagonala principal a lui A, notat
.
confuzie,
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
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
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,
, n graful cu nodurile
. 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,
unde:
52
n timp ce pentru
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
sunt
al
, argumentul funciei
. Tot ce rmne de
(n care
. Prin urmare
, adic
, iar
, deci mulimea
poate fi
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
53
pentru
pentru j
Elementele
valoarea lui
iar
pentru a determina
o list indexat
deja utilizate. Pe msur ce sunt folosite, elementele sunt eliminate din list.
Algoritmul funcioneaz astfel:
pentru
(pas -1)
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:
unde
2. Adaug la
muchiile ciclului
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
, 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
dect s
56
Fie
trunchiaz mesajul M la
bii. Aadar
numrul
Funcia
, care reprezint
.
de
generare
ciclului
calculeaz
apoi
al
1365-lea
ciclu
57
Cu alte cuvinte
. Fie
pentru mesajul
. Aadar
Observm c
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
58
se afl n graful
. Funcia de verificare
Cu alte cuvinte,
Relaia
se gsete n graful
unde
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
astfel nct
, astfel nct
, astfel nct
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
i, prin urmare,
, gsete
.
Cu alte cuvinte, putem defini un algoritm
.
i ca date de ieire
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
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
Avem
60
, astfel nct
, astfel nct
astfel nct
. Ca la demonstraia
dat,
este
astfel nct
oricare ar fi
. Aadar
echivalente.
Teorema 5.3.7 (rezistena la coliziuni a algoritmului HH)
Funcia hash
rezistent la coliziuni.
Demonstraie. Presupunem c
, astfel nct:
i
, astfel nct
, deci funcia de
, astfel nct
61
, astfel nct
, prin urmare,
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
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 ?
din moment ce
fixeaz
(a se vedea
, atunci
fel de probabile?"
Rspunsul imediat la prima ntrebare este "nu".
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
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
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
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
, 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
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
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
, 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
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
generai n mai puin de o milisecund. Prin urmare, funcia de generare a grafului este, de
asemenea, eficient.
n concluzie ntregul algoritm
este
lanseze un atac prin for brut, pentru a gsi o preimagine pentru un anumit hash
Deoarece exist
65
, i
dintre
mesaje pentru
astfel
nct
Deoarece
noduri
genereze
cel
puin
bii
de
securitate.
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
ale acestora. Dac fiierul este compromis de ctre un atacator, acesta nu are acces la parole
deoarece funcia hash
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
argumente suplimentare sunt ignorate. Dac este dat un singur argument, atunci
este setat la
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
*/
*/
/*
* 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))); }
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;
}
return output;
/*
71
a
b
c
d
= 1732584193;
= -271733879;
= -1732584194;
= 271733878;
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);
}
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
{ return rstr2hex(rstr_sha1(str2rstr_utf8(s))); }
function b64_sha1(s)
{ return rstr2b64(rstr_sha1(str2rstr_utf8(s))); }
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;
}
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
*/
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);
/*
* 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++;
}
}
/*
* 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
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);
85
86
87
88
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
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
[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