Merkle -Damgård konstruktion ( eng. Merkle-Damgård konstruktion , MD ) er en metode til at konstruere kryptografiske hashfunktioner, der involverer opdeling af inputmeddelelser af vilkårlig længde i blokke af fast længde og arbejde med dem på skift ved hjælp af komprimeringsfunktionen, hver gang der tages en inputblok med et output fra det forrige gennemløb.
Først beskrevet i 1979 i doktorafhandlingen af Ralph Merkle [1] . Merkle og Damgor uafhængigt viste, at hvis kompressionsfunktionen er modstandsdygtig over for kollisioner , så vil hash-funktionen også være stabil [2] [3] — for at bevise strukturens stabilitet, er meddelelsen suppleret med en blok, der koder længden af den originale besked (Merkle-Damgor-hærdning ).
Strukturen giver en initialiseringsvektor - en fast værdi, der afhænger af implementeringen af algoritmen, og som anvendes på det første gennemløb - ved at anvende komprimeringsfunktionen til den og den første blok af meddelelsen. Resultatet af hver passage sendes til den næste input og den næste beskedblok; den sidste blok er polstret med nuller, om nødvendigt tilføjes en blok med information om længden af hele beskeden. For at hærde hashen sendes det sidste resultat nogle gange gennem en færdiggørelsesfunktion , som også kan bruges til at reducere størrelsen af output-hashen ved at komprimere resultatet af den sidste applikation til en mindre hash eller for at sikre bedre bitblanding og forstærkning effekten af en lille ændring i inputmeddelelsen på hashen (giv en lavineeffekt ). Afslutningsfunktionen er ofte bygget ved hjælp af kompressionsfunktionen.
De vigtigste algoritmer, der implementerer Merkle-Damgor-strukturen, er MD5 , SHA-1 , SHA-2- familien .
Populariteten af Merkle- Damgor -strukturen skyldes følgende resultat: Hvis en envejskompressionsfunktion er modstandsdygtig over for kollisioner , så vil hashfunktionen bygget på dens basis også være modstandsdygtig over for kollisioner. I dette tilfælde har strukturen flere uønskede egenskaber:
For at sende en besked til komprimeringsfunktionen er det nødvendigt at fylde den sidste blok med visse data (normalt nuller). For eksempel, for en besked " HashInput " og en blokstørrelse for komprimeringsfunktionen på 8 bytes (64 bits), ville dette resultere i 2 blokke:
HashInpu t0000000Men det er ikke nok, da det ville betyde, at forskellige beskeder, der starter med de samme tegn og slutter med nuller eller andre bytes fra udfyldningen, vil gå ind i komprimeringsfunktionen i nøjagtig de samme blokke, og den samme hash-sum vil blive opnået. I dette eksempel vil " HashInput00 "-meddelelsen blive opdelt i de samme blokke som den originale " HashInput "-meddelelse. For at undgå dette skal den første bit af de tilføjede data ændres. Da polstringen normalt består af nuller, skal den første bit af polstringen erstattes med et "1":
HashInpu t1000000For at styrke hashen kan du tilføje længden af beskeden i en ekstra blok:
HashInpu t1000000 00000009For at undgå tvetydighed skal værdien af meddelelseslængden i sig selv være modstandsdygtig over for udfyldning i blokken. De mest almindelige implementeringer bruger en fast størrelse (normalt 64 eller 128 bit i moderne algoritmer) og en fast position i slutningen af den sidste blok til at kode meddelelseslængdeværdien.
Det er dog lidt sløset at indkode én ekstra blok til beskedlængden, så der er en lille algoritmeoptimering, som ofte bruges: Hvis der er plads nok i den sidste beskedblok, kan beskedlængdeværdien tilføjes. Hvis du for eksempel koder meddelelseslængden i 5 bytes, er to blokke nok, for eksempel:
HashInpu t1000009I 2006 blev HAIFA - tilgangen foreslået , hvor Merkle-Damgor-strukturen er lidt ændret: Ud over meddelelsesblokken forsynes hver komprimeringsfunktion med den aktuelle offset i inputfilen og eventuelt noget salt .
På grund af nogle svagheder i strukturen, især problemet forbundet med at udfylde meddelelsen til den nødvendige længde, foreslog Stefan Lux i 2004 at bruge en bred rørlednings-hash ( pipe -hash ) [8] , svarende til Merkle-Damgor struktur, men med flere interne tilstande, det vil sige, at bitlængden, der bruges internt af algoritmen, er større end outputtet. Så det sidste trin er den anden komprimeringsfunktion, som komprimerer den sidste interne hashværdi til den endelige værdi. SHA-224 og SHA-384 blev afledt af henholdsvis SHA-256 og SHA-512 ved at anvende denne algoritme.