Ceea ce este o funcție a hashingului. Funcții criptografice hash

Algoritmii de căutare pe care l-am luat în considerare se bazează, de obicei, pe o operațiune de comparație abstractă. Din această serie, metoda de distribuție descrisă în "tabelele de simboluri și arborii de căutare binară", care este stocată în poziția I a tabelului, ceea ce vă permite să vă referiți direct. Cu distribuirea de căutare, cheile sunt utilizate ca un indice de matrice și nu operanții operațiunii de comparație; Metoda în sine se bazează pe faptul că cheile sunt numere întregi diferite din aceeași gamă ca și indicii de masă. În acest capitol, vom analiza hashing (hashing) - o versiune extinsă a căutării de distribuție, utilizată în aplicații de căutare mai tipice, unde cheile nu au proprietăți atât de convenabile. Rezultatul final al cererii această abordare Nu este absolut similară cu metodele bazate pe comparație - în loc să se deplaseze prin intermediul structurilor de date dicționarului prin compararea cheilor de căutare cheie în elemente, încercăm să ne referim la elementele din tabel direct prin efectuarea unei conversii aritmetice la adresele de masă.

Algoritmii de căutare utilizând hashing constau din două părți separate. Primul pas este de a calcula funcția hash (funcția hash), care convertește cheia de căutare la masă. În mod ideal, tastele diferite ar trebui să fie afișate pe diverse adrese, dar adesea două sau mai multe taste diferite pot da aceeași adresă în tabel. Prin urmare, a doua parte a căutării prin metoda de hash este procesul de rezolvare a coliziunilor (rezoluția de coliziune), care procesează astfel de chei. Într-una dintre metodele de rezolvare a conflictelor, pe care le vom lua în considerare în acest capitol, sunt utilizate liste conectate, deci găsește o utilizare directă în situații dinamice atunci când este dificil să pre-prezice numărul de chei de căutare. În alte două metode de rezolvare a coliziunilor, foarte realizate performanţă Căutați, deoarece elementele sunt stocate într-o matrice fixă. Vom lua în considerare metoda de îmbunătățire a acestor metode, permițându-vă să le utilizați și în cazurile în care este imposibil să prezicem dimensiunea tabelului în avans.

Hashing este un bun exemplu de echilibru între timp și memorie. Dacă nu au existat restricții privind cantitatea de memorie utilizată, orice căutare ar putea fi efectuată utilizând doar un singur acces de memorie, pur și simplu folosind tasta ca o adresă de memorie, ca și în cazul distribuirii căutării. Cu toate acestea, acest caz ideal este, de obicei, dehidratabil, deoarece cheile lungi pot necesita o cantitate imensă de memorie. Pe de altă parte, dacă nu au existat restricții perioada de grație, Ar fi posibil să faceți cu memoria minimă, utilizând metoda de căutare secvențială. Hashingul este o modalitate de a utiliza un volum acceptabil atât de memorie, cât și de timp și să atingă un echilibru între aceste două cerințe extreme. În special, puteți susține orice echilibru, pur și simplu schimbând dimensiunea tabelului și nu rescrieți codul și fără a alege alți algoritmi.

Hashing este una dintre sarcinile clasice ale științei informatice: diferitele sale algoritmi sunt studiate în detaliu și sunt utilizate pe scară largă. Vom vedea că, deloc, nu există ipoteze dure, puteți spera pentru a sprijini operațiunile de a găsi și lipi în tabele de simbol cu \u200b\u200bun timp de execuție constantă, indiferent de dimensiunea tabelului.

Această valoare așteptată este performanța teoretică optimă pentru orice implementare a tabelului de simbol, dar hash nu este încă un panaceu pentru două motive principale. In primul rand, perioada de grație Depinde de lungimea cheii, care în aplicațiile reale folosind taste lungi poate fi semnificativă. În al doilea rând, Hashing nu oferă implementarea eficientă a altor operațiuni cu tabele de simboluri, cum ar fi alegerea sau sortarea. În acest capitol, vom lua în considerare în detaliu aceste întrebări și alte întrebări.

Funcția hash.

În primul rând, este necesar să rezolvăm sarcina de a calcula funcția hash care convertește cheile la adresa tabelului. În mod tipic, punerea în aplicare a acestui calcul aritmetic nu reprezintă complexitatea, dar este încă necesar să respectați îngrijirea, astfel încât să nu fugi în diferite capcane provocatoare. Dacă există un tabel care poate conține elemente M, aveți nevoie de o funcție care convertește cheile la întregi în intervalul. Funcția ideală hash ar trebui să fie ușor de calculat și să fie similar cu o funcție aleatorie: pentru orice argumente, rezultatele într-un sens ar trebui să fie echivalente.

Funcția hash depinde de tipul de cheie. Strict vorbind, o funcție separată hash necesită un tip de cheie separat. Pentru a crește eficiența, este de obicei de dorit să se evite conversia explicită a tipurilor, contactarea ideii de examinare a prezentării binare a cheilor în cuvântul mașinii ca întreg care poate fi utilizat în calculele aritmetice. Hashing a apărut înainte ca limbile de nivel înalt - pe calculatoarele timpurii a fost că problema obișnuită să ia în considerare orice valoare ca o cheie de șir, apoi ca un număr întreg. În unele limbi la nivel înalt, este dificil să se creeze programe care depind de prezentarea cheilor într-un anumit computer, deoarece astfel de programe sunt, în esență, dependente de mașină și, prin urmare, sunt dificil de transferat la un alt computer. În mod obișnuit, funcțiile HASH depind de procesul cheie de conversie în numere întregi, deci este dificil să se ofere simultan independența și eficiența mașinii în implementările hashingului. De regulă, tastele simple întregi sau tastele de tip plutitoare pot fi convertite folosind o singură operație a mașinii, dar tastele de șir și alte tipuri de taste compuse necesită costuri ridicate și mai multă atenție la eficiență.

Probabil cea mai simplă situație este atunci când cheile sunt numere cu un punct plutitor dintr-o gamă fixă. De exemplu, dacă cheile sunt numere, mari 0 și mai mici 1, poate fi pur și simplu multiplicată cu m, rotunjind rezultatul într-un număr mai mic și obțineți adresa în intervalul între 0 și M - 1; Acest exemplu este prezentat în fig. 14.1. Dacă cheile sunt mai mari decât s și mai puțin de T, ele pot fi scalate, deducând și împărțite pe TS, ca urmare a cărora aceștia se încadrează în gama de valori între 0 și 1 și apoi se multiplică la M și apoi adresa din tabel.


Smochin. 14.1.

Pentru a converti numericele cu un punct plutitor în intervalul de la 0 și 1 la indiciul tabelului, a căror dimensiune este 97, înmulțind aceste numere cu 97. În acest exemplu, au avut loc trei conflicte: pentru indicii egali cu 17, 53 și 76. Valorile HASH sunt determinate de evacuările cheie ale bătrânilor, deversările mai tinere nu joacă nici un rol. Unul dintre obiectivele dezvoltării unei funcții hash este eliminarea unui astfel de dezechilibru, astfel încât fiecare descărcare să fie luată în considerare în timpul calculului.

Dacă cheile sunt numere întregi W-Bit, ele pot fi convertite într-un număr de puncte plutitoare și împărțite la 2 W pentru a obține un număr de puncte plutitoare în intervalul între 0 și 1 și apoi se multiplică la M, ca în paragraful anterior. Dacă operațiile de la punctul de plutire ocupă o mulțime de timp, iar numerele nu sunt atât de mari pentru a duce la overflow, același rezultat poate fi obținut utilizând operații aritmetice întregi: trebuie să multiplicați cheia la M, și apoi să efectuați trecerea la Chiar pe descărcările W pentru a împărți 2 W (sau, în cazul în care multiplicarea duce la overflow, schimbare și apoi multiplicare). Astfel de metode sunt inutile pentru hash, cu excepția cazului în care cheile sunt distribuite uniform de către interval, deoarece valoarea hash este determinată numai de cifrele de lider ale cheii.

Mai simplu I. metoda eficientă. Pentru numerele întregi W-Bit - una dintre metodele cele mai frecvent utilizate de hashing - o alegere ca o masă M dimensionată a unui număr simplu și calculul reziduului de împărțirea la M, adică h (k) \u003d k mod m pentru orice cheie întregă K. Această funcție se numește funcție modulară hash. Este foarte ușor de calculat (k% m în C ++) și este eficient pentru a obține o distribuție uniformă a valorilor cheie între valorile mai mici M. Un exemplu mic este prezentat în fig. 14.2.


Smochin. 14.2.

În cele trei coloane dreapta, rezultatul tastelor pe 7 biți afișate în stânga este arătat folosind următoarele funcții:

v% 97 (stânga)

v% 100 (centrul) și

(int) (a * v)% 100 (dreapta),

unde a \u003d .618033. Dimensiunile tabelului pentru aceste funcții sunt respectiv 97, 100 și 100. Valorile arată aleator (deoarece cheile sunt aleatoare). A doua funcție (V% 100) utilizează doar două cifre extreme extreme de chei și, prin urmare, pentru chei non-aleatoriu pot prezenta performanțe scăzute.

Hashingul modular se aplică tastelor punctului plutitor. Dacă cheile aparțin unei game mici, ele pot fi scalate în numere din intervalul între 0 și 1, 2 W pentru a obține valori întregi W-BIT, apoi utilizați funcția modulară hash. O altă opțiune este să utilizați pur și simplu o prezentare binară binară (dacă este disponibilă).

Hashingul modular este aplicat în toate cazurile în care accesul la biți din care constau, indiferent dacă sunt numite întregi reprezentate de cuvântul mașinii, secvența de simboluri ambalate în cuvântul mașinii sau sunt reprezentate de oricare altul opțiune posibilă. Secvența simbolurilor aleatorii ambalate în cuvântul mașinii nu este exact aceeași ca și tastele aleatoare, deoarece nu toate evacuările sunt utilizate pentru codare. Dar ambele tipuri (și orice alt tip de cheie codificat în așa fel încât să se potrivească în cuvântul mașinii) pot fi făcute pentru a arăta ca indicii aleatorii într-o masă mică.

Principalul motiv pentru selectare ca un tabel de dimensiune M Hash a unui număr simplu pentru hashing modular este prezentat în fig. 14.3. În acest exemplu, datele simbolice cu codare pe 7 biți, cheia este interpretată ca un număr cu o bază 128 - cu o singură cifră pentru fiecare caracter din cheie. Acum, cuvântul corespunde numărului 1816567, care poate fi, de asemenea, scris ca

deoarece simbolurile codului ASCII N, O și W corespund numerelor 1568 \u003d 110, 1578 \u003d 111 și 1678 \u003d 119. Dimensiunea tabelului M \u003d 64 pentru acest tip de cheie este nereușită, deoarece adăugarea la valori x, mai multe 64 (sau 128), nu modifică valoarea x mod 64 - Pentru orice tastă, valoarea funcției hash este Valoarea ultimelor 6 cifre ale acestei cheii. Desigur, o funcție bună a hash trebuie să ia în considerare toate evacuările cheie, în special pentru cheile simbolice. Situații similare pot apărea atunci când M conține un multiplicator, care este un grad 2. Cel mai simplu mod Evitați acest lucru - alegeți ca un număr simplu.


Smochin. 14.3.

În fiecare rând din acest tabel, sunteți: Cuvântul de 3 litere, prezentarea acestui cuvânt în codul ASCII ca număr de 21 de biți în formele octanice și zecimale și funcții standard modulare modulare pentru dimensiunile tabelelor 64 și 31 (două Coloana extremă din dreapta). Dimensiunea tabelului 64 duce la rezultate nedorite, deoarece numai descărcările principale din dreapta sunt utilizate pentru a obține o valoare hash, iar literele din cuvintele limbajului obișnuit sunt distribuite inegal. De exemplu, toate cuvintele dotate cu litera Y corespunde valorii hash 57. Și, dimpotrivă, o valoare simplă de 31 determină mai puține conflicte în tabel mai mult de două ori mai mici.

Hashingul modular este foarte ușor de implementat, cu excepția faptului că dimensiunea tabelului trebuie să fie un număr simplu. Pentru unele aplicații, puteți fi mulțumit cu un mic număr simplu sau căutarea în lista numerelor primare celebre, astfel încât acestea sunt aproape de dimensiunea dorită a tabelului. De exemplu, numerele sunt de 2 T - 1, sunt simple t \u003d 2, 3, 5, 7, 13, 17, 19 și 31 (și fără alte valori t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не singurul motivpe care merită mărimea tabelului de a face un număr simplu; Un alt motiv este luat în considerare în secțiunea 14.4.


Smochin. 14.4.

Acest tabel este cel mai mare număr simplu mai mic de 2 n, pentru Poate fi utilizat pentru distribuirea dinamică a tabelului hash atunci când este necesar ca dimensiunea tabelului să fie un număr simplu. Pentru orice valoare pozitivă dată în gama acoperită, acest tabel poate fi utilizat pentru a determina un număr simplu care diferă de mai puțin de 2 ori.

O altă formă de realizare a cheilor întregi este o combinație de metode multiplicative și modulare: trebuie să multiplicați cheia la constantă în intervalul între 0 și 1, apoi faceți divizarea după modul M. Cu alte cuvinte, trebuie să utilizați funcția. Între valorile, M și baza efectivă a sistemului numeric cheie, există o relație care ar putea duce teoretic la un comportament anormal, dar dacă utilizați o valoare arbitrară A, în anexă reală Este puțin probabil să aveți nici o problemă. Adesea, ca A, valoarea F \u003d 0,618033 ... (secțiunea de aur) este selectată.

Multe alte variații au fost studiate pe acest subiect, în special, funcții hash care pot fi implementate folosind astfel de instrucțiuni eficiente de mașină, cum ar fi o selecție de schimbare și mască (a se vedea link-urile).

În multe aplicații care utilizează tabele de simbol, cheile nu sunt numere și nu sunt neapărat scurte; Mai des sunt linii alfanumerice care pot fi foarte lungi. Cum de a calcula funcția hash pentru un cuvânt ca Averylongkey?

În codul ASCII pe 7 biți, acest cuvânt corespunde numărului de 84 biți \\ BEG (ALIGN *) 97 \\ CDOT 128 ^ (11) & + (10) + 101 \\ CDOT 128 ^ (9) + 114 \\ CDOT 128 ^ (8) + 121 \\ CDOT 128 ^ (7) \\\\ & + 108 \\ CDOT 128 ^ (6) + 111 \\ CDOT 128 ^ (5) + 110 \\ CDOT 128 ^ (4) + 103 \\ CDOT 128 ^ (3) \\\\ & + 107 \\ CDOT 128 ^ (2) + 101 \\ CDOT 128 ^ (1) + 121 \\ CDOT 128 ^ (0), \\ capătul (align *),

care este prea mare, astfel încât funcțiile aritmetice obișnuite să poată fi efectuate cu aceasta în majoritatea computerelor. Și de multe ori este necesar să se ocupe și mai mult chei mai lungi.

Pentru a calcula funcția hash modulară pentru tastele lungi, ele sunt transformate într-un fragment pe fragment. Puteți utiliza proprietățile aritmetice ale funcției modulului și utilizați algoritmul Gorner (vezi pct. 4.9 "Tipuri de date abstracte"). Această metodă se bazează pe o altă metodă de înregistrare a numerelor corespunzătoare tastelor. Pentru exemplul examinat, scriem următoarea expresie: \\ Începeți (align *) (((((((((97 \\ cdot 128 ^ (11) & + 118) \\ cdot 128 ^ (10) + 101) \\ CDOT 128 ^ (9) + 114) \\ CDOT 128 ^ (8) + 121) \\ CDOT 128 ^ (7) \\\\ & + 108) \\ CDOT 128 ^ (6) + 111) \\ CDOT 128 ^ (5) + 110) \\ CDOT 128 ^ (4) + 103) \\ CDOT 128 ^ (3) \\\\ & + 107) \\ CDOT 128 ^ (2) + 101) \\ cdot 128 ^ (1) + 121. \\ capătul (aliniați *)

Aceasta este, un număr zecimal corespunzător codificării caracterelor șirului poate fi calculat atunci când este văzut de la stânga la dreapta, înmulțirea valorii acumulate la 128 și apoi adăugând valoarea codului următorului simbol. În cazul unui șir lung, această metodă de calcul va duce în cele din urmă la unul mare care poate fi trimis deloc în computer. Cu toate acestea, acest număr nu este necesar deoarece numai reziduul (mic) este necesar de la divizia sa pe M. Rezultatul poate fi obținut, fără a păstra chiar valoarea acumulată, deoarece În orice moment, calculul poate fi aruncat de o multiplă M - de fiecare dată când efectuați multiplicare și adăugare, este necesar să se păstreze numai reziduul din modulul Division M. Rezultatul va fi același ca și cum am avea capacitatea de a calcula Un număr lung și apoi efectuați divizia (vezi. Exercițiul 14.10). Această observație duce la o metodă aritmetică directă pentru calcularea funcțiilor modulare hash pentru linii lungi - a se vedea programul 14.1. Acest program utilizează altul, ultimul tricot: în loc de baza 128, utilizează un număr simplu 127. Motivul acestei modificări este luat în considerare în paragraful următor.

Există multe modalități de a calcula funcțiile hash aproximativ cu aceleași costuri ca și pentru hash-ul modular folosind metoda Gorner (una sau două operatii aritmetice Pentru fiecare simbol din cheie). Pentru chei aleatoare, aceste metode nu sunt practic diferite unul de celălalt, dar cheile reale sunt rareori aleatoare. Posibilitatea de a costa costuri reduse pentru a oferi tastelor reale de tip aleatoriu duce la luarea în considerare a algoritmilor randomizați, deoarece avem nevoie de funcții hash care creează indici aleator de tabelă, indiferent de distribuția cheie. Nu este dificil să se organizeze randomizarea, deoarece nu este necesar să adere literalmente la definirea hashingului modular - este necesar numai pentru a calcula un număr întreg de M mai mici, toate descărcările cheie au fost utilizate.

M \u003d 96 și A \u003d 128 (în partea de sus)

M \u003d 97 și A \u003d 128 (centru) și

M \u003d 96 și A \u003d 127 (de mai jos)

Distribuția inegală în primul caz este rezultatul utilizării inegale a literelor și a conservării neuniformității datorită faptului că dimensiunea tabelului și multiplicatorul multiplicatorului 32. Alte exemple arată aleator, deoarece dimensiunea tabelului și multiplicatorul sunt numere simple.

Programul 14.1 prezintă una dintre modalitățile de a face acest lucru: folosind o bază simplă în loc de gradul 2 și un număr întreg corespunzător reprezentării ASCII a șirului. În fig. 14.5 Fig. 14.5 Se arată cum această schimbare îmbunătățește distribuția pentru tastele tipice de șir. Valorile teoretic hash create de Programul 14.1 pot da rezultate proaste pentru dimensiunile mesei care sunt multiple 127 (deși în practică este probabil să fie aproape imperceptibilă); Pentru a crea un algoritm randomizat, ar fi posibil să alegeți valoarea multiplicatorului la întâmplare. O abordare și mai eficientă este de a utiliza valori aleatorii ale coeficienților în calcul și diverse valori aleatorii pentru fiecare număr cheie. Această abordare dă un algoritm randomizat numit Hash Hash (Hashing universal).

Teoretic, funcția ideală universală Hash este o funcție pentru care probabilitatea unei coliziuni între două taste diferite într-o masă cu dimensiune M este exact egală cu 1 / m. Se poate demonstra că utilizarea ca un coeficient A din program 14.1 nu este o valoare arbitrară fixă, iar secvențele de valori aleatorie diferite convertește hashingul modular într-o funcție hash universală. Cu toate acestea, costul de generare a unui nou număr aleatoriu pentru fiecare simbol din cheie este de obicei inacceptabil. În practică, este posibil să se realizeze un compromis prezentat în program 14.1, fără a păstra o serie de numere aleatoare diferite pentru fiecare simbol cheie și variația coeficienților care utilizează generarea unei secvențe simple pseudo-aleatoare.

Vom rezuma: Pentru a implementa o masă de caractere abstractă pentru a utiliza hashing, trebuie mai întâi să extindeți interfața de tip abstract, rozându-l pe operația Hash, care afișează tastele la numerele ne-negative, dimensiunea mai mică a tabelului M.

Ca parte a acestui articol, vă voi spune ce este hash.De ce este necesar, unde și cum este folosit, precum și cele mai cunoscute exemple.

Multe provocări din domeniul tehnologiilor informaționale sunt foarte critice pentru volumele de date. De exemplu, dacă trebuie să comparați două fișiere cu o dimensiune de 1 KB și două fișiere de 10 GB, atunci este complet diferit. Prin urmare, algoritmi care permit operarea cu valori mai scurte și capace sunt considerate foarte populare.

Un astfel de tehnologii este hashing, care și-a găsit utilizarea la soluționarea masei de sarcini. Dar, cred că tu, ca utilizator obișnuit, este încă incomprehensibil, ce fel de fiară este pentru ceea ce are nevoie. Prin urmare, voi încerca să explic toate cele mai ușoare cuvinte.

Notă: Materialul este conceput pentru utilizatorii obișnuiți și nu conține multe aspecte tehnice, totuși, pentru familiarizarea de bază a acesteia mai mult decât suficientă.

Ce este hash sau hashing?

Voi începe cu termeni.

Funcția hash, funcția de convoluție - Aceasta este o caracteristică specială care vă permite să convertiți texte de lungime arbitrare la un cod de lungime fixă \u200b\u200b(de obicei, o înregistrare digitală scurtă).

Hashing. - Acesta este procesul de transformare a textelor sursă.

Hash, cod hash, hash de valoare, hash-suma - Aceasta este valoarea de ieșire a funcției hash, adică blocul rezultat este lungimea fixă.

După cum puteți vedea, termenii au o descriere în formă de puține, din care este greu de înțeles de ce este necesar. Prin urmare, voi da imediat un mic exemplu (despre alte aplicații vor spune un pic mai târziu). Să presupunem că aveți 2 fișiere de 10 GB. Cum puteți afla rapid ce are nevoie? Puteți utiliza numele fișierului, dar este ușor să îl redenumiți. Puteți urmări datele, dar după copierea fișierelor de fișiere pot fi aceleași sau în alte secvențe. Dimensiunea, cum înțelegeți singur, puțin poate ajuta (mai ales dacă dimensiunile coincid sau nu ați văzut valorile exacte ale octeților).

Aici aveți nevoie de acest lucru foarte hash, care este un bloc scurt care este generat din textul sursă al fișierului. Aceste două fișiere 10 GB vor avea două coduri diferite, dar scurte (ceva de genul "Accac43535" și "BBB3232A42"). Folosind-le, puteți afla rapid fișierul dorit.Chiar și după copierea și schimbarea numelor.

Notă: Datorită faptului că hash-ul din computerul lumii și pe Internet este un concept foarte binecunoscut, atunci este adesea tot ceea ce este legat de Hash, este redus la acest cuvânt. De exemplu, fraza "Eu folosesc hash MD5" în traducere înseamnă că pe site sau în altă parte este utilizată de algoritmul hashing al standardului MD5.

Proprietăți hash

Acum, vă voi spune despre proprietățile funcțiilor hash, astfel încât să fie mai ușor să înțelegeți unde este folosit și pentru ceea ce aveți nevoie. Dar mai întâi o altă definiție.

Coliziune - Aceasta este situația în care se obține una și aceeași cantitate de hash pentru două texte diferite. După cum știți, odată un bloc de lungime fixă, are un număr limitat de valori posibile și, prin urmare, sunt posibile repetări.

Și acum la proprietățile funcțiilor HASH:

1. Textul poate fi furnizat textului de orice dimensiune, iar ieșirea este un bloc de date cu lungime fixă. Aceasta rezultă din definiție.

2. Suma de hash a acelorași texte ar trebui să fie aceeași. În caz contrar, astfel de funcții sunt pur și simplu inutile - acest lucru este similar cu un număr aleatoriu.

3. O funcție bună de convoluție trebuie să aibă o distribuție bună. Sunt de acord că, dacă dimensiunea hash de ieșire, de exemplu, este de 16 octeți, atunci dacă funcția returnează doar 3 valori diferite pentru orice texte, atunci nici un efect asupra unei astfel de funcții și acești 16 octeți (16 octeți sunt 2 ^ 128 Opțiuni, care sunt de aproximativ 3, 4 * 10 ^ 38 grade).

4. Cât de bine funcția răspunde la cele mai mici schimbări din textul sursă. Un exemplu simplu. A schimbat 1 literă într-un fișier de 10 GB, valoarea funcției ar trebui să fie diferită. Dacă nu este așa, atunci este foarte problematic să se aplice o astfel de funcție.

5. Probabilitatea apariției coliziunii. Un parametru foarte complex calculat în anumite condiții. Dar esența lui este că ceea ce este punctul de hash, dacă suma de hash rezultată va coincide adesea.

6. Rata de calcul Hasha. Care este lotul din funcția de convoluție dacă este de mult timp să se calculeze? Nu, deoarece fișierele sunt mai ușor de comparat sau de a folosi o altă abordare.

7. Complexitatea restabilirii datelor sursă din valoarea hashului. Această caracteristică este mai specifică decât cea globală, deoarece nu este necesar peste tot. Cu toate acestea, pentru cele mai renumite algoritmi, această caracteristică este evaluată. De exemplu, fișierul sursă pe care nu îl puteți obține de la această funcție. Cu toate acestea, dacă are loc problema coliziunilor (de exemplu, trebuie să găsiți orice text care corespunde unui astfel de hash), atunci această caracteristică poate fi importantă. De exemplu, parole, dar puțin mai târziu.

8. Codul sursă deschisă sau închis pentru o astfel de funcție. Dacă codul nu este deschis, complexitatea recuperării datelor, și anume criptostilitatea, rămâne în discuție. Parțial, aceasta este o problemă cu criptarea.

Acum puteți merge la întrebarea "și de ce este totul?".

De ce aveți nevoie de un hash?

Principalele obiective ale funcțiilor hash sunt doar trei (sau mai degrabă scopul lor).

1. Verificați integritatea datelor. ÎN acest caz Totul este simplu, o astfel de funcție trebuie calculată rapid și vă permite să verificați rapid acest lucru, de exemplu, fișierul descărcat de pe Internet nu a fost deteriorat în timpul transferului.

2. Creșterea vitezei de căutare a datelor. Dimensiunea blocului fix vă permite să obțineți multe avantaje în rezolvarea sarcinilor de căutare. În acest caz, vorbim despre ceea ce este pur tehnic, utilizarea funcțiilor hash poate avea un efect pozitiv asupra performanței. Pentru astfel de funcții, probabilitatea de coliziune și o distribuție bună este foarte importantă.

3. Pentru nevoile criptografice. Această specie Funcțiile de convoluție sunt utilizate în zone de securitate, unde este important ca rezultatele să fie greu de înlocuit sau în cazul în care este necesar să se complică sarcina de a obține cât mai mult posibil. informatii utile de la hash.

Unde și cum se aplică hash-ul?

După cum probabil ați ghicit deja că hash se aplică la rezolvarea foarte multor sarcini. Aici sunt câțiva dintre ei:

1. Parolele sunt de obicei stocate nu în formă deschisă, ci sub formă de sume hash, care permite asigurarea unui grad mai ridicat de securitate. La urma urmei, chiar dacă atacatorul va primi acces la o astfel de baze de date, el va trebui să-și petreacă mult timp pentru a ridica textele corespunzătoare acestor coduri hash. Aici este caracteristica "complexitatea restabilirii datelor inițiale din valorile hash".

Notă: Vă sfătuiesc să vă familiarizați cu articolul cu câteva sfaturi pentru a îmbunătăți securitatea parolelor.

2. în programare, inclusiv baze de date. Desigur, cel mai adesea vorbim despre structurile de date care permit cautare rapida. Aspect tehnic pur.

3. Când datele care transmite date (inclusiv Internet). Multe protocoale, cum ar fi TCP / IP includ câmpuri speciale de verificare care conțin cantitatea de hash a mesajului sursă, astfel încât, dacă nu a apărut un defect undeva, nu a afectat transferul de date.

4. Pentru diferiți algoritmi ai siguranței. De exemplu, hash este folosit în semnături electronice digitale.

5. Pentru a verifica integritatea fișierelor. Dacă ați acordat atenție, este adesea posibil să respectați fișierele de pe Internet (de exemplu, arhive) descrieri suplimentare cu codul hash. Această măsură este aplicată nu numai astfel încât să nu executați accidental fișierul care a fost deteriorat la descărcarea de pe Internet, dar și există simplitate de găzduire. În astfel de cazuri, puteți verifica rapid hash și, dacă este necesar, apoi exagerați fișierul.

6. Uneori, funcțiile hash sunt folosite pentru a crea identificatori unici (ca parte). De exemplu, atunci când salvați imagini sau pur și simplu fișiere, utilizați de obicei hash în nume împreună cu data și ora. Acest lucru vă permite să nu suprascrieți fișierele cu același nume.

De fapt, mai departe, cu atât mai des funcționează funcțiile hash tehnologia Informatiei. În principal datorită faptului că cantitatea de date și puterea celor mai mult calculatoare simple Puternic a mârâit. În primul caz, suntem mai multe despre căutare, iar în al doilea suntem mai multe despre problemele de securitate.

Funcții de hash celebre

Cele mai renumite sunt următoarele trei funcții hash.

Adnotare: În această prelegere este formulată conceptul de funcții hash, precum și revizuire scurtă Algoritmi pentru formarea funcțiilor hash. În plus, se consideră posibilitatea utilizării algoritmilor bloc pentru criptare pentru a forma o funcție hash.

Scopul prelegerii: Să se familiarizeze cu conceptul de "funcția hash", precum și cu principiile acestor funcții.

Conceptul funcției hash

Funcția hash (funcția hash) Se numește o funcție matematică sau altă funcție, care pentru o linie de lungime arbitrară calculează un număr întreg sau alt șir de lungime fixă. Matematic, poate fi scris astfel:

unde m este mesajul original numit uneori prezent, și H - rezultatul numit funcția hash (precum și codul hash. sau mesajul digest (din engleza. mesaj Digest)).

Semnificația funcției hash este de a determina caracteristica caracteristică a eșantionului - semnificația funcției hash. Această valoare are de obicei o anumită dimensiune fixă, de exemplu, 64 sau 128 de biți. Codul HASH poate fi analizat în continuare pentru a rezolva orice sarcină. De exemplu, hashing-ul poate fi utilizat pentru a compara datele: Dacă două coduri hash sunt diferite, se garantează matricele; Dacă array-urile aceleași sunt cel mai probabil aceleași. În general, corespondența neechivocă dintre datele sursă și codul HASH nu se datorează faptului că numărul funcțiilor hash este întotdeauna mai mic decât opțiunile de introducere. Prin urmare, există multe mesaje de intrare care dau aceleași coduri hash (se numesc astfel de situații collizia.). Probabilitatea apariției coliziunilor joacă un rol important în evaluarea calității funcțiilor hash.

Funcțiile hash sunt utilizate pe scară largă în criptografia modernă.

Cea mai simplă funcție hash poate fi preparată utilizând operația "Suma modulului 2" după cum urmează: Obținem șirul de intrare, pliam pe toți octeții by Modulul 2, iar rezultatul octetului se întoarce ca o hash fuch. Lungimea funcției hash va fi în acest caz 8 biți, indiferent de dimensiunea mesajului de intrare.

De exemplu, lăsați mesajul original să fie tradus în vizualizarea digitală, următoarele (în format hexazecimal):

Vom transfera mesajul la aspectul binar, scrieți octeți unul la celălalt și punem biții în fiecare coloană de către modulul 2:

0011 1110 0101 0100 1010 0000 0001 1111 1101 0100 ---------- 0110 0101

Rezultatul (0110 0101 (2) sau 65 (16)) și va fi valoarea funcției hash.

Cu toate acestea, o astfel de funcție hash nu poate fi utilizată în scopuri criptografice, de exemplu pentru formarea semnatura electronicaDeoarece este ușor să modificați conținutul mesajului semnat fără a schimba valorile de control.

Prin urmare, funcția Hash considerată nu este potrivită pentru aplicațiile criptografice. În criptografie, funcția hash este considerată bună dacă este dificil să se creeze două tipuri cu aceeași funcție hash, precum și dacă ieșirea funcțională nu este în mod explicit dependentă de intrare.

Formulăm cerințele de bază pentru funcțiile hash criptografice:

  • funcția hash trebuie să fie aplicabilă unui mesaj de orice dimensiune;
  • calculul valorii funcției trebuie efectuat suficient de rapid;
  • cu o funcție de hash bine cunoscută, ar trebui să fie dificilă (aproape imposibilă) pentru a găsi un prototip adecvat M;
  • cu un mesaj binecunoscut, M ar trebui să fie greu de găsit un alt mesaj M "cu aceeași valoare a funcției hash, cum ar fi mesajul sursă;
  • ar trebui să fie dificil să găsiți nici o pereche de mesaje diferite diverse cu aceeași funcție hash.

Creați o funcție hash care îndeplinește toate cerințele enumerate nu este o sarcină ușoară. De asemenea, este necesar să ne amintim că funcția funcției este primită în funcție de funcția unei mărimi arbitrare, iar rezultatul HASH nu trebuie să fie la fel de același pentru aceste dimensiuni diferite.

În prezent, în practică, funcțiile care procesează mesajul de intrare sunt utilizate ca funcții hash și valoarea hash de calcul H i \u200b\u200bpentru fiecare bloc M al mesajului de intrare pe dependența de tipul de tip

h i \u003d h (m i, h i-1)

unde H I-1 este rezultatul obținut la calcularea funcției hash pentru blocul anterior. Date de intrare.

Ca rezultat, randamentul funcției HASH H N este o funcție din toate blocurile de intrare.

Utilizați criptarea algoritmilor bloc pentru a forma o funcție hash

Puteți utiliza un bloc ca o funcție hash. Dacă blocurile utilizate de algoritmul bloc al criptului, atunci funcția hash bazată pe aceasta va fi fiabilă.

Cea mai simplă modalitate de a utiliza un algoritm bloc pentru a obține un cod Hash este criptarea mesajului în modul CBC. În acest caz, mesajul este reprezentat ca o secvență de blocuri a căror lungime este egală cu lungimea blocului algoritmului de criptare. Dacă este necesar, ultima unitate este completată la zerourile potrivite, astfel încât unitatea de lungime dorită să fie. Hash va fi ultimul bloc de text criptat. Sub rezerva utilizării unui algoritm de criptare bloc fiabil, valoarea hashului rezultat va avea următoarele proprietăți:

  • aproape imposibilă fără a cunoaște calculul-cheie de criptare a valorilor hash pentru o anumită gamă deschisă de informații;
  • este practic imposibilă fără a cunoaște selectarea cheii de criptare a datelor deschise sub valoarea hash specificată.

Valoarea de furtună formată în acest mod este de obicei numită imitovka. sau autentificator și folosit pentru a verifica integritatea mesajului. Astfel, simulatorul este o combinație de control care depinde de datele deschise și de informațiile cheie secrete. Scopul utilizării imitovka este de a detecta toate schimbările aleatorii sau deliberate în gama de informații. Valoarea obținută de funcția HASH la procesarea mesajului de intrare este atașat la mesaj în momentul în care se știe că mesajul este corect. Destinatarul verifică integritatea mesajului prin calcularea imitației mesajului primit și comparând-o cu codul hash rezultat, care trebuie transmis într-un mod sigur. Unul din aceia moduri sigure Poate criptarea imitovka tasta închisă expeditor, adică Creând o semnătură. De asemenea, este posibilă criptarea algoritmului de cod Hash obținut pentru criptare simetrică dacă expeditorul și destinatarul au o cheie generală de criptare simetrică.

Procesul specificat de obținere și utilizare a imitovka este descris în standardul standard GOST 28147-89. Standardul oferă pentru a utiliza cele mai tinere 32 biți ai blocului obținut la ieșirea funcționării de criptare a întregului mesaj din modul ambrechiajului Cipher pentru a monitoriza integritatea mesajului transmis. În același mod, orice bloc poate fi folosit pentru a genera imitavka algoritmul de criptare simetrică.

Un alt mod posibil de a utiliza un cifru bloc pentru a genera un cod hash este următorul. Mesajul sursă este procesat în blocuri de serie. Ultimul bloc, dacă este necesar, este completat de zerouri, uneori în ultimul bloc pe care îl atribuiți lungimea mesajului în formular numere binare. La fiecare etapă, criptați valoarea hash obținută în stadiul anterior, luând blocul de mesaj curent ca cheie. Ultima valoare criptată introdusă va fi ultima hash.

De fapt, mai multe scheme de utilizare a unui cip de bloc pentru a forma o funcție hash. Fie ca m I o unitate de bloc sursă, hi - valoarea funcției hash la etapa i-nivel, f este un bloc de algoritm de criptare utilizat într-un mod simplu de înlocuire - funcționarea de adiție a modulului 2. Apoi sunt posibile, De exemplu, următoarele scheme de formare a funcțiilor Hash:

În toate aceste diagrame, lungimea valorii generat de hash este egală cu lungimea blocului în timpul criptării. Toate acestea, precum și alte scheme de utilizare a unui algoritm bloc pentru criptare pentru a calcula valorile hash pot fi utilizate în practică.

Principalul dezavantaj al funcțiilor hash proiectate pe baza algoritmilor bloc este relativ viteza mica Muncă. De asemenea, criptoscopul necesar poate fi asigurat pentru un număr mai mic de operații pe datele de intrare. Există algoritmi de hash rapid concepute independent de zero, pe baza cerințelor de rezistență criptic (cele mai frecvente dintre acestea - MD5, SHA-1, SHA-2 și GOST R 34.11-94).


Ce este hash?Funcția hash este numită transformare matematică a informațiilor într-un șir de lungime scurt, un anumit și lungime.

Pentru ce ai nevoie?Analiza utilizării funcțiilor hash este adesea folosită pentru a monitoriza integritatea fișierelor importante. sistem de operare, programe importante, date importante. Controlul poate fi făcut atât după cum este necesar, cât și în mod regulat.

Cum sa terminat?La început, determinați care integritatea fișierelor trebuie monitorizate. Pentru fiecare fișier, se calculează pentru a calcula valoarea hash pe un algoritm special, menținând în același timp rezultatul. După timpul necesar, se face un calcul similar și rezultatele sunt comparate. Dacă valorile diferă, înseamnă că informațiile conținute în fișier au fost modificate.

Ce caracteristici ar trebui să aibă o funcție hash?

  • trebuie să poată efectua transformări ale datelor de lungime arbitrară la fix;
  • trebuie să aibă un algoritm deschis, astfel încât criptoscopul său să poată fi explorat;
  • trebuie să fie unilaterală, adică nu ar trebui să existe capacități matematice prin determinarea datelor sursă;
  • trebuie să "reziste" conflicte, adică nu ar trebui să dea aceleași valori cu date diferite de intrare;
  • nu ar trebui să necesite resurse mari de calcul;
  • cu cea mai mică schimbare a datelor de intrare, rezultatul trebuie să se schimbe semnificativ.

Care sunt algoritmii popular de hashing?Următoarele funcții hash sunt utilizate în prezent:

  • CRC - Codul excesiv ciclic sau de control. Algoritmul este foarte simplu, are un numar mare de variații în funcție de lungimea de ieșire necesară. Nu criptografice!
  • MD 5 este un algoritm foarte popular. Ca el versiunea anterioara MD 4 este o funcție criptografică. HESHA Dimensiune 128 biți.
  • SHA -1 este, de asemenea, o confunție criptografică foarte populară. HESHA Dimensiune 160 biți.
  • GOST R 34.11-94 - Standardul criptografic rus pentru calcularea funcțiilor hash. HESHA Dimensiune 256 biți.

Când pot utiliza acești algoritmi un administrator de sistem?Adesea, atunci când descărcați orice conținut, este prezent programe de la producător, muzică, filme sau alte informații. sumele de controlcalculată în funcție de un algoritm specific. Din motive de siguranță, după descărcare, este necesar să efectuați un calcul independent al funcției HASH și să comparați valoarea cu ceea ce este indicat pe site sau în aplicația în fișier. Ai făcut-o vreodată?

Ce este mai convenabil pentru a număra hash?Acum există un număr mare de utilități similare cu atât plătite și libere de utilizat. Îmi plac personal Hashtab. În primul rând, utilitatea în timpul instalării este încorporată sub formă de filă la proprietățile fișierelor, în al doilea rând, vă permite să alegeți un număr mare de algoritmi de hashing și, în al treilea rând, este gratuit pentru uz personal non-comercial.

Ce este limba rusă?După cum sa menționat mai sus în Rusia, există un standard de Hashing GOST R 34.11-94, care este utilizat peste tot în mulți producători de instrumente de securitate a informațiilor. Unul dintre aceste fonduri este programul de fixare și control al statului original. pachete software "Fix". Acest program este un mijloc de control al eficacității aplicării SZI.

Fix (versiunea 2.0.1) pentru Windows 9x / NT / 2000 / XP

  • Calculați verificările fișierelor specificate de unul dintre cele 5 algoritmi implementați.
  • Fixarea și controlul ulterior al stării originale a pachetului software.
  • Compararea versiunilor pachetului software.
  • Fixarea și controlul cataloagelor.
  • Monitorizarea modificărilor în fișiere specificate (directoare).
  • Formarea rapoartelor în formate TXT, HTML, SV.
  • Produsul are un certificat de FSTEC pe NDV 3 nr. 913 până la 1 iunie 2013.

Și cum rămâne cu EDS?Rezultatul calculării funcției împreună cu cheia secretă a utilizatorului intră în intrarea algoritmului criptografic, unde se calculează semnătura digitală electronică. Strict vorbind, funcția hash nu face parte din algoritmul EDS, dar de multe ori acest lucru se face în mod specific, pentru a exclude atacul folosind cheia publică.

În prezent, multe aplicații de comerț electronic vă permit să stocați cheia secretă a utilizatorului în zona de jetoane închisă (Rutoken, Etoken) fără capacitatea tehnică de a-l extrage de acolo. Tokenul în sine are o zonă foarte limitată de memorie, măsurată în Kilobytes. Pentru a semna documentul, nu există nicio posibilitate de a transfera documentul la token-ul în sine, dar pentru a transfera hash-ul documentului la jeton și la ieșirea pentru a obține EDS este foarte simplu.

Întrebări:

1. Conceptul de funcții hash.

2. Utilizați algoritmi bloc pentru criptare pentru a forma o funcție hash.

3. Revizuirea algoritmilor pentru formarea funcțiilor hash.

1. Conceptul funcției hash

Funcția hash.(Funcția hash) se numește o funcție matematică sau altă funcție, care pentru o linie de lungime arbitrară calculează un număr întreg sau alt șir de lungime fixă. Matematic, poate fi scris astfel:

h. \u003d H (m) ,

unde M. - mesaj sursă numit uneori prezent , dar h. - rezultatul numit valoarea funcției hash (precum și codul hash. sau mesajul digest (din engleza. mesaj Digest)).

Semnificația funcției hash este de a determina caracteristica caracteristică a eșantionului - semnificația funcției hash. Această valoare are de obicei o anumită dimensiune fixă, de exemplu, 64 sau 128 de biți. Codul HASH poate fi analizat în continuare pentru a rezolva orice sarcină. De exemplu, hashing-ul poate fi utilizat pentru a compara datele: Dacă două coduri hash sunt diferite, se garantează matricele; Dacă array-urile aceleași sunt cel mai probabil aceleași. În general, corespondența neechivocă dintre datele sursă și codul HASH nu se datorează faptului că numărul funcțiilor hash este întotdeauna mai mic decât opțiunile de introducere. Prin urmare, există multe mesaje de intrare care dau aceleași coduri hash (se numesc astfel de situații collizia. ). Probabilitatea apariției coliziunilor joacă un rol important în evaluarea calității funcțiilor hash.

Funcțiile hash sunt utilizate pe scară largă în criptografia modernă.

Cea mai simplă funcție hash poate fi compilată utilizând operația "Suma modulului 2" după cum urmează: Obținem șirul de intrare, pliam pe toți octeții de către Modulul 2 și rezultatul octetului se întoarce ca valoare a lui Hash Fuch. Lungimea funcției hash va fi în acest caz 8 biți, indiferent de dimensiunea mesajului de intrare.

De exemplu, lăsați mesajul original să fie tradus în vizualizarea digitală, următoarele (în format hexazecimal):

2 B.1 4 A.9 5 F.E.4

Vom transfera mesajul la aspectul binar, scrieți octeți unul la celălalt și punem biții în fiecare coloană de către modulul 2:

0010 1011

0001 0100

1010 1001

0101 1111

1110 0100

——————-

0010 1101

Rezultat: 0010 1101 sau 2 D. Și va fi valoarea funcției hash.

Cu toate acestea, o astfel de funcție hash nu poate fi utilizată în scopuri criptografice, de exemplu, pentru a forma o semnătură electronică, deoarece este destul de ușor să modificați conținutul mesajului semnat fără a schimba valorile de control.

Prin urmare, funcția de testare hash nu este potrivită pentru aplicații criptografice. În criptografie, funcția hash este considerată bună dacă este dificil să se creeze două tipuri cu aceeași funcție hash, precum și dacă ieșirea funcției nu are o dependență explicită de intrare.

Formulăm cerințele de bază pentru funcțiile hash criptografice:

· Funcția hash trebuie să fie aplicabilă unui mesaj de orice dimensiune;

· Calculul valorii funcției trebuie efectuat suficient de rapid;

· Cu un sens cunoscut al funcției hash, ar trebui să fie dificil (aproape imposibil) pentru a găsi un prototip adecvat M. ;

· Cu un mesaj bine-cunoscut M. Ar trebui să fie dificil să găsești un alt mesaj. M ' cu aceeași valoare a funcției hash, cum ar fi mesajul sursă;

· Ar trebui să fie dificil să găsiți nici o pereche de mesaje diferite cu aceeași funcție hash.

Creați o funcție hash care îndeplinește toate cerințele enumerate nu este o sarcină ușoară. De asemenea, este necesar să ne amintim că funcția funcției este primită în funcție de funcția unei mărimi arbitrare, iar rezultatul HASH nu trebuie să fie la fel de același pentru aceste dimensiuni diferite.

În prezent, în practică, funcțiile sunt utilizate ca funcții hash, procesând blocul de mesaj de intrare în spatele unității și calculul hash- sALUT. Pentru fiecare bloc M I. Mesaj de intrare pe dependență

h i \u003d h (m i, h i-1)

unde h i-1 - rezultatul obținut la calcularea funcției hash pentru blocul anterior de date de intrare.

Ca rezultat, randamentul funcției hash h n. este o funcție de la toate n. Blocuri de intrare.

2. Utilizați criptarea algoritmilor bloc pentru a forma o funcție hash.

Ca funcție hash, puteți utiliza un algoritm bloc pentru criptare simetrică. Dacă algoritmul blocului utilizat este o colț criptografic, atunci funcția hash bazată pe ea va fi fiabilă.

Cea mai simplă modalitate de a utiliza un algoritm bloc pentru a obține un cod hash este criptarea mesajului în modul CBC ( Cipher Block Laning - Modul ambreiajului Ciphertex). În acest caz, mesajul este reprezentat ca o secvență de blocuri a căror lungime este egală cu lungimea blocului algoritmului de criptare. Dacă este necesar, ultima unitate este completată la zerourile potrivite, astfel încât unitatea de lungime dorită să fie. Hash va fi ultimul bloc de text criptat. Sub rezerva utilizării unui algoritm de criptare bloc fiabil, hash-ul obținut va avea următoarele proprietăți:

· Practic imposibilă fără a cunoaște calculul-cheie de criptare a valorii hash pentru o anumită gamă deschisă de informații;

· Este practic imposibilă fără a cunoaște selectarea cheii de criptare a datelor deschise pentru o valoare hash specificată.

Umil format în acest mod se numește de obicei imitovka. sau autentificator și folosit pentru a verifica integritatea mesajului. Astfel, simulatorul este o combinație de control care depinde de datele deschise și de informațiile cheie secrete. Scopul utilizării imitovka este de a detecta toate schimbările aleatorii sau deliberate în gama de informații. Valoarea obținută de funcția HASH la procesarea mesajului de intrare este atașat la mesaj în momentul în care se știe că mesajul este corect. Destinatarul verifică integritatea mesajului prin calcularea imitației mesajului primit și comparând-o cu codul hash rezultat, care trebuie transmis într-un mod sigur. Una dintre aceste modalități sigure ar putea cripta imitația expeditorului printr-o cheie închisă, adică. Creând o semnătură. De asemenea, este posibilă criptarea algoritmului de cod Hash obținut pentru criptare simetrică dacă expeditorul și destinatarul au o cheie generală de criptare simetrică.

Procesul specificat de obținere și utilizare a imitovka este descris în standardul standard GOST 28147-89. Standardul oferă pentru a utiliza cele mai tinere 32 biți ai blocului obținut la ieșirea funcționării de criptare a întregului mesaj din modul ambrechiajului Cipher pentru a monitoriza integritatea mesajului transmis. În același mod, orice algoritm bloc pentru criptare simetrică poate fi folosit pentru a forma imitavka.

Un alt mod posibil de a utiliza un cifru bloc pentru a genera un cod hash este următorul. Mesajul sursă este procesat în blocuri de serie. Ultimul bloc este completat cu zerouri, dacă este necesar, uneori lungimea mesajului sub forma unui număr binar este atribuită ultimului bloc. În fiecare etapă, criptați hashul, obținut în stadiul anterior, luând blocul de mesaj curent ca cheie. Ultima valoare criptată introdusă va fi ultima hash.

Astfel, dacă schema de criptare a mesajelor obișnuite M. folosind blocul blocului f. pe cheie LA Am înregistrat ca. E \u003d F (m, k) Apoi schema de cod Hash h. În conformitate cu algoritmul descris mai sus, vă puteți imagina cum

sALUT. = f. ( sALUT. -1 , M. )

Ca un cod inițial de hash h 0. Ia o constantă. Criptarea se efectuează în modul simplu de înlocuire. Folosind. metoda specificată Dimensiunea blocului coincide cu lungimea cheiii și dimensiunea valorii hashului va fi lungimea unității.

O altă modalitate de a utiliza un cifru bloc într-un mod simplu de înlocuire este, de asemenea, posibilă: elementele de mesaje sunt criptate cu valori hash obținute în stadiul anterior:

sALUT. = f. ( M. , sALUT. -1 ,)

De fapt, mai multe scheme de utilizare a unui cip de bloc pentru a forma o funcție hash. Lasa M I. - blocul mesajului sursă, sALUT. - valoarea funcției hash i. -scena, f. - algoritmul blocului pentru criptare utilizat într-un mod simplu de înlocuire - funcționarea de adiție a modulului 2. Apoi posibilă, de exemplu, următoarele sisteme de formare a funcțiilor:

În toate aceste diagrame, lungimea valorii generat de hash este egală cu lungimea blocului în timpul criptării. Toate acestea, precum și alte scheme de utilizare a unui algoritm bloc pentru criptare pentru a calcula valorile hash pot fi utilizate în practică.

Principalul dezavantaj al funcțiilor hash proiectate pe baza algoritmilor bloc este o viteză relativ scăzută. De asemenea, criptoscopul necesar poate fi asigurat pentru un număr mai mic de operații pe datele de intrare. Există algoritmi de hash (cele mai frecvente - MD5, SHA-1, SHA-2 și GOST R 34.11-94).

3. Revizuirea algoritmilor pentru formarea funcțiilor hash.

În prezent, diverse algoritmi speciali sunt oferite și utilizate practic pentru a calcula funcția hash. Cele mai renumite algoritmi sunt MD5, SHA-1, SHA-2 și alte versiuni ale lui SHA, precum și algoritmul intern prezentat în GOST R 34.11-94.

Algoritm. MD5. A apărut la începutul anilor 90 din secolul al XX-lea ca urmare a îmbunătățirii algoritmului de formare a hashului MD4. Simboluri în numele "MD" înseamnă mesaje digest - un rezumat al mesajului. Autorul algoritmilor MD4 și MD5 - R1st (R.Rivestul). Ca urmare a utilizării MD5, o hash de 128 de biți este formată pentru un mesaj arbitrar. Datele de intrare sunt procesate de blocuri de 512 biți. Algoritmul utilizează elementar operații logice (Invers, conjuncție, adăugare de modul 2, schimburi ciclice etc.), precum și adăugarea aritmetică obișnuită. Repetarea completă a acestor funcții elementare ale algoritmului asigură că rezultatul este bine amestecat după prelucrare. Prin urmare, este puțin probabil ca două mesaje selectate din întâmplare să aibă același cod de hash. Algoritmul MD5 are următoarea proprietate: fiecare bit al valorii hash rezultat este o funcție din fiecare biți de intrare. Se crede că MD5 este cea mai puternică funcție hash pentru o valoare hash de 128 de biți.

Algoritm. SHA. Secure algoritm hash - un hash-algoritm sigur) a fost dezvoltat de Institutul Național de Standarde și Tehnologie (NIST) al Statelor Unite și publicat ca un standard american de informare federal în 1993. SHA-1, precum și MD5, pe baza algoritmului MD4. SHA-1 formează o hash de 160 de biți pe baza procesării sursei de blocuri de 512 biți. Algoritmul SHA-1 utilizează, de asemenea, operații simple logice și aritmetice. Cea mai importantă diferență dintre SHA-1 din MD5 este că codul HASH SHA-1 este de 32 de biți mai mult decât codul Hash MD5. Dacă presupunem că ambii algoritmi sunt aceiași în dificultate pentru criptanaliză, atunci SHA-1 este un algoritm mai rezistent. Folosind atacul cu forța grosieră (atac frontal), este mai dificil să creați un mesaj arbitrar care are un cod hash dat și este, de asemenea, mai dificil să creați două mesaje care au același cod de hash.

În 2001, Institutul Național de Standarde și Tehnologii din Statele Unite a adoptat trei funcții hash ca un standard cu o lungime mai mare a codului hash decât la SHA-1. Adesea, aceste funcții hash sunt numite SHA-2 sau SHA-256, SHA-384 și SHA-512 (lungimea codului hash creat de algoritmi este specificată în titlu). Aceste algoritmi diferă nu numai de lungimea codului hash creat, ci și funcțiile interne și lungimea blocului prelucrat (la SHA-256 lungimea unității - 512 și lungimea blocului SHA-384 și SHA-512 este de 1024 biți). Îmbunătățirile treptate ale algoritmului SHA conduc la o creștere a rezistenței sale criptice. În ciuda diferențelor dintre algoritmii luați în considerare unul de celălalt, toate acestea sunt dezvoltarea ulterioară a SHA-1 și MD4 și au o structură similară.

În Rusia, este adoptată GOST P34.11-94, care este un standard intern pentru funcțiile hash. Structura sa este destul de diferită de structura algoritmilor SHA-1.2 sau MD5, care se bazează pe algoritmul MD4. Lungimea codului hash creat de algoritmul GOST R 34.11-94 este de 256 de biți. Algoritmul este procesat secvențial de mesajul sursă prin blocuri de 256 de biți spre dreapta stânga. Parametrul algoritmului este vectorul de pornire al hashului - o valoare fixă \u200b\u200barbitrară este de asemenea 256 de biți. În algoritm, GOST R 34.11-94, operațiunile de permutare, forfecare, adithmetica, adăugarea de modul 2. ca funcția auxiliară GOST 34.11-94 utilizează un algoritm conform GOST 28147-89 într-un mod simplu de înlocuire.

4. Cerințe pentru funcțiile hash

Funcția HASH este numită o funcție unică concepută pentru a primi un fișier digest sau "amprente digitale", mesaje sau un bloc de date.

Codul HASH este creat de funcția N. :

h \u003d h (m)

Unde M. este un mesaj de lungime arbitrară și h. Este un cod de hash cu lungime fixă.

Luați în considerare cerințele pentru care funcția hash trebuie să se potrivească astfel încât să poată fi folosită ca un autentificator de mesaje. Luați în considerare un exemplu foarte simplu de funcție hash. Apoi analizăm mai multe abordări pentru construirea funcției hash.

Funcția hash. N. Acest lucru este utilizat pentru autentificarea mesajelor trebuie să aibă următoarele proprietăți:

1. Funcția hash. N. Ar trebui să fie aplicată blocului de date de orice lungime.

2. Funcția hash. N. Creează o ieșire cu lungimea fixă.

3. N (m) relativ ușor (pentru timpul polinomial) este calculată pentru orice valoare M. .

4. Pentru orice cod de hash dat h. Este evident imposibil de găsit M. astfel încât H (m) \u003d h .

5. Pentru orice dat h. Este imposibil să se descopere acest lucru

H. (y) \u003d h (x).

6. Este computațional nu este posibil să găsiți o pereche arbitrară ( h. , y. ) astfel încât H (y) \u003d h (x) .

Primele trei proprietăți necesită funcția HASH pentru a crea un cod Hash pentru orice mesaj.

Cea de-a patra proprietate determină cerința de o singură privire a funcțiilor hash: ușor de creat un cod hash pentru acest mesaj, dar este imposibil să recuperați mesajul pe acest cod hash. Această proprietate este importantă dacă autentificarea utilizând funcția HASH include o valoare secretă. Valoarea secretă în sine nu poate fi trimisă, însă dacă funcția hash nu este unilaterală, inamicul poate descoperi cu ușurință valoarea secretă după cum urmează. La interceptarea transferului, atacatorul primește un mesaj M. și codul hash C \u003d H (SAB || M) . Dacă atacatorul poate inversa funcția hash, atunci, prin urmare, poate obține SAB ||. M \u003d h - 1 (c) . Din moment ce atacatorul știe acum și M. și SAB ||. M. , a primi Sab. destul de simplu.

Cea de-a cincea proprietate asigură că este imposibil să găsești un alt mesaj, a cărui valoare a funcției hash ar coincide cu valoarea funcției hash acest mesaj. Acest lucru împiedică falsatorul fals atunci când se utilizează un cod hash criptat. În acest caz, adversarul poate citi mesajul și, prin urmare, să creeze codul de hash. Dar, deoarece inamicul nu deține o cheie secretă, nu are capacitatea de a schimba mesajul astfel încât destinatarul să nu o găsească. Dacă această proprietate nu este executată, atacatorul are capacitatea de a efectua următoarea secvență de acțiuni: pentru a intercepta mesajul și codul Hash criptat, calculați codul hash mesaj, creați un mesaj alternativ cu același cod hash, înlocuiți mesajul original la fals. Deoarece codurile hash ale acestor mesaje coincid, destinatarul nu va detecta substituția.

Funcția hash care satisface primele cinci proprietăți se numește o funcție de hash simplă sau slabă. Dacă se efectuează cea de-a șasea proprietate, atunci această funcție este numită o funcție puternică a hashului. A șasea proprietate protejează împotriva atacurilor de clasă, cunoscute sub numele de atacul "ziua de naștere".

5. Funcții simple hash.

Toate funcțiile hash sunt efectuate după cum urmează. Valoarea de intrare (mesaj, fișier etc.) este considerată o secvență n. - Blocuri de biți. Valoarea de intrare este procesată blocând secvențial în spatele unității și este creată. m. - valoarea codului de hash.

Unul dintre cele mai simple exemple de funcții hash este Xor Bitit din fiecare bloc:

Cu I. - i. Bit Hash cod, 1 <= i <= n .

k. - Număr n. - Blocuri blocuri de intrare.

b ij. i. Bit B. j. Bloc.

Apoi, întregul mesaj este criptat, inclusiv codul Hash, în modul CCS pentru a crea blocuri criptate Y1, Y2, ..., YN + 1. Prin definiție, am:

Dar Xn + 1 este un cod de hash:

Deoarece componentele din egalitatea anterioară pot fi calculate în orice ordine, codul HASH nu va fi modificat dacă blocurile criptate vor fi rearanjate.

Standardul inițial propus de NIST a folosit un simplu XOR, care a fost utilizat pentru blocuri de mesaje pe 64 de biți, apoi întregul mesaj este criptat utilizând modul CCS.

"Paradox de ziua de naștere"

Înainte de a lua în considerare funcții mai complexe hash, este necesar să se analizeze un anumit atac asupra funcțiilor simple hash.

Așa-numitul "paradox de ziua de naștere" este după cum urmează. Să presupunem că numărul de valori de ieșire ale funcției hash N. in aceeasi masura n. . Care ar trebui să fie numărul k. la valoarea specifică X. și valori Y1. Yk. Probabilitatea ca cel puțin un Yi a fost efectuat egalitatea

H (x) \u003d h (y)

ar fi mai mult de 0,5.

Pentru un Y. probabilitatea ca. H (x) \u003d h (y) , egal 1 / N. .

În consecință, probabilitatea ca , egal 1 - 1 / n .

Dacă creați k. Valori, probabilitatea ca nicio coincidente să fie egală cu produsul probabilităților care corespund unei valori, adică. (1 - 1 / n) k .

În consecință, probabilitatea de cel puțin o coincidență este egală

1 - (1 - 1 / n) k

Așa că am aflat că pentru asta m. - codul hash-ului este suficient pentru a alege 2m-1. Mesaje astfel încât probabilitatea coincidenței codurilor hash a fost mai mare de 0,5.

Acum luați în considerare următoarea sarcină: Denotă P (N, K) probabilitatea ca într-un set de k. elemente din care poate dura n. Valori, există cel puțin două valori. Ce ar trebui să fie egal k. la P (N, K) ar fi mai mult. 0,5 ?

Numărul de moduri diferite de a selecta elemente în așa fel încât să nu aibă un dublu, egal

n (N-1) ... (N - K + 1) \u003d N! / (N-K)!

Toate modalitățile posibile de a alege elemente egale n k.

Probabilitatea ca nici un dublu să fie egal n! / (N - k)! N k

Probabilitatea ca exista un duplicat, respectiv

1 - N! / (N-K)! NK P (N, K) \u003d 1 - N! / ((n - k)! x nk) \u003d 1 - (n x (n - 1) x ... x (n - k-1)) / nk \u003d 1 - [(N-1) / N X (N-2) / N X ... X (N-K + 1) / N] \u003d 1 - [(1-1 / N) x (1 - 2 / n) x ... x (1 - (k-1) / n)]

Dacă codul hash are o lungime m. Bit, adică Accept 2m. Valori, T.

Un rezultat similar se numește "paradox de ziua de naștere", deoarece, în conformitate cu argumentele de mai sus, pentru ca probabilitatea de coincidență a celor două persoane să fie mai mare de 0,5, ar trebui să existe doar 23 de persoane în grup. Acest rezultat pare minunat, poate pentru că pentru fiecare persoană individuală din grup, probabilitatea ca ziua de naștere a altcuiva din grup să coincide cu ziua de naștere, este destul de mică.

Să ne întoarcem la luarea în considerare a proprietăților funcțiilor HASH. Să presupunem că este utilizat codul de hash pe 64 de biți. Se poate considera că este destul de suficient și, prin urmare, o lungime sigură pentru codul hash. De exemplu, dacă codul hash criptat DIN Transmise cu mesajul adecvat necriptat M. , atunci inamicul va trebui să găsească M ' astfel încât

N (m) \u003d n (m) ,

pentru a înlocui mesajul și pentru a înșela destinatarul. În medie, inamicul ar trebui să spargă prin 263 de mesaje pentru a găsi acest lucru că codul hash este egal cu mesajul interceptat.

Cu toate acestea, sunt posibile diferite tipuri de atacuri bazate pe "paradoxul de naștere". Următoarea strategie este posibilă:

1. Inamicul creează 2 m / 2 Opțiuni de mesaje, fiecare având un sens clar. Inamicul pregătește același număr de mesaje, fiecare dintre acestea fiind fals și intenționează să înlocuiască acest mesaj.

2. Două seturi de mesaje sunt comparate în căutarea unei perechi de mesaje care au același cod hash. Probabilitatea succesului în conformitate cu "paradoxul de naștere" este mai mare de 0,5. Dacă nu se găsește perechea potrivită, se creează mesaje suplimentare sursă și fals până când se găsește aburul.

3. Atacatorul oferă expeditorului versiunea inițială a mesajului pentru semnătură. Această semnătură poate fi apoi atașată unei opțiuni false pentru transferul către destinatar. Deoarece ambele opțiuni au același cod hash, se va crea aceeași semnătură. Inamicul va fi încrezător în succes, chiar nu cunoaște cheia de criptare.

Astfel, dacă se utilizează codul de hash pe 64 de biți, complexitatea necesară a calculelor este de aproximativ 232.

În concluzie, observăm că lungimea codului hash trebuie să fie destul de mare. Lungimea egală cu 64 de biți nu este în prezent considerată sigură. Este de preferat ca lungimea să treacă ordinea a 100 de biți.

Folosind un lanț de blocuri criptate

Există diverse funcții hash bazate pe crearea unui lanț de blocuri criptate, dar fără a utiliza o cheie secretă. Una dintre aceste funcții hash a fost propusă de Rabin. Mesaj M. împărțiți pe blocuri de lungime fixă M1, M2 ,. . . , Mn. și folosind un algoritm de criptare simetrică, cum ar fi DES, pentru a calcula codul hash G. În felul următor:

H 0. - sensul inițial N i. = E mi. G. = H n.

Acest lucru este similar cu utilizarea criptării în modul CSA, dar în acest caz nu există nici o cheie secretă. Ca și în cazul oricărei funcții Hash simple, acest algoritm este susceptibil la "atac de ziua de naștere", iar dacă algoritmul de criptare este des și se creează doar un cod de hash pe 64 de biți, sistemul este considerat destul de vulnerabil.

Pot exista alte atacuri cum ar fi "ziua de naștere", care sunt posibile chiar dacă inamicul are acces la un singur mesaj și codul hash criptat corespunzător și nu poate primi mai multe perechi de mesaje și coduri hash criptate. Următorul scenariu este posibil: să presupunem că inamicul a interceptat un mesaj cu un autentificator sub forma unui cod hash criptat și se știe că codul de hash necriptat are o lungime m. biți. Apoi, inamicul trebuie să efectueze următoarele acțiuni:

· Utilizarea algoritmului descris mai sus, calculați codul hash necriptat G. .

· Creați un mesaj fals în formular Q1, Q2 ,. . . , QN-2 .

· Calculati N i \u003d e qi pentru 1 <= i <= N-2 .

· Crea 2 m / 2 Blocuri aleatoare H. Și pentru fiecare astfel de bloc H. calculati E H. . Creați în plus 2 m / 2 Bloc suficient Y. și pentru fiecare bloc Y. calculati D y [g] Unde D. - funcția de decorare corespunzătoare E. . Pe baza "paradoxului de naștere", putem spune că, cu un grad ridicat de probabilitate, această secvență va conține blocuri H. și Y. astfel încât E x \u003d d y [y] .

· Creați un mesaj Q1, Q2 ,. . . , Qn-2, x, y . Acest mesaj are un cod de hash G. Și, prin urmare, poate fi folosit cu un autentic criptat.

Această formă de atac este cunoscută ca o întâlnire de atac în mijloc ". În diferite studii, sunt oferite mai multe metode subtile pentru a spori o abordare bazată pe lanțul bloc. De exemplu, Devis și prețul descris următoarea opțiune:

O altă opțiune este posibilă:

Cu toate acestea, ambele scheme au, de asemenea, vulnerabilități la diferite atacuri. Într-un caz mai general, se poate demonstra că o formă "atac de aniversare" are succes cu orice algoritm hash, care include utilizarea unui lanț de blocuri criptate fără a utiliza o cheie secretă.

Cercetările ulterioare au vizat găsirea altor abordări pentru crearea funcțiilor hashing.

Funcția Hash MD5

Luați în considerare algoritmul MED-ului Digest (RFC 1321) dezvoltat de RON Rivesom de la MIT.

MD5 Logic de execuție

Algoritmul primește o lungime arbitrară la intrare și creează un mesaj de 128 de mesaje de lot ca o ieșire. Algoritmul constă din următorii pași:

Smochin. 8.1.MD5 Logic de execuție

Pasul 1: Adăugarea biților lipsă

Mesajul este completat astfel încât lungimea sa să devină egală cu 448 Modulo 512 (). Aceasta înseamnă că lungimea mesajului adăugat cu 64 de biți este mai mică decât numărul, mai multe 512. Adăugarea este întotdeauna efectuată, chiar dacă mesajul are lungimea dorită. De exemplu, dacă lungimea mesajului este de 448, este completată cu 512 biți la 960 de biți. Astfel, numărul de biți adăugați este în intervalul de la 1 la 512.

Adăugarea constă dintr-o unitate pentru care urmează numărul necesar de zerouri.

Pasul 2: Adăugarea lungimii

Reprezentarea pe 64 de biți a lungimii sursei (înainte de adăugarea) mesajelor din biți este legată la rezultatul primului pas. Dacă lungimea inițială este mai mare de 2,64, se utilizează numai ultimii 64 de biți. Astfel, câmpul conține lungimea mesajului sursă de către modulul 2 64.

Ca rezultat al primilor doi pași, este creat un mesaj, dintre care lungimea este mai mare de 512 biți. Acest mesaj extins este reprezentat ca o secvență de blocuri de 512 de biți Y 0, Y 1 ,. . ., Y L-1, în timp ce lungimea totală a mesajului extins este egală cu biții L * 512. Astfel, lungimea mesajului avansat primit este de peste șaisprezece cuvinte pe 32 de biți.

Smochin. 8.2.Structura unui mesaj extins

Pasul 3: Inițializarea MD-tampon

Se utilizează un tampon de 128 de biți pentru stocarea rezultatelor intermediare și finale ale funcției hash. Tamponul poate fi reprezentat ca patru registre pe 32 de biți (A, B, C, D). Aceste registre sunt inițializate prin următoarele numere hexazecimale:

A \u003d 01234567 B \u003d 89ABCDEF C \u003d FEDCBA98 D \u003d 76543210

Pasul 4: Prelucrarea secvenței blocurilor de 512 biți (16-litrice)

Baza algoritmului este un modul constând din patru tratamente ciclice, denumite ca HMD5. Patru cicluri au o structură similară, dar fiecare ciclu utilizează funcția logică elementară, notată de F F, F G, F H și F I I, respectiv.

Smochin. 8.3.Procesarea următorului bloc de 512 de biți

Fiecare ciclu are ca curent de intrare 512-biți block y Q Q, procesat în prezent și valoarea de 128 de biți a tamponului ABCD, care este o valoare digerată intermediară și modifică conținutul acestui tampon. Fiecare ciclu utilizează, de asemenea, cea de-a patra parte a tabelului de 64 de elemente T, pe baza funcției de păcat. Elementul I, denotat de T [I], este egal cu întreaga parte a 22 * \u200b\u200bABS (păcat (I)), sunt pus în radiani. Deoarece ABS (păcat (I)) este un număr între 0 și 1, fiecare element t este un întreg care poate fi reprezentat de 32 de biți. Tabelul oferă un set "aleatoriu" de valori pe 32 de biți care trebuie să elimine orice regularitate în datele de intrare.

Pentru a obține MD Q + 1, randamentul a patru cicluri este format din modulul 2 32 cu MD Q. Adăugarea se efectuează independent pentru fiecare dintre cele patru cuvinte din tampon.

CLS S este o trecere ciclică în partea stângă a biților de argumentare pe 32 de biți.

X [k] - M - K-O Cuvânt pe 32 de biți în blocul de mesaje Q-Ohm 512.

T [i] - I-O, Cuvânt pe 32 de biți în matrice T.

+ - Adăugarea modulului 2 32.

La fiecare dintre cele patru cicluri ale algoritmului, se utilizează una dintre cele patru funcții logice elementare. Fiecare caracteristică elementară primește trei cuvinte pe 32 de biți la intrare, iar ieșirea creează un cuvânt pe 32 de biți. Fiecare funcție este o multitudine de operații logice lot, adică NTH Bitul de ieșire este o funcție din partea N-B de trei intrări. Funcțiile elementare sunt după cum urmează:

O serie de cuvinte pe 32 de biți x conține valoarea blocului de intrare curent de 512 biți, care este procesat în prezent. Fiecare ciclu rulează de 16 ori, iar de când fiecare bloc al mesajului de intrare este procesat în patru cicluri, fiecare unitate de intrare este procesată în conformitate cu diagrama prezentată în fig. 4, 64 de ori. Dacă trimiteți blocul de intrare pe 512-biți sub formă de șaisprezece cuvinte pe 32 de biți, fiecare cuvânt de intrare pe 32 de biți este utilizat de patru ori, o singură dată în fiecare ciclu și fiecare element al tabelului T, constând din 64 de 32 de biți Cuvintele, este folosit doar o singură dată. După fiecare etapă a ciclului, se produce o trecere ciclică la stânga a patru cuvinte A, B, C și D. La fiecare pas, doar unul dintre cele patru cuvinte ale tamponului ABCD se schimbă. În consecință, fiecare cuvânt tampon variază de 16 ori, iar apoi a 17-a oară la capăt pentru a obține ieșirea finală a acestei unități.

digera.

2. Viteza: Implementarea programului algoritmului trebuie efectuată destul de repede. În special, algoritmul trebuie să fie suficient de rapid pe o arhitectură pe 32 de biți. Prin urmare, algoritmul se bazează pe un set simplu de operații elementare pe 32 de cuvinte.

3. Simplitate și compactitudine: Algoritmul ar trebui să fie simplu în descriere și ușor de programat, fără programe mari sau metacardă. Aceste caracteristici nu numai că au beneficii de program evidente, ci și de dorit în ceea ce privește securitatea, pentru că analizarea posibilelor puncte slabe este mai bine să aveți un algoritm simplu.

4. Dorifete de arhitectura puțin echitabilă: unele arhitecturi de procesor (cum ar fi linia Intel 80xxx) stochează cuvintele de la adresele octeților inferioare ale octetului (micul-endian). Altele (cum ar fi sparcstationul soarelui) stochează octeții corecți ai cuvântului în poziția adreselor de octeți junior (constantă suplimentară MD4 mare în primul ciclu nu se aplică. O constantă suplimentară similară este utilizată pentru fiecare pas în al doilea ciclu. Un altul suplimentar Constant este utilizat pentru fiecare dintre pașii din cel de-al treilea ciclu.. Codul hash este o funcție din fiecare biți de intrare. Repetarea complexă a funcțiilor elementare FF F, FG, FH și FI asigură că rezultatul este bine amestecat; că este puțin probabil ca două mesaje selectate întâmplător, chiar dacă au modele similare similare, au avut aceeași digerare, care creează aceeași valoare de ieșire. Aceasta înseamnă că execuția MD5 pe un singur bloc de 512 biți va duce la Aceeași ieșire pentru două valori diferite de intrare în tamponul ABCD. În timp ce metoda de extindere a acestei abordări pentru un atac de succes MD5 nu există.