Вы находитесь на странице: 1из 21

Emina Domjan

Juren Jurica
Toma Mlikota

Hash funkcije
SEMINARSKI RAD

Voditelj rada:
dr. sc. Neven Vrek

Varadin, sijeanj 2006.


Sadraj

SADRAJ 2

UVOD 3

KOLIZIJA HASH SAETAKA 4

PRIMJENA HASH FUNKCIJA 5

IMPLEMENTACIJA STRUKTURA PODATAKA POMOU HASH


FUNKCIJA 7

Hash tablice 7
Izbjegavanje kolizije u hash tablicama 8

Hash liste i hash stabla 11

KRIPTOGRAFSKE HASH FUNKCIJE 12

MD5(MESSAGE-DIGEST ALGORITHM 5) 12

MD5 pseudokod 14

SHA ALGORITMI 15

SHA 1 15
Primjer SHA 1 saetaka 16
SHA-1 pseudokod 17

SHA-2 18
SHA 256 pseudokod 19

LITERATURA 21

2
Uvod
HASH funkcija ili hash algoritam je funkcija za saimanje i identificiranje podataka. Takav
saetak naziva se hash vrijednost ili jednostavno hash, a proces izraunavanja te vrijednosti
naziva se hashiranje (eng. hashing). Hash funkcije koje su injekcija i surjekcija a time i
bijekcija nazivaju se randomizirajue funkcije. Domena hash funkcija u veini sluajeva vea
je od kodomene pa nisu bijekcija (citat Wikipedia).
Osnovno svojstvo svih hash funkcija je da ako su dva izlaza dobivena istom funkcijom
razliita onda su i ulazi bili razliiti. To znai da su hash funkcije deterministike tj. za
identian ulaz dobivamo identian izlaz. Ukoliko hash funkcija nije surjekcija onda dva
identina izlaza ne podrazumijevaju identine ulaze.
Hash funkcija od ulaza varijabilne veliine vraa znakovni niz fiksne duine.

Slika: Za tri razliita ulaza dobivamo razliite izlaze koji su uvijek jednako dugi bez obzira
na duinu ulaza (izvor http://en.wikipedia.org/wiki/Hash_function)

Rije hash u engleskom jeziku znai sjeckati i mijeati (chop and mix), a hash funkcije
rade upravo to ulaz podijele na vie dijelova koje zatim mijeaju koristei razliite, paljivo
odabrane matematike operacije. Izraz je prvi put upotrijebio Peter Luhn iz IBM-a u jednom
dopisu s poetka 1953. godine. U upotrebu je uao desetak godina kasnije.

3
Kolizija hash saetaka
Kolizija predstavlja situaciju u kojoj za dva razliita ulaza hash funkcija izrauna identine
izlaze. Ta situacija posljedica je fiksne duine hash saetaka, a varijabilne duine ulaza.
Ukoliko je hash saetak uvijek iste duine ima ih ogranien broj dok ulaza ima beskonano
mnogo. Jasno je da e svakom hash saetku biti pridrueno beskonano mnogo ulaza.
Unato koliziji hash funkcije i dalje zadovoljavaju definiciju funkcije koja kae da funkcija
svakom elementu domene pridruuje jedan i samo jedan lan kodomene. Meutim takva
funkcija nije bijekcija (jedan na jedan) jer vie razliitih lanova domene ima pridruen isti
lan domene.
Potpuno izbjegavanje kolizije mogue je samo u ogranienom broju sluajeva kada su nam
unaprijed poznati ulazi u funkciju i njihov broj. Hash funkcija kod koje ne moe doi do
kolizije naziva se savrena hash funkcija.
Upitno je koliko je kolizija uistinu velik sigurnosni problem hash funkcija iz nekoliko razloga.
Kod koritenja novijih hash funkcija ni uz pomo superraunala napad nije mogue izvesti u
razumnom vremenu. Ukoliko i pronaemo koliziju primatelja kome je upuena poruka
poaljite tajne podatke o sluaju na ja_sam@yahoo.com neemo prevariti porukom
iohasfsdfopscvpb123132#$2. Te dvije poruke imaju isti saetak.
Hash funkcije bile bi ozbiljno ugroene pronalaskom algoritma kojim bi bili u mogunosti
pronai smislenu poruku koja ima isti saetak kao izvorna poruka. Primjerice primatelja koji
je trebao primiti originalnu poruku iz prethodnog primjera moemo prevariti porukom
poaljite tajne podatke o sluaju na netko_drugi@gmail.com
lkasd934m,kwet435345fh%&7u.

4
Primjena hash funkcija
Hash funkcije mogu se primijeniti u razliitim podrujima. Primjerice, jedna od
jednostavnijih primjena mogu biti digitalni testovi. Mogue ih je izvesti zahvaljujui tome to
su hash funkcije jednosmjerne, tj. nemogue je iz hash saetka izraunati ulaz. Ukoliko osobi
koja se testira poaljemo i pitanja i odgovore postoji mogunost da ta osoba doe do
odgovora. Meutim mi ispitaniku moemo poslati pitanja i hash saetke odgovora. Kada
ispitanik odgovori izrauna se hash saetak njegovog odgovora i usporedi sa hash saetkom
tonog odgovora.

Hash funkcije mogu se koristiti i za detekciju greaka pri prijenosu podataka. Poiljatelj
izrauna saetak podataka koje eli poslati, poalje ga s podacima. Kada primatelj primi
podatke te ponovo izrauna saetak i usporedi ga s dobivenim saetkom. Ukoliko se saeci
podudaraju podaci su preneseni bez greke. Ovaj nain provjere ispravnosti prijenosa
podataka naziva se i provjera s redundancijom.
Osim to uz pomo hash funkcija greke moemo detektirati, moemo ih i ispravljati. U svrhu
toga moramo barem priblino predvidjeti distribuciju moguih smetnji. Te smetnje
klasificiraju se u malo-vjerojatne i vjerojatne greke.

Hash funkcije mogu se koristiti i za identificiranje datoteka u svrhu njihovog pronalaenja ili
usporeivanja. Na ovaj se nain moe saznati samo da li su datoteke identine jer samo mala
promjena datoteke (primjerice jednog slova u tekstualnoj datoteci) uzrokuje veliku promjenu
u hash saetku.

5
Slika: primjer StrongDC klijenta koji radi u direct conect p2p mrei. Zaokrueni su saeci
datoteka uz pomo kojih se datoteke pronalaze kod ostalih korisnika u mrei.

Ova tehnika pronalaenja datoteka esto se koristi u peer to peer mreama namijenjenima
razmjeni datoteka. Datoteke u ovakvim mreama nisu odreene URL-om (Uniform Resource
Locator) koji nam govori na kojem se raunalu datoteka nalazi i koja je staza do nje ve su
odreene URN-om (Uniform Resource Name) koji datoteku identificira uz pomo njenog
sadraja. Tonije u p2p mreama koristi se magnet link (npr.
magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C).

Hash funkcije mogu se koristiti za implementaciju razliitih struktura podataka poput tablica,
lista ili stabala.

6
Implementacija struktura podataka pomou hash
funkcija

Hash tablice
Hash tablice ili hash mape su strukture podataka koje povezuju kljueve s vrijednostima.
Osnovna namjena hash tablica je uinkovito pretraivanje: za dani klju (npr. ime osobe)
pronai odgovarajuu vrijednost (npr. telefonski broj).

Slika: Primjer telefonskog imenika izvedenog pomou hash tablice


(izvor http://en.wikipedia.org/wiki/Hash_table)

Hash tablice funkcioniraju tako da transformiraju kljueve u hash saetak - broj koji se
kasnije koristi za pronalaenje traene vrijednosti.
Funkcije koje hash tablice podravaju su insert(klju, vrijednost) te lookup(klju). Funkcija
delete(klju) uglavnom je podrana. Tablice mogu podravati i usluge tipa proirivanje
tablice, pranjenje tablice i sl. Neke tablice omoguavaju da se uz jedan klju vee vie
vrijednosti.
Kljuevi mogu biti bilo to: broj, znakovni niz, objekt pa ak i reference na pohranjenu
vrijednost. Jedini uvjet je naravno da postoji hash funkcija za raunanje kljua.
Veina implementacija hash tablica nisu trajne strukture podataka tj. ne postoji nain da ih se
promijeni i da se pri tom sauva prethodno stanje tablice.

7
Hash tablice koriste se za tablice simbola (struktura podataka koju koriste kompajleri i
interpreteri), cache (skup podataka duplikata originalnih vrijednosti pohranjenih na nekom
drugom mjestu) i set (skup podataka bez odreenog redoslijeda).
Hash tablice koriste se i za implementaciju tablica premjetanja koje su praktine za ubrzanje
pretraivanja stabla igre u raunalnom ahu.

Izbjegavanje kolizije u hash tablicama


Ukoliko dva kljua imaju isti indeks odgovarajui zapisi ne mogu se spremiti na istu lokaciju.
Stoga moramo pronai drugu lokaciju gdje emo spremiti zapis te moramo biti u mogunosti
pronai tu lokaciju naknadno.
Postoji nekoliko tehnika izbjegavanja kolizije, a najee tehnike koje se koriste su
ulanavanje i otvoreno adresiranje. Jo neke tehnike izbjegavanja kolizije su savreno
hashiranje, vjerojatnostno hashiranje te spojeno hashiranje koje je kombinacija otvorenog
hashiranja i ulanavanja.

Ulanavanje
Ulanavanje je jedna od najjednostavnijih tehnika izbjegavanja kolizije u hash tablicama.
Svaka vrijednost u nizu kljueva ustvari je vezana lista umetnutih zapisa koji imaju isti klju.
Novi zapisi mogu se umetnuti na poetak ili na kraj liste.

Slika: Hash tablica realizirana ulanavanjem. Indeksi ne pokazuju direktno na elemente


tablice ve na vezane liste (izvor http://en.wikipedia.org/wiki/Hash_table)

8
Jedna od prednosti tehnike ulanavanja je jednostavno brisanje zapisa iz tablice. Pad
performansi tablice linearno je proporcionalan poveanju tablice. Primjerice, tablica koja ima
dvostruko vie zapisa od preporuenog broja u prosjeku je dvostruko sporija od iste tablice s
preporuenim brojem zapisa.
Ulanane hash tablice nasljeuju sve nedostatke vezanih listi. Kod manjeg broja zapisa veina
dodanih podataka (pokazivai na prethodni ili sljedei element u listi i sl.) moe biti znaajna.
Dodatni nedostatak je sporost pomicanja kroz listu budui da, da bi doli do odreenog
elementa u listi moramo krenuti ili s poetka ili s kraja liste.
Osim vezanih listi mogu se koristiti i neke druge strukture podataka. U sluaju da koristimo
samobalansirajue stablo, sloenost pretraivana u najgorem sluaju spustit e se s O(n) na
O(log n). Te ostale strukture podataka koriste se rijetko budui da su vezane liste uglavnom
kratke jer se rijetko dogaa veliki broj kolizija.

Otvoreno adresiranje
Kod hash tablica realiziranih otvorenim adresiranjem podaci se spremaju direktno u nizove.
Kolizija se rjeava ispipavanjem, tj. pretraivanjem kroz alternativne lokacije u nizu dok se
ne doe ili do traenog zapisa ili do praznog mjesta u nizu.

Slika: Hash tablica realizirana otvorenim adresiranjem. Zapisi s istim saecima kljueva
nalaze se u nizu, a nakon njih nalazi se prazan element.
(izvor http://en.wikipedia.org/wiki/Hash_table)

9
Neki od poznatijih redoslijeda ispipavanja su linearno ispipavanje u kojem je interval izmeu
dva traenja ne mijenja te je najee 1 te kvadratno ispipavanje u kojem se intervali izmeu
dva traenja linearno poveavaju (opisani su kvadratnom funkcijom).

Prednosti ulanavanja pred otvorenim adresiranjem su:


jednostavne su za implementirati
otvoreno adresiranje zahtjeva bolje hash funkcije kako bi se izbjeglo klasteriranje
podataka
pad performansi ne opada naglo
vezane liste ne mogu se popuniti
kod veih tablica ulanavanje zauzima manje memorijskog mjesta od otvorenog
adresiranja
ukoliko hash tablice imaju puno praznih mjesta vezane liste zauzimaju manje
memorije

Prednosti otvorenog adresiranja pred ulanavanjem su:


mogu biti uinkovitije s obzirom na zauzetu memoriju jer ne zahtijevaju dodatne
pokazivae
funkcija umetanja ne troi vrijeme za alokaciju memorije

U ovisnosti o odabranoj tehnici izbjegavanja kolizije, performanse tablice mogu nakon neke
toke poeti dramatino opadati s dodavanjem novih elemenata. Ovaj problem se rjeava tako
da se alocira nova vea tablica u trenutku kad faktor optereenja prijee zadanu granicu. Svi
podaci iz poetne tablice prebacuju se u novu tablicu. Ovaj postupak moe biti jako skup pa je
ovaj problem jedan od glavnih nedostataka hash tablica. Neke starije metode ovog postupka
kod kojih se tablica poveava za jedno mjesto u nizu pri svakom dodavanju novog elementa
mogu toliko smanjiti uinkovitost da hash tablice postanu beskorisne.

10
Hash liste i hash stabla
U raunalnoj znanosti hash lista je ustvari bilo kakva lista hash saetaka. Takve liste mogu se
koristiti za razliite svrhe, primjerice brzo pretraivanje hash tablica, u distribuiranim bazama
podataka, za ouvanje integriteta podataka, itd.
Hash liste mogu se koristiti za zatitu bilo kakvih podataka koji se prenose izmeu raunala.
Trenutno se najee koriste u p2p mreama kako bi se detektirale greke nastale prilikom
prijenosa podataka ili kako bi se otkrilo da li neki vor alje izmijenjene podatke ili lane
blokove podataka. Upravo u ovome sluaju liste hash saetaka dijelova datoteke imaju
odreene prednosti pred hash saetkom cijele poruke. Ukoliko je dolo do greke, namjerne ili
sluajne, prilikom prijenosa bloka podataka greka e se uoiti odmah. Nee biti potrebe za
prijenosom cijele datoteke ve samo bloka s grekom.
Slian koncept hash listama su hash stabla. Ona su ustvari nadogradnja na hash liste, ali se
dosta rjee koriste. Hash stabla koriste se u istim situacijama kao i hash liste.
Hash stablo je stablo hash saetaka kod kojeg su listovi hash saeci dijelova datoteke. vorovi
dalje u stablu su hash saeci njihove djece.

Slika: primjeri hash liste (a) i hash stabla (b) (izvor http://en.wikipedia.org/wiki/Hash_list i
http://en.wikipedia.org/wiki/Hash_tree)

11
Kriptografske hash funkcije
Kriptografske hash funkcije su hash funkcije kojima su dodana odreena sigurnosna svojstva
kako bi ih se moglo koristiti u razliitim sigurnosnim aplikacijama za npr. ouvanje integriteta
podataka.
Kriptografske hash funkcije trebale bi se ponaati kao randomizirajue funkcije, a trebaju
ostati deterministike i lako izraunljive. Ukoliko se moe doi do poruke iz saetaka ili
ukoliko se moe izraunati kolizija dvaju saetaka, kriptografska hash funkcija smatra se
nesigurnom. Jedna od najvanijih primjena kriptografskih hash funkcija je ouvanje
integriteta poruke. Raunanjem saetaka prije i poslije prijenosa poruke preko mree moemo
utvrditi da li je poruka mijenjana. Saetak se moe koristiti i za pouzdano identificiranje
datoteke.
Saetak se moe koristiti za autorizaciju korisnika, tj. za provjeru zaporke. Iz oitih razloga
zaporke se ne uvaju kao itak tekst ve se uva njihov saetak.
Neke od najee koritenih kriptografskih hash funkcija su:
HAVAL, MD2, MD4, MD5, N-Hash, SHA, Snefru, Tiger, Whirlpool.

MD5 (Message-Digest algorithm 5)


MD5 je dizajnirao Ronald Rivest (MIT) 1991. godine kao zamjenu za MD4.
MD5 najprije razbije poruku na 512-bitne blokove. Zadnji blok nadopuni se do 512 bitova
tako da se najprije doda 1 pa zatim 0 sve do 64 bita prije kraja bloka. Ta 64 bita predstavljaju
veliinu ulazne poruke.
MD5 algoritam najprije rauna 128 bitni izraz koji se dijeli na etiri 32 bitne rijei oznaene s
A, B, C i D. Te etiri rijei u poetku su konstante koje se ne mijenjaju. Algoritam dalje
uzima svaki 512 bitni blok te uz pomo njih mijenja 128 bitni izraz.
Procesiranje poruke sastoji se od etiri sline faze od kojih se svaka sastoji od esnaest
operacija baziranih na linearnoj funkciji F, modularnom zbrajanju te lijevoj rotaciji bitova.

Slika: linearna funkcija na kojoj se baziraju etiri faze procesiranja poruke. U svakoj fazi
koristi se po jedna od ovih funkcija (izvor: http://en.wikipedia.org/wiki/MD5)

12
1.oujka 2004. godine Jean-Luc Cooke iz CertainKey Cryptosystems-a zapoeo je projekt
pronalaenja kolizije MD5 saetaka. Projekt se izvodio distribuirano, tj. kolizija saetaka
traila se na vie raunala. Projekt je dovren u kolovozu 2004. godine, a kolizija je
pronaena.
Za pronalaenje kolizije koristio se Pollardov rho algoritam za detekciju ciklusa. Bilo koja
funkcija s konanim brojem moguih izlaza ukoliko se stavi u petlju ponaat e se cikliki.
Izlazi s odreenom strukturom koriste se kao markeri kako bi se lake detektiralo ukoliko se
neki marker ve pojavljivao. Ovi markeri nazivaju se istaknute toke, tj. toke u kojima dva
ulaza daju isti izlaz-kolizija. MD5CRK bilo koji izlaz koji je poinjao s 32 bita nula smatrao
je istaknutim tokama.

Slika: Prikaz Pollardovog rho algoritma za traenje kolizije


(izvor http://en.wikipedia.org/wiki/MD5CRK)

13
MD5 pseudokod
Pseudokod je preuzet s http://en.wikipedia.org/wiki/MD5. Napravljen je prema RFC
standardu.
//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculating
//Define r as the following
var int[64] r, k
r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}
r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}
r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}
r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}

//Use binary integer part of the sines of integers as constants:


for i from 0 to 63
k[i] := floor(abs(sin(i + 1)) 2^32)

//Initialize variables:
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476
//Pre-processing:
append "1" bit to message
append "0" bits until message length in bits 448 (mod 512)
append bit length of message as 64-bit little-endian integer to message

//Process the message in successive 512-bit chunks:


for each 512-bit chunk of message
break chunk into sixteen 32-bit little-endian words w(i), 0 i 15

//Initialize hash value for this chunk:


var int a := h0
var int b := h1
var int c := h2
var int d := h3

//Main loop:
for i from 0 to 63
if 0 i 15 then
f := (b and c) or ((not b) and d)
g := i
else if 16 i 31
f := (d and b) or ((not d) and c)
g := (5i + 1) mod 16
else if 32 i 47
f := b xor c xor d
g := (3i + 5) mod 16
else if 48 i 63
f := c xor (b or (not d))
g := (7i) mod 16

temp := d
d := c
c := b
b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b
a := temp

//Add this chunk's hash to result so far:


h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d

var int digest := h0 append h1 append h2 append h3 //(expressed as little-endian)

14
SHA algoritmi
Protokoli SHA koriste se za generiranje saetka (engl. hash) poruke. SHA se koristi kao dio
algoritma za osiguravanje neporecivosti poruke. Pomou SHA algoritma stvara se saetak
poruke koja se eli poslati nesigurnim komunikacijskim kanalom. Saetak poruke mora biti
ovisan o sadraju poruke i mora biti razliit za sline poruke. Saetak se zatim kriptira
proizvoljnim algoritmom i prenosi do primatelja nesigurnim komunikacijskim kanalom
zajedno s originalnom porukom. Na primateljevoj strani dekriptira se kriptirani saetak
poruke i zatim usporeuje sa saetkom koji nastaje kada se kriptira primljena poruka. Ako su
saeci jednaki, tada se dri da je autentinost poruke potvrena.

SHA 1
SHA-1 je hash algoritam koji se koristi za raunanje saetka poruke. Algoritam za poruku
duljine do 264 bita (216 TB) generira 160-bitni saetak. Svojstvo saetka jest da i najmanja
promjena izvorne poruke generira potpuno drugi saetak, pa se on koristi za osiguravanje
integriteta poruke. Vjerojatnost da hash funkcija za dvije razliite poruke generira isti saetak
je vrlo mala. Sloenost SHA-1 algoritma trebala bi dodatno oteati pokuaje podvale.
U prvom koraku se ulazna informacija podijeli na blokove veliine 512 bita. Na zadnji se blok
dodaje jedinica pa N nula (gdje N moe poprimiti vrijednosti iz skupa {0,511}) te 64-bitni
broj koji pokazuje veliinu originalne poruke u bitovima.
Primjerice, ako je zadnji blok 5475-bitne poruke: 1000011010101...10111 (355 bita) onda se
dodaje 1000...000xxx...x, gdje x-eva ima 64 (5475 binarno), a nula 92 (355+1+92+64=512).
Ukoliko je zadnji blok poruke vei od 447 bita, u njega ne bi stali jedinica i 64-bitni broj pa se
dodaje jo jedan 512 bitni blok (na prvi 1000...0, na drugi 0000....00xxx...x).
Algoritam koristi 80 funkcija "f" i konstanti "K" od kojih je funkcija f(t) definirana na sljedei
nain:

f(t;B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19) (u C-u: f=(B&C)|((~B)&D) )


f(t;B,C,D) = B XOR C XOR D (20 <= t <= 39)
f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59)
f(t;B,C,D) = B XOR C XOR D (60 <= t <= 79).

te konstanta K(t) prema (brojevi su u heksadecimalnom obliku):


K(t) = 5A827999 ( 0 <= t <= 19)
K(t) = 6ED9EBA1 (20 <= t <= 39)
K(t) = 8F1BBCDC (40 <= t <= 59)
K(t) = CA62C1D6 (60 <= t <= 79).

15
Slika: Digitalni potpis dobiven koritenjem SHA-1 algoritma u kombinaciji sa DSA
algoritmom za kriptiranje

Primjer SHA 1 saetaka


SHA1("The quick brown fox jumps over the lazy dog") =
"2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"
ak i mala promjena u tekstu rezultira u potpunom drugaijem izlazu, tj, hashu. Vidimo na
primjeru da promjenom jednog slova u reenici hash vrijednost u potpunosti se promijenila
odnosno ne podudara se niti u jednom znaku.
SHA1("The quick brown fox jumps over the lazy cog") =
"de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3"
Hash vrijednost za string duljine 0 bita je:
SHA1("") = "da39a3ee5e6b4b0d3255bfef95601890afd80709"

16
SHA-1 pseudokod
Pseudokod je preuzet sa http://en.wikipedia.org/wiki/SHA-1.
Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculating
Initialize variables:
h0 := 0x67452301
h1 := 0xEFCDAB89
h2 := 0x98BADCFE
h3 := 0x10325476
h4 := 0xC3D2E1F0

Pre-processing:
append a single "1" bit to message
append "0" bits until message length 448 -64 (mod 512)
append length of message (before pre-processing), in bits as 64-bit big-endian
integer to message

Process the message in successive 512-bit chunks:


break message into 512-bit chunks
for each chunk
break chunk into sixteen 32-bit big-endian words w(i), 0 i 15

Extend the sixteen 32-bit words into eighty 32-bit words:


for i from 16 to 79
w(i) := (w(i-3) xor w(i-8) xor w(i-14) xor w(i-16)) leftrotate 1
Initialize hash value for this chunk:
a := h0
b := h1
c := h2
d := h3
e := h4
Main loop:
for i from 0 to 79
if 0 i 19 then
f := (b and c) or ((not b) and d)
k := 0x5A827999
else if 20 i 39
f := b xor c xor d
k := 0x6ED9EBA1
else if 40 i 59
f := (b and c) or (b and d) or (c and d)
k := 0x8F1BBCDC
else if 60 i 79
f := b xor c xor d
k := 0xCA62C1D6

temp := (a leftrotate 5) + f + e + k + w(i)


e := d
d := c
c := b leftrotate 30
b := a
a := temp
Add this chunk's hash to result so far:
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
h4 := h4 + e

digest= hash = h0 append h1 append h2 append h3 append h4 (expressed as big-endian)


(0 i 19): f := d xor (b and (c xor d)) (alternative)
(20 i 39): f := b xor c xor d (unchanged)
(40 i 59): f := (b and c) or (d and (b or c)) (alternative 1)
(40 i 59): f := (b and c)+(d and (b xor c)) (alternative 2)
(60 i 79): f := b xor c xor d (unchanged)

17
SHA-2

Sadri u sebi pod-algoritme SHA-256, SHA-384 and SHA-512 koji daju saetak u duljini od
256, 384 i 512 bitova. Svaki od navedenih algoritama polovicu bitova koriste za izbjegavanje
kolizije.
SHA-2 algoritmi jame nam veu sigurnost od SHA-1 algoritma zbog vee duine saetka i
vie bitova za izbjegavanje kolizije
Karakteristike SHA-256 i SHA-512 algoritama
SHA-256:
koristi 32-bitne rijei0
glavna petlja se sastoji od 64 koraka
vie poetnih varijabla od SHA-1

SHA-512:
koristi 64-bitne rijei za razliku od SHA-256
glavna petlja ima 80 koraka
razliite poetne vrijednosti i konstante od SHA-256
razliiti shift i rotate amounts od SHA-256

18
SHA 256 pseudokod
Pseudokod je preuzet sa http://en.wikipedia.org/wiki/SHA_hash_functions.
//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculating
//Initialize variables:
h0 := 0x6a09e667 //232 times the square root of the first 8 primes 2..19
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

//Initialize table of round constants:


k(0..63) := //232 times the cube root of the first 64 primes 2..311
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4,
0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe,
0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f,
0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,
0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116,
0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,
0xc67178f2

//Pre-processing:
append a single "1" bit to message
append "0" bits until message length 448 -64 (mod 512)
append length of message (before pre-processing), in bits as 64-bit big-endian
integer to message

//Process the message in successive 512-bit chunks:


break message into 512-bit chunks
for each chunk
break chunk into sixteen 32-bit big-endian words w(i), 0 i 15

//Extend the sixteen 32-bit words into sixty-four 32-bit words:


for i from 16 to 63
s0 := (w(i-15) rightrotate 7) xor (w(i-15) rightrotate 18) xor (w(i-15)
rightshift 3)
s1 := (w(i-2) rightrotate 17) xor (w(i-2) rightrotate 19) xor (w(i-2)
rightshift 10)
w(i) := w(i-16) + s0 + w(i-7) + s1

//Initialize hash value for this chunk:


a := h0
b := h1
c := h2
d := h3
e := h4
f := h5
g := h6
h := h7

19
//Main loop:
for i from 0 to 63
s0 := (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
maj := (a and b) xor (b and c) xor (c and a)
t0 := s0 + maj
s1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
ch := (e and f) xor ((not e) and g)
t1 := h + s1 + ch + k(i) + w(i)

h := g
g := f
f := e
e := d + t1
d := c
c := b
b := a
a := t0 + t1

//Add this chunk's hash to result so far:


h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
h4 := h4 + e
h5 := h5 + f
h6 := h6 + g
h7 := h7 + h

//Output the final hash value (big-endian):


digest = hash = h0 append h1 append h2 append h3 append h4 append h5 append h6
append h7

20
Literatura
1. http://en.wikipedia.org/wiki/Hash_function
2. http://en.wikipedia.org/wiki/Hash_table
3. http://en.wikipedia.org/wiki/Hash_list
4. http://en.wikipedia.org/wiki/Hash_tree
5. http://www.azillionmonkeys.com/qed/hash.html
6. http://www.rsasecurity.com/rsalabs/node.asp?id=2176
7. http://burtleburtle.net/bob/hash/evahash.html
8. http://en.wikipedia.org/wiki/Cryptographic_hash_function
9. http://www.cs.rit.edu/~ark/lectures/onewayhash/onewayhash.shtml
10. http://www.unixwiz.net/techtips/iguide-crypto-hashes.html
11. http://en.wikipedia.org/wiki/MD5
12. http://en.wikipedia.org/wiki/MD5CRK
13. http://en.wikipedia.org/wiki/SHA_hash_functions
14. http://en.wikipedia.org/wiki/SHA-1
15. http://en.wikipedia.org/wiki/SHA-2

21

Вам также может понравиться