Merkle -Damgård -konstruktio ( eng. Merkle-Damgård construction , MD ) on menetelmä kryptografisten hajautusfunktioiden rakentamiseen , jossa mielivaltaisen pituiset syöttöviestit jaetaan kiinteän pituisiksi lohkoiksi ja työskennellään niiden kanssa vuorotellen käyttämällä pakkausfunktiota, joka kerta tulolohko, jossa on tulos edellisestä passista.
Kuvattiin ensimmäisen kerran vuonna 1979 Ralph Merklen väitöskirjassa [1] . Merkle ja Damgor osoittivat itsenäisesti, että jos pakkausfunktio kestää törmäyksiä , niin myös hash-funktio on vakaa [2] [3] – rakenteen vakauden todistamiseksi viestiä täydennetään lohkolla, joka koodaa alkuperäisen viestin pituus (Merkle-Damgor hardening ).
Rakenne tarjoaa alustusvektorin - kiinteän arvon, joka riippuu algoritmin toteutuksesta ja jota sovelletaan ensimmäiseen läpimenoon - soveltaen pakkausfunktiota siihen ja viestin ensimmäiseen lohkoon. Jokaisen passin tulos välitetään seuraavaan tuloon ja seuraavaan viestilohkoon; viimeinen lohko täytetään nolilla, tarvittaessa lisätään myös lohko, jossa on tiedot koko viestin pituudesta. Hashhin kovettamiseksi viimeinen tulos viedään joskus viimeistelytoiminnon läpi , jolla voidaan myös pienentää tulostettavan tiivisteen kokoa pakkaamalla viimeisen sovelluksen tulos pienemmäksi tiivisteeksi tai varmistaa parempi bittisekoitus ja -vahvistus. syöttöviestin pienen muutoksen vaikutus hajautusarvoon (antaa lumivyöryefektin ). Viimeistelytoiminto rakennetaan usein käyttämällä pakkaustoimintoa.
Merkle-Damgor-rakenteen toteuttavat pääalgoritmit ovat MD5 , SHA-1 , SHA-2- perhe .
Merkle-Damgor-rakenteen suosio johtuu seuraavasta tuloksesta: jos yksisuuntainen pakkausfunktio kestää törmäyksiä , niin sen pohjalta rakennettu hash- funktio on myös törmäyskestävä. Tässä tapauksessa rakenteella on useita ei-toivottuja ominaisuuksia:
Viestin välittämiseksi pakkaustoimintoon on tarpeen täyttää viimeinen lohko tietyillä tiedoilla (yleensä nollia). Jos esimerkiksi sanoma " HashInput " ja pakkausfunktion lohkokoko on 8 tavua (64 bittiä), tämä johtaisi 2 lohkoon:
HashInpu t0000000Mutta tämä ei riitä, sillä se tarkoittaisi, että eri viestit, jotka alkavat samoilla merkeillä ja päättyvät noloihin tai muihin tavuihin täytetystä, tulevat pakkausfunktioon täsmälleen samoissa lohkoissa ja saadaan sama hash-summa. Tässä esimerkissä " HashInput00 " -viesti jaetaan samoihin lohkoihin kuin alkuperäinen " HashInput " -viesti. Tämän välttämiseksi lisätyn tiedon ensimmäinen bitti on muutettava. Koska täyte koostuu yleensä nollia, täytön ensimmäinen bitti on korvattava "1":llä:
HashInpu t1000000Vahvistaaksesi tiivistettä voit lisätä viestin pituuden lisälohkoon:
HashInpu t1000000 00000009Epäselvyyden välttämiseksi viestin pituuden arvon on itsessään kestettävä täyttöä lohkossa. Yleisimmät toteutukset käyttävät kiinteää kokoa (yleensä 64 tai 128 bittiä nykyaikaisissa algoritmeissa) ja kiinteää sijaintia viimeisen lohkon lopussa viestin pituusarvon koodaamiseen.
Yhden ylimääräisen lohkon koodaaminen viestin pituudelle on kuitenkin hieman turhaa, joten pieni algoritmioptimointi on usein käytössä: jos viimeisessä viestilohkossa on tarpeeksi tilaa, siihen voidaan lisätä viestin pituusarvo. Jos esimerkiksi koodaat viestin pituuden 5 tavuksi, niin kaksi lohkoa riittää, esimerkiksi:
HashInpu t1000009Vuonna 2006 ehdotettiin HAIFA - lähestymistapaa , jossa Merkle-Damgor-rakennetta on hieman muokattu: sanomalohkon lisäksi jokaiseen pakkaustoimintoon syötetään syöttötiedoston nykyinen offset ja valinnaisesti suolaa .
Joidenkin rakenteen heikkouksien vuoksi, erityisesti ongelman, joka liittyy viestin täyttämiseen vaadittuun pituuteen, Stefan Lux ehdotti vuonna 2004 leveän liukuhihnan ( wilde pipe hash ) [8] käyttöä, joka on samanlainen kuin Merkle-Damgor. rakenne, mutta sillä on enemmän sisäisiä tiloja, eli algoritmin sisäisesti käyttämä bittipituus on suurempi kuin lähtö. Joten viimeinen vaihe on toinen pakkaustoiminto, joka pakkaa viimeisen sisäisen hajautusarvon lopulliseksi arvoksi. SHA-224 ja SHA-384 johdettiin SHA-256 :sta ja SHA-512 :sta , vastaavasti, käyttämällä tätä algoritmia.