Hes funkcije

Hes funkcije ulaz promenljive duzine transformisu u izlaz fiksne duzine i imaju sledece osobine:

Primeri hes funkcija (informativno):

rodjendanski paradoks (zasto nam treba hes od bar 160b)

Gde se koristi:

Digitalni potpisi

Racuna se hes poruke, sifruje privatnim kljucem tako se dobije potpis, salje se poruka i potpis. Da proverimo potpis hesiramo poruku i proverimo da li su hes, potpis i javni kljuc povezani na odgovarajuci nacin.

Comitment sema

Kriptografski mehanizam u kom se osobi A omogucava da izabere element iz nekog skupa, tako da osoba B ne moze saznati sta je osoba A izabrala pre nego sto osoba A otkrije to, dok osoba A ne moze promeniti svoj izbor. Primer: bacanje novcica preko telefona, ako padne glava osoba A je zaduzena za nesto, inace je to posao osobe B, onaj ko je zaduzen za bacanje novcica moze reci ono sta njemu odgovara. Ovaj problem se resava tako sto jedna osoba baci novcic i obaveze se na taj ishod(posalje maskiran ishod), druga osoba odredi sta se desava u kom slucaju, prva osoba otkrije ishod bacanja. Ovako niko ne moze da vara. Obavezivanje se vrsi hesiranjem sa dodatim saltom. Otkrivanje se vrsi tako sto se posalje salt i izbor drugoj strani, a ona izracuna hes i proveri.

HMAC (Hash-based Message Authentication Code)

HMAC omogucava da svi koji imaju kljuc mogu da provere da li je poruka promenjena i da li je poruku poslao neko ko ima kljuc.

Razlika izmedju HMAC i digitalnog potpisa?

prva ideja: H(K || M) - hesiraj podatak koji dobijes kada na kljuc nadovezes poruku - problem sa hesevima koji su konstruisani Merkle Damgard konstrukcijom(kompresione funkcije) (moze se generisati nova poruka sa novim HMAC i da medjusobno odgovaraju bez da se zna kljuc)

koristi se: H((Kopad)||H((Kipad)||M)), opad i ipad su unapred definisane konstante (obicno 0x36 i 0x5c ponovljene dovoljan broj puta) ovo sprecava gore pomenuti problem

HMAC se dosta koristi, ali u modernijim implementacijama se sve vise prelazi na AEAD(Authenticated Encryption with Associated Data)

AEAD omogucava sifrovanje zajedno sa generisanjem MAC koda za poruku, dodatno omogucava da neki deo poruke ne bude sifrovan, ali da utice na sifrovan deo porike. Na primer kada se salje pismo postom, sadrzaj koji je u koverti je 'sifrovan', dok tekst na samoj koverti nije sifrovan. Slicna situacija je sa mrezom, sadrzaj poruke je sifrovan, ali deo poruke koji cuva kome je namenjena ne sme biti sifrovan, inace poruka nikad nece stici na zeljenom mestu. 

Decentralizovane hes mape (DHT) - informativno

Kljuc se hesira -> id

id -> odredjuje cvor/grupu cvorova koji su zaduzeni za podatak

tom cvoru trazimo podatak ili izmenu podatka

Najbitnije osobine: nema centralni server, dobro skalira

Primer: bittorent, distribuirane baze podataka…

bittorent uprosceno: pitam DHT mrezu ko ima ima podatak o peer-ovima za neki fajl, njega pitam za ip adrese, i krecem skidanje fajla

Blockchain

Ostavlja se za treci deo kursa

Merkle tree

Sta je merkle tree?

                         ┌─────────────────────────┐
                         │      Merkle Root        │
                         │   H(H12 || H34) = R     │
                         └───────────┬─────────────┘
                                     │
                ┌────────────────────┴────────────────────┐
                │                                         │
        ┌───────┴────────┐                       ┌────────┴────────┐
        │      H12       │                       │       H34       │
        │  H(H1 || H2)   │                       │   H(H3 || H4)   │
        └───────┬────────┘                       └────────┬────────┘
                │                                         │
        ┌───────┴───────┐                         ┌───────┴───────┐
        │       H1      │                         │       H3      │
        │   hash(Tx1)   │                         │   hash(Tx3)   │
        └───────────────┘                         └───────────────┘
        ┌───────────────┐                         ┌───────────────┐
        │       H2      │                         │       H4      │
        │   hash(Tx2)   │                         │   hash(Tx4)   │
        └───────────────┘                         └───────────────┘

Merkle stablo je hijerarhijska struktura zasnovana na heš funkcijama koja omogućava efikasnu i sigurnu proveru integriteta velikih skupova podataka.

Listovi su hesevi podataka, svaki unutrasnji cvor sadrzi hes svoje ‘dece’, koren sadrzi hes kombinaciju svih podataka u strukturi, samim tim predstavlja sve podatke u strukturi. Promena bilo kog podatka menja koren stabla.

Gde mogu da iskoristim Merkle stabla: da uporedim sta se promenilo u nekom skupu fajlova, da pokazem da je neki podatak u skupu …

primer sa gitom: unutar gita se cuva neka slicna stuktura Merkle stablu, sadrzaj fajla je list, sadrzaj foldera je spisak (imena fajla, prava i sadrzaj fajla,…) pravi se hijerarhija, commit je koreni hes svih podataka.

Verifikacija fajlova

Vlasnik fajla prilikom postavljanja fajla na internet postavi checksum, kada skinemo fajl izracunamo checksum rucno i proverimo da li se dobije isti rezultat

KDF (Key Derivation Function)

Koristi se da se od slabih lozinki napravi kriptografski kljuc (intuitivno: lozinka koja je “jaka” i precizno definisana (nepredvidiv, dovoljno dug, uniforman))

Razmena kljuca DH-protokolom -> ga ⋅ b je zajednicka tajna, ovo nije dovoljno nasumicno da bude jak kriptografski kljuc - neki bitovi su verovatniji od drugih -> koristi se KDF da se od tajne napravi kljuc/kljucevi za simetricni sifarski sistem.

KDF rade na razlicite nacine, recimo jedan prost je lozinka+salt se hesira n puta (u ovom slucaju u bazi se cuva podatak salt, n i koji algoritam za hesiranje se koristi)

Sta se dobija koriscenjem KDF: