Merkle -Damgård konstruktion ( eng. Merkle-Damgård konstruktion , MD ) är en metod för att konstruera kryptografiska hashfunktioner som går ut på att dela upp ingångsmeddelanden av godtycklig längd i block med fast längd och arbeta med dem i tur och ordning med hjälp av komprimeringsfunktionen, varje gång en ingångsblock med en utgång från föregående pass.
Beskrevs första gången 1979 i doktorsavhandlingen av Ralph Merkle [1] . Merkle och Damgor visade oberoende att om kompressionsfunktionen är motståndskraftig mot kollisioner så kommer hashfunktionen också att vara stabil [2] [3] — för att bevisa strukturens stabilitet kompletteras meddelandet med ett block som kodar längden på det ursprungliga meddelandet (Merkle-Damgor härdning ).
Strukturen tillhandahåller en initialiseringsvektor - ett fast värde som beror på implementeringen av algoritmen och som appliceras på det första passet - som applicerar komprimeringsfunktionen på den och det första blocket i meddelandet. Resultatet av varje pass skickas till nästa ingång och nästa meddelandeblock; det sista blocket är utfyllt med nollor, vid behov läggs även ett block med information om längden på hela meddelandet till. För att härda hashen skickas det sista resultatet ibland genom en slutbehandlingsfunktion , som också kan användas för att minska storleken på utdatahashen genom att komprimera resultatet från den senaste applikationen till en mindre hash, eller för att säkerställa bättre bitblandning och förstärkning effekten av en liten förändring i inmatningsmeddelandet på hashen ( ge en lavineffekt ). Slutbehandlingsfunktionen byggs ofta med hjälp av komprimeringsfunktionen.
De huvudsakliga algoritmerna som implementerar Merkle-Damgor-strukturen är MD5 , SHA-1 , SHA-2- familjen .
Populariteten för Merkle- Damgor -strukturen beror på följande resultat: om en envägskompressionsfunktion är motståndskraftig mot kollisioner , kommer hashfunktionen som bygger på dess bas också att vara motståndskraftig mot kollisioner. I det här fallet har strukturen flera oönskade egenskaper:
För att skicka ett meddelande till komprimeringsfunktionen är det nödvändigt att fylla det sista blocket till fullo med vissa data (vanligtvis nollor). Till exempel, för ett meddelande " HashInput " och en blockstorlek för komprimeringsfunktionen på 8 byte (64 bitar), skulle detta resultera i 2 block:
HashInpu t0000000Men detta räcker inte, eftersom det skulle innebära att olika meddelanden som börjar med samma tecken och slutar med nollor eller andra bytes från utfyllnaden kommer in i komprimeringsfunktionen i exakt samma block, och samma hashsumma kommer att erhållas. I det här exemplet kommer " HashInput00 "-meddelandet att delas upp i samma block som det ursprungliga " HashInput "-meddelandet. För att undvika detta måste den första biten av den tillagda datan ändras. Eftersom utfyllnaden vanligtvis består av nollor måste den första biten av utfyllnaden ersättas med en "1":
HashInpu t1000000För att stärka hashen kan du lägga till längden på meddelandet i ett extra block:
HashInpu t1000000 00000009För att undvika tvetydighet måste värdet på meddelandelängden i sig vara resistent mot utfyllnad i blocket. De vanligaste implementeringarna använder en fast storlek (vanligtvis 64 eller 128 bitar i moderna algoritmer) och en fast position i slutet av det sista blocket för att koda meddelandelängdsvärdet.
Det är dock lite slösaktigt att koda ett extra block för meddelandelängden, så det finns en liten algoritmoptimering som ofta används: om det finns tillräckligt med utrymme i det sista meddelandeblocket kan meddelandelängdsvärdet läggas till det. Om du till exempel kodar meddelandelängden i 5 byte räcker det med två block, till exempel:
HashInpu t10000092006 föreslogs HAIFA - metoden , där Merkle-Damgor-strukturen är något modifierad: förutom meddelandeblocket förses varje komprimeringsfunktion med den aktuella offseten i indatafilen och eventuellt lite salt .
På grund av vissa svagheter i strukturen, särskilt problemet med att fylla ut meddelandet till önskad längd, föreslog Stefan Lux 2004 att man skulle använda en bred pipeline-hash ( wilde pipe-hash ) [8] , liknande Merkle-Damgor struktur, men med fler interna tillstånd, det vill säga bitlängden som används internt av algoritmen är större än utdata. Så det sista steget är den andra komprimeringsfunktionen, som komprimerar det sista interna hashvärdet till det slutliga värdet. SHA-224 och SHA-384 härleddes från SHA-256 respektive SHA-512 genom att tillämpa denna algoritm.