Co je funkce hash. Kryptografické hash funkce

Vyhledávací algoritmy, které jsme považovali, jsou obvykle založeny na abstraktní srovnávací operaci. Z této série se distribuční metoda popsaná v "Symbolových stolech a binárních vyhledávacích stromech", který je uložen v I-th poloze tabulky, která vám umožní odkazovat se na něj přímo. S distribucí vyhledávání jsou klíče používány jako index pole a ne operandy srovnávací operace; Samotná metoda je založena na skutečnosti, že klíče jsou různá celá čísla ze stejného rozsahu jako indexy tabulky. V této kapitole se podíváme na hash (hashing) - rozšířenou verzi vyhledávání distribuce, která se používá ve více typických vyhledávacích aplikacích, kde klíče nemají tak pohodlné vlastnosti. Konečného výsledku žádosti tento přístup Není absolutně podobné metodám založeným na srovnání - namísto pohybu prostřednictvím datových struktur slovníku porovnáním klíčových klíčových klíčů v prvcích, snažíme se obrátit na položky v tabulce přímo provedením aritmetické konverze klíčů na adresy tabulky.

Vyhledávací algoritmy pomocí hash se skládají ze dvou samostatných dílů. Prvním krokem je vypočítat funkci hash (funkce hash), která převádí klíč vyhledávání k tabulce. V ideálním případě by se pro různé adresy musely zobrazit různé klíče, ale často dvě nebo více různých klíčů mohou dát stejnou adresu v tabulce. Druhá část hledání metodou hash je proto proces řešení kolizí (řešení kolizí), které tyto klíče zpracovává. V jednom z metod pro řešení konfliktů, které v této kapitole zvážíme, jsou používány připojené seznamy, takže najde přímé použití v dynamických situacích, kdy je obtížné předvrátit počet vyhledávacích klíčů. V dalších dvou metodách řešení kolizí, vysoce dosažené výkon Vyhledávání, protože prvky jsou uloženy v pevném poli. Budeme zvažovat způsob zlepšení těchto metod, což vám umožní použít je a v případech, kdy je nemožné předvídat velikost tabulky předem.

Hash je dobrým příkladem rovnováhy mezi časem a pamětí. Pokud nebyla žádná omezení ve výši použité paměti, lze jakékoli vyhledávání provedeno pomocí pouze jednoho přístupu k paměti, jednoduše pomocí klíče jako adresu paměti, jako s distribucí vyhledávání. Tento ideální případ je však obvykle nedosažitelný, protože dlouhé klíče mohou vyžadovat obrovské množství paměti. Na druhou stranu, pokud nebyla žádná omezení dodací lhůtaBylo by možné s minimální pamětí, pomocí metody sekvenčního hledání. Hash je způsob, jak použít přijatelný objem paměti a času a dosažení rovnováhy mezi těmito dvěma extrémními požadavky. Zejména můžete podpořit libovolnou váhu, jednoduše změnit velikost tabulky, a nepřepisovat kód a bez výběru jiných algoritmů.

Hashing je jedním z klasických úkolů počítačových věd: jeho různé algoritmy jsou podrobně studovány a jsou široce používány. Uvidíme, že vůbec žádné tvrdé předpoklady, můžete doufat, že podporují operace najít a vložit v tabulkách symbolů s konstantním časem provedení, bez ohledu na velikost tabulky.

Tato očekávaná hodnota je teoretická výkonnost optimální pro jakoukoliv implementaci tabulky symbolů, ale hash stále není všelékařem za dva hlavní důvody. Za prvé, dodací lhůta Záleží na délce klíče, která v reálných aplikacích pomocí dlouhých klíčů může být významná. Zadruhé, Hashing neposkytuje účinnou implementaci jiných operací se symbolickými tabulkami, jako je výběr nebo třídění. V této kapitole budeme podrobně zvážit tyto a další otázky.

Funkce hash.

Především je nutné vyřešit úkol výpočtu funkce hash, která převádí klávesy na adresu tabulky. Implementace tohoto aritmetického výpočtu obvykle nepředstavuje složitost, ale je stále nutné dodržovat péči, tak, aby nedošlo k různým nízkým náročným úskalím. Pokud existuje tabulka, která může obsahovat prvky M, potřebujete funkci, která převádí klíče na celá čísla v rozsahu. Ideální funkce hash by měla být snadno vypočítat a být podobná náhodné funkci: Pro všechny argumenty by měly být výsledky v určitém smyslu ekvivalentní.

Funkce Hash závisí na typu klíče. Přísně řečeno, samostatná funkce hash vyžaduje samostatný typ klíče. Pro zvýšení účinnosti je obvykle žádoucí, aby se zabránilo explicitně konverzi typů, kontaktování myšlenky zvážení binární prezentace klíčů v strojním slova jako celé číslo, které lze použít v aritmetických výpočtech. Hash se objevil před jazyky na vysoké úrovni - na počátečních počítačích byla obvyklá záležitost zvážit libovolnou hodnotu jako klíč řetězce, pak jako celé číslo. V některých jazycích na vysoké úrovni je obtížné vytvářet programy, které závisí na prezentaci klíčů v určitém počítači, protože tyto programy jsou v podstatě závislé na stroji, a proto jsou obtížné převést do jiného počítače. Typicky, hash funkce závisí na klíčovém procesu konverze do celých čísel, proto je obtížné současně poskytovat nezávislost stroje a účinnost v implementacích hash. Jednoduché celočíselné klíče nebo klávesy typu plovoucí desetinné činy lze zpravidla převést pomocí pouze jednoho provozu stroje, ale řetězová tlačítka a další typy složených klíčů vyžadují vysoké náklady a větší pozornost účinnosti.

Nejjednodušší situace je pravděpodobně, když klíče jsou čísla s plovoucím bodem z pevného rozsahu. Například, pokud jsou klíče čísla, velká 0 a menší 1, může být jednoduše vynásobena m, kroucení výsledkem s menším celým číslem a získat adresu do rozsahu mezi 0 a m - 1; Tento příklad je znázorněn na Obr. 14.1. Pokud jsou klíče větší než s a méně než t, mohou být zmenšeny, odečteny a dělící se na TS, v důsledku toho spadají do rozsahu hodnot mezi 0 a 1, a pak se množí na m a dostat se adresu v tabulce.


Obr. 14.1.

Chcete-li převést číselnost s plovoucí desetinnou čárkou v rozsahu mezi 0 a 1 k indexům tabulky, jehož velikost je 97, vynásobte tato čísla o 97. V tomto příkladu se vyskytly tři konflikty: pro indexy rovné 17, 53 a 76. Hodnoty hash jsou určeny vybíráním starších klíčů, mladší výboje nehrají žádnou roli. Jedním z cílů rozvoje hašovací funkce je eliminovat takovou nerovnováhu tak, aby byl každý propuštěn v průběhu výpočtu.

Pokud jsou klíče W-bitová celá čísla, mohou být převedeny na čísla s plovoucí desetinnou čárkou a rozděleny 2 w pro získání čísel plovoucích bodů v rozsahu mezi 0 a 1, a pak se množí na m, jako v předchozím odstavci. Pokud operace plovoucí desetinné body zabírají spoustu času a čísla nejsou tak vysoká, aby vedla k přetečení, stejný výsledek lze získat pomocí celočíselných aritmetických operací: Musíte násobit klíč k m, a pak provést posun na Právo na w výboji rozdělit 2 w (nebo pokud násobení vede k přetečení, posunu, a pak násobení). Tyto metody jsou k ničemu pro hash, pokud nejsou klíče rovnoměrně rozloženy rozsahem, protože hodnota hash je určena pouze předními číslicemi klíče.

Jednoduchý I. efektivní metoda Pro W-bitová celá čísla - jeden z možná nejčastěji používaných metod hash - volba jako velikosti m tabulka jednoduchého čísla a výpočtu zbytku od dělení m, tj. h (k) \u003d k mod m pro libovolný celočíselný klíč k. Tato funkce se nazývá modulární hash funkce. Je velmi snadné spočítat (k% m v C ++) a je účinný pro dosažení rovnoměrné distribuce klíčových hodnot mezi hodnotami menší M. Malý příklad je znázorněn na Obr. 14.2.


Obr. 14.2.

Ve třech pravých sloupcích se zobrazí výsledek 7bitových tlačítek zobrazených vlevo, pomocí následujících funkcí:

v% 97 (vlevo)

v% 100 (střed) a

(INT) (A * v)% 100 (vpravo),

kde A \u003d .618033. Velikosti tabulky pro tyto funkce jsou respektive 97, 100 a 100. Hodnoty vypadají náhodně (protože klíče jsou náhodné). Druhá funkce (v% 100) používá pouze dvě extrémní správné číslice klíčů, a proto pro nenárokové klávesy mohou zobrazit nízký výkon.

Modulární hash se vztahuje na klíče s plovoucí desetinnou čárkou. Pokud klíče patří do malého rozsahu, mohou být zmenšeny do čísel z rozsahu mezi 0 a 1, 2 W pro získání hodnot W-bitových celých čísel a poté pomocí modulární funkce hash. Další možností je jednoduše použít modulární hash-funkce binární klíčová prezentace (je-li k dispozici).

Modulární hash se aplikuje ve všech případech, kdy přístup k bitům, ze kterých klíče sestávají, bez ohledu na to, zda jsou celá čísla reprezentovaná strojem stroje, posloupnost symbolů zabalených ve strojírenství, nebo jsou reprezentovány jinými možná volba. Sekvence náhodných symbolů zabalených do stroje není přesně stejná jako náhodná celočíselná tlačítka, protože ne všechny výboje se používají pro kódování. Oba tyto typy (a jakýkoli jiný typ klíče kódované tak, aby se vešly do stroje, mohou být vyrobeny tak, aby vypadaly jako náhodné indexy v malém stole.

Hlavním důvodem výběru jako velikosti M Hash tabulky jednoduchého čísla modulární hash je znázorněno na Obr. 14.3. V tomto příkladu je symbolická data s 7bitovým kódováním, klíč je interpretován jako číslo se základnou 128 - o jednu číslici pro každý znak v klíči. Nyní Slovo odpovídá číslu 1816567, které lze také napsat jako

vzhledem k tomu, že kódové symboly ASCII N, O a W odpovídají číslům 1568 \u003d 110, 1578 \u003d 111 a 1678 \u003d 119. Velikost tabulky M \u003d 64 pro tento typ klíče je neúspěšná, protože přidávání hodnot X, více než 64 (nebo 128), nemění hodnotu X MO 64 - pro libovolný klíč, hodnota funkce hash je Hodnota posledních 6 číslic tohoto klíče. Dobrá funkce hash musí samozřejmě vzít v úvahu všechny vypouštění klíčů, zejména pro symbolické klíče. Podobné situace mohou nastat, když m obsahuje násobitel, který je stupeň 2. Nejjednodušší způsob Vyhněte se tomu - vyberte si jako M jednoduché číslo.


Obr. 14.3.

V každé řadě této tabulky jste: 3-písmenové slovo, prezentace tohoto slova v kódu ASCII jako 21bitové číslo v oktanových a desetinných vzorcích a standardních modulárních hash funkcí pro velikosti tabulek 64 a 31 (dva Extrémní sloupec vpravo). Velikost tabulky 64 vede k nežádoucím výsledkům, protože k získání hodnoty hash se používají pouze nejvzdálenější vypouštění klíčů a písmena slovy obvyklého jazyka jsou nerovnoměrně distribuovány. Například všechna slova obdařená písmenem Y odpovídají hodnotě hash 57. A naopak jednoduchá hodnota 31 způsobuje méně konfliktů v tabulce více než dvakrát vyšší než dvakrát vyšší.

Modulární hash je velmi snadno implementován, s výjimkou, že velikost tabulky musí být jednoduché číslo. Pro některé aplikace můžete být spokojeni s malým jednorázovým jednoduchým číslem nebo hledáním v seznamu slavných primárních čísel, která je blízká požadované velikosti tabulky. Například čísla jsou 2 t - 1, jsou jednoduché t \u003d 2, 3, 5, 7, 13, 17, 19 a 31 (A v žádném jiném hodnotách t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не jediný důvodna které velikost tabulky stojí za jednoduché číslo; Dalším důvodem je v kapitole 14.4 zvažován.


Obr. 14.4.

Tato tabulka je největší jednoduchá čísla menší než 2 n, pro Lze použít pro distribuci Dynamic Hash Stoly, když je nutné, aby velikost tabulky je jednoduché číslo. Pro jakoukoliv kladnou hodnotu v rozsahu pokryté, tato tabulka lze použít k určení jednoduchého čísla, které se liší od něj méně než dvakrát.

Dalším provedením celočíselných klíčů je kombinací multiplikativních a modulárních metod: Musíte násobit klíč k konstantu v rozsahu mezi 0 a 1, a pak učinit divizi modulem M. Jinými slovy, musíte použít funkci. Mezi hodnotami, M a účinnou základnou systému klíčového čísla existuje vztah, který by teoreticky mohl vést k anomálnímu chování, ale pokud používáte libovolnou hodnotu A, in skutečná příloha Je nepravděpodobné, že by měl nějaký problém. Často, jako A, hodnota F \u003d 0,618033 ... (Zlatá sekce) je vybrána.

Na tomto tématu bylo studováno mnoho dalších variant, zejména hash funkce, které lze implementovat pomocí takových efektivních instrukcí strojů, jako je výběr posunu a masky (viz odkazy).

V mnoha aplikacích, které používají tabulky symbolů, klávesy nejsou čísly a nejsou nutně krátké; Častěji jsou alfanumerické linie, které mohou být velmi dlouhé. No, jak vypočítat hash funkci pro slovo jako AverylongKey?

V 7bitové ASCII kódu ASCII toto slovo odpovídá 84bitovému číslu začít (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 CDOT 128 ^ (0), konec (ALIGN *),

který je příliš velký, takže obvyklé aritmetické funkce mohou být prováděny ve většině počítačů. A často je nutné zvládnout a mnohem delší klíče.

Pro výpočet modulární funkce hash pro dlouhé klávesy jsou převedeny na fragment na fragment. Můžete použít aritmetické vlastnosti modulu funkce a používat algoritmus Gorner (viz bod 4.9 "Abstraktní datové typy"). Tato metoda je založena na jiném způsobu záznamu čísel odpovídajících kláves. Pro zvážení příkladu píšeme následující výraz: začít (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. \\ t *)

To znamená, že desetinné číslo odpovídající kódování znaků řetězce lze vypočítat při jeho zobrazení zleva doprava, vynásobte akumulovanou hodnotu na 128 a poté přidejte kód kódu dalšího symbolu. V případě dlouhého řetězce bude tento způsob výpočtu nakonec vést k velkému, který lze předložit vůbec v počítači. Toto číslo však není nutné, protože pouze (malý) zbytek je vyžadován od jeho rozdělení na M. Výsledek lze získat, aniž by i udržel akumulované hodnoty, protože Výpočet může být kdykoliv vyřazen více m - pokaždé, když provádíte násobení a přidávání, je nutné uložit pouze zbytek z divizního modulu M. Výsledek bude stejný, jako kdybychom měli možnost vypočítat Dlouhé číslo a pak provést divizi (viz. Cvičení 14.10). Toto pozorování vede k přímé aritmetické metodě pro výpočet modulárních hash funkcí pro dlouhé čáry - viz program 14.1. Tento program používá další, poslední uzel: místo základny 128, používá jednoduché číslo 127. Důvodem této změny je v následujícím odstavci zvažován.

Existuje mnoho způsobů, jak vypočítat hash funkce přibližně se stejnými náklady jako pro modulární hash pomocí metody Gorner (jeden nebo dva aritmetické operace Pro každý symbol v klíči). Pro náhodné klíče se tyto metody prakticky neliší od sebe, ale reálné klíče jsou zřídka náhodné. Možnost za nízké náklady na nízké náklady, aby reálné klíče náhodné typu vede k zvážení randomizovaných hashových algoritmů, protože potřebujeme hash funkce, které vytvářejí indexy náhodných tabulek bez ohledu na distribuci klíčů. Není těžké uspořádat randomizaci, protože není nutné doslova držet s definicí modulární hash - je nutné pouze vypočítat celé množství menších m, byly použity všechny klíčové vypouštění.

M \u003d 96 a A \u003d 128 (nahoře)

M \u003d 97 a A \u003d 128 (střed) a

M \u003d 96 a A \u003d 127 (níže)

Nerovnoměrná distribuce v prvním případě je výsledkem nerovnoměrného využití písmen a uchování nerovnoměrnosti v důsledku skutečnosti, že velikost tabulky a multiplikátoru multiplikátoru 32. Dva další příklady vypadají náhodně, protože velikost tabulky a multiplikátoru jsou vzájemně jednoduchá čísla.

Program 14.1 ukazuje jeden ze způsobů, jak to udělat: pomocí jednoduché základny namísto stupně 2 a celé číslo odpovídající reprezentaci ASCII řetězce. Na Obr. 14,5 Obr. 14.5 Zobrazí se, jak tato změna zlepšuje distribuci typických klíčů řetězců. Teoreticky hash hodnoty vytvořené programem 14.1 mohou poskytnout špatné výsledky pro velikosti tabulky, které jsou více 127 (i když v praxi je pravděpodobné, že bude téměř nepostřehnutelný); Chcete-li vytvořit randomizovaný algoritmus, bylo by možné vybrat hodnotu násobitele náhodně. Ještě efektivnější přístup je používat náhodné hodnoty koeficientů v výpočtu a různých náhodných hodnot pro každé číslo klíče. Tento přístup poskytuje randomizovaný algoritmus zvaný univerzální hash (Universal Hashing).

Teoreticky je ideální univerzální hash funkce funkce, pro kterou pravděpodobnost kolize mezi dvěma různými klíči v tabulce s rozměrem m je přesně rovna 1 / m. Lze prokázat, že použití jako koeficient A v programu 14.1 není pevná libovolná hodnota a sekvence náhodných různých hodnot převádí modulární hash do funkce univerzální hash. Náklady na generování nového náhodného čísla pro každý symbol v klíči je však obvykle nepřijatelné. V praxi je možné dosáhnout kompromisu uvedeného v programu 14.1, aniž by bylo zachováno množství různých náhodných čísel pro každý klíčový symbol, a mění se koeficienty pomocí generování jednoduché pseudo-náhodné sekvence.

Budeme shrnout: Chcete-li implementovat abstraktní znaková tabulka pro použití hash, musíte nejprve rozšířit rozhraní abstraktního typu, otočením na hash operaci, která zobrazuje klíče k negativním celým čísli, menší velikost tabulky M.

V rámci tohoto článku vám řeknu co je hash.Proč je potřeba, kde a jak se používá, stejně jako nejznámější příklady.

Mnoho výzev v oblasti informačních technologií je velmi kritické pro svazky dat. Pokud například potřebujete porovnat dva soubory s velikostí 1 kb a dva soubory 10 GB, pak je to zcela odlišný čas. Proto jsou algoritmy, které umožňují pracovat s kratšími a způsobivními hodnotami, jsou považovány za velmi populární.

Jedna taková technologie je hashing, která našla jeho použití při řešení hmotnosti úkolů. Ale myslím, že, jako obyčejný uživatel, je stále nepochopitelný, jaký druh šelmy je to pro to, co potřebuje. Proto se pokusím vysvětlit všechna nejjednodušší slova.

Poznámka: Materiál je určen pro obyčejné uživatele a neobsahuje mnoho technických aspektů, nicméně, pro základní seznámení je více než dost.

Co je hash nebo hashing?

Začnu s podmínkami.

Funkce hash, funkce konvoluce - Jedná se o speciální funkci, která umožňuje převést libovolnou délku textů na pevnou délku (obvykle krátký digitální záznam).

Hashing. - Jedná se o proces transformace zdrojových textů.

Hash, hash kód, hodnota hash, hash-sum - Jedná se o výstupní hodnotu hašovací funkce, tj. Výsledný blok je pevná délka.

Jak vidíte, termíny mají několik tvaru popisu, ze kterého je obtížné pochopit, proč je to všechno nezbytné. Proto budu okamžitě poskytnout malý příklad (o jiných aplikacích bude o něco o něco později). Předpokládejme, že máte 2 soubory 10 GB. Jak můžete rychle zjistit, který potřebuje? Můžete použít název souboru, ale snadno jej přejmenovat. Můžete sledovat data, ale po kopírování souborů souborů mohou být stejné nebo v jiných sekvencích. Velikost, jak vy sami chápete, málo může pomoci (zejména pokud se rozměry shodují nebo jste se nedívali na přesné hodnoty bytů).

Je to tady, že potřebujete tuto velmi hash, což je krátký blok, který je generován ze zdrojového textu souboru. Tyto dva soubory 10 GB budou mít dva různé, ale krátké hash kód (něco jako "ACCAC43535" a "BBB3232A42"). Pomocí nich můžete rychle zjistit požadovaný soubor.Dokonce i po kopírování a změně jmen.

Poznámka: Vzhledem k tomu, že hash v počítači světa a na internetu je velmi dobře známý koncept, pak to je často vše, co souvisí s hash, je na toto velmi slovo sníženo. Například fráze "používám hash md5" v překladu znamená, že na místě nebo někde jinde je používána hashovacím algoritmem standardu MD5.

Hash vlastnosti

Teď vám řeknu o vlastnostech hash funkcí, takže je pro vás snazší pochopit, kde se používá a pro to, co potřebujete mít. Ale první definice.

Kolize - To je situace, kdy se jedná o stejnou částku hash pro dvě různé texty. Jak víte, kdysi blok pevné délky má omezený počet možných hodnot, a proto opakování jsou možné.

A teď na vlastnosti hash funkcí:

1. Text může být napájen do textu libovolné velikosti a výstup je datový blok s pevnou délkou. To vyplývá z definice.

2. Hash-součet stejných textů by mělo být stejné. Jinak tyto funkce jsou prostě k ničemu - to je podobné náhodnému číslu.

3. Dobrá funkce konvoluce musí mít dobrou distribuci. Souhlasíte s tím, že pokud je velikost výstupního hash, je například 16 bajtů, poté, pokud funkce vrátí pouze 3 různé hodnoty pro všechny texty, pak žádný vliv na takovou funkci a tyto 16 bajtů (16 bytů jsou 2 ^ 128 Možnosti, což je přibližně 3, 4 * 10 ^ 38 stupňů).

4. Jak dobře reaguje funkce na sebemenší změny ve zdrojovém textu. Jednoduchý příklad. Změněno 1 písmeno v souboru 10 GB, hodnota funkce by měla být odlišná. Pokud tomu tak není, pak je to velmi problematické aplikovat takovou funkci.

5. Pravděpodobnost výskytu kolize. Velmi složitý parametr vypočítaný za určitých podmínek. Jeho podstatou je však, že to, co je bod hash funkce, pokud se výsledný hash součet bude často shodovat.

6. Míra výpočtu Hasha. Co je to hodně z funkce konvoluce, pokud je delší dobu počítat? Ne, protože soubory jsou snazší porovnat nebo používat jiný přístup.

7. Složitost obnovení zdrojových dat z hodnoty hash. Tato vlastnost je konkrétnější než celkově, protože není nutné všude. Pro nejslavnější algoritmy je však vyhodnocena tato charakteristika. Například zdrojový soubor, který můžete sotva dostat z této funkce. Pokud však problému kolize dojde (například musíte najít libovolný text, který odpovídá takovému hash), pak tato vlastnost může být důležitá. Například hesla, ale o něco později.

8. Otevřeno nebo zavřený zdrojový kód pro takovou funkci. Pokud kód není otevřen, dotyčná složitost obnovení dat, jmenovitě kryptobylility. Částečně je to problém s šifrováním.

Nyní můžete jít na otázku "a proč je to všechno?".

Proč potřebujete hash?

Hlavními cíli hash funkcí jsou pouze tři (nebo spíše jejich účel).

1. Zkontrolujte integritu dat. V tento případ Všechno je jednoduché, taková funkce by měla být vypočtena rychle a umožňovala rychle zkontrolovat, že například soubor stažený z Internetu nebyl během přenosu poškozen.

2. Rychlost vyhledávání dat. Velikost pevné bloky umožňuje získat spoustu výhod při řešení úkolů vyhledávání. V tomto případě mluvíme o tom, co je čistě technicky, použití hash funkcí může mít pozitivní vliv na výkon. Pro takové funkce je velmi důležitá pravděpodobnost kolize a dobré distribuce.

3. Pro kryptografické potřeby. Tento druh Funkce konvoluce se používají v oblastech bezpečnosti, kde je důležité, aby výsledky byly obtížné nahradit nebo tam, kde je nutné komplikovat úkol získání co nejvíce. užitečné informace z hash.

Kde a jak se používá hash?

Jak jste pravděpodobně již hádali, že hash platí při řešení mnoha úkolů. Tady jsou některé z nich:

1. Hesla jsou obvykle uložena v otevřeném formuláři, ale ve formě hash shrnuje, což umožňuje zajistit vyšší stupeň zabezpečení. Koneckonců, i když útočník obdrží přístup k takové databázi, stále bude muset strávit spoustu času vyzvednout příslušné texty na tyto hash kódy. Zde je charakteristika "složitost obnovení počátečních dat z hodnot hash".

Poznámka: Doporučuji vám seznámit s článkem pár tipů, abychom zlepšili bezpečnost hesel.

2. V programování včetně databází. Samozřejmě, nejčastěji mluvíme o datových strukturách, které umožňují rychlé hledání. Čistý technický aspekt.

3. Při přenosu dat (včetně Internetu). Mnoho protokolů, jako je TCP / IP, zahrnují speciální kontrolní pole obsahující hashovou hodnotu zdrojové zprávy, takže pokud došlo k poruše někde, neovlivnil přenos dat.

4. Pro různé algoritmy související s bezpečností. Například hash se používá v elektronických digitálních podpisech.

5. Chcete-li ověřit integritu souborů. Pokud jste věnovali pozornost, je často možné splnit soubory na internetu (například archivy) další popisy s hashovým kódem. Toto opatření se použije nejen tak, že nehodnotí soubor, který byl poškozen při stahování z internetu, ale také existuje jednoduchost hostování. V takových případech můžete rychle zkontrolovat hash a v případě potřeby, pak přehlížet soubor.

6. Někdy se hašovací funkce používají k vytvoření jedinečných identifikátorů (jako součást). Například při ukládání obrázků nebo jednoduše soubory obvykle používáte hash v názvech spolu s datem a časem. To vám umožní přepsat soubory se stejným názvem.

Vlastně, tím častěji se hašovací funkce používají informační technologie. Hlavně kvůli skutečnosti, že množství dat a moc nejvíce jednoduché počítače Silně zavrčel. V prvním případě jsme více o vyhledávání, a ve druhé jsme více o bezpečnostních otázkách.

Slavné hash funkce

Nejznámější jsou následující tři hash funkce.

Anotace: V této přednášce je formulován koncept funkce hash, stejně jako krátká recenze Algoritmy pro tvorbu hash funkcí. Kromě toho je považován za možnost použití blokových algoritmů pro šifrování pro vytvoření hash funkce.

Účelem přednášky: Seznámit se s konceptem "hash funkce", stejně jako s principy těchto funkcí.

Koncepce funkce hash

Funkce hash (funkce hash) Matematická nebo jiná funkce se nazývá, která pro řádky svévolné délky vypočítá některé celé číslo nebo jiný řetězec pevné délky. Matematicky to může být napsáno takto:

kde m je původní zpráva někdy zvanná současnost, dáreka h - výsledek nazvaný hash funkce (stejně jako kód hash. nebo digest zpráva (z angličtiny. digest zprávy.)).

Význam funkce hash je určení charakteristické funkce vzorku - význam funkce hash. Tato hodnota má obvykle určitou pevnou velikost, například 64 nebo 128 bitů. Kód Hash může být dále analyzován tak, aby vyřešil jakýkoliv úkol. Například Hashing lze použít k porovnání dat: Pokud jsou různé hash-kódy odlišné, jsou zaručeny pole; Pokud jsou stejné pole s největší pravděpodobností stejné. Obecně platí, že jednoznačná korespondence mezi zdrojovými daty a kodexem hash není způsobena skutečností, že počet funkcí hash je vždy menší než možnosti vstupu. Proto existuje mnoho vstupních zpráv, které poskytují stejné kódy hash (takové situace se nazývají kolisia). Pravděpodobnost výskytu kolizí hraje důležitou roli při posuzování kvality hash funkcí.

Funkce hash jsou široce používány v moderní kryptografii.

Nejjednodušší hash funkce může být připravena pomocí operace "součet modulu 2" následujícím způsobem: Získáme vstupní řetězec, složili všechny bajty modulu 2 a bajtový výsledek se vrátí jako hash fuch. Délka funkce hash bude v tomto případě 8 bitů bez ohledu na velikost vstupní zprávy.

Nechte například původní zprávu přeložena do digitálního zobrazení, následující (v hexadecimálním formátu):

Zpráva přeneseme na binární vzhled, psát bajty navzájem a položit bity v každém sloupci modulem 2:

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

Výsledek (0110 0101 (2) nebo 65 (16)) a bude hodnota funkce hash.

Taková funkce hash však nemůže být použita pro kryptografické účely, například pro formování elektronický podpisProtože je snadné změnit obsah podepsané zprávy bez změny hodnot kontrolního součtu.

Proto je zvažovaná funkce hash není vhodná pro kryptografické aplikace. V kryptografii je funkce hash považována za dobrou, pokud je obtížné vytvořit dva typy se stejnou funkcí hash, stejně jako v případě, že výstup funkce není výslovně závislý na vchodu.

Formulujeme základní požadavky na kryptografické hash funkce:

  • funkce HASH musí být použitelná pro zprávu o libovolné velikosti;
  • výpočet hodnoty funkce musí být provedeno dostatečně rychle;
  • s dobře známou hash funkcí by mělo být obtížné (téměř nemožné) najít vhodný prototyp m;
  • s dobře známou zprávou, M by mělo být těžké najít jinou zprávu m 'se stejnou hodnotou funkce hash, stejně jako zdrojová zpráva;
  • mělo by být obtížné najít libovolný pár náhodných různých zpráv se stejnou funkcí hash.

Vytvořit funkci hash, která splňuje všechny uvedené požadavky, není snadný úkol. Je také třeba si uvědomit, že funkce funkce je přijata na funkci libovolné velikosti a výsledek huss by neměl být stejně stejný pro tyto různé velikosti.

V současné době, v praxi, funkce zpracování vstupní zprávy se používají jako funkce hash, a výpočetní hash hodnota h i pro každý blok M vstupu na závislosti typu

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

kde h I-1 je výsledek získaný při výpočtu funkce hash předchozí blok Vstupní data.

Výsledkem je, že hash Funkce výtěžek H N je funkce ze všech vstupních bloků n.

Použijte šifrování blokových algoritmů pro vytvoření funkce hash

Můžete použít blok jako funkce hash. Pokud bloky používané bloku algoritmus kryptograficky, pak hash funkce založená na něm bude spolehlivá.

Nejjednodušší způsob, jak použít blokový algoritmus pro získání hash kódu, je šifrování zprávy v režimu CBC. V tomto případě je zpráva reprezentována jako posloupnost bloků, jejichž délka se rovná délce jednotky šifrovacího algoritmu. V případě potřeby je poslední jednotka doplněna na pravé nuly, takže jednotka požadované délky je. Hash bude poslední šifrovaný textový blok. S výhradou využití spolehlivého algoritmu šifrování bloku bude mít výsledná hodnota hash následující vlastnosti:

  • téměř nemožné, aniž by znemožnil šifrovací klíč kalkulace hodnot hash pro dané otevřené množství informací;
  • je prakticky nemožné, aniž by znemožnil šifrovací klíč výběru otevřených dat pod stanovenou hodnotou hash.

Housingová hodnota vytvořená tímto způsobem je obvykle volána imitovka nebo autentikátor a slouží ke kontrole integrity zprávy. Simulátor je tedy řídicí kombinací, která závisí na otevřených datech a tajných klíčových informacích. Účelem používání imitovky je detekovat všechny náhodné nebo úmyslné změny v řadě informací. Hodnota získaná funkcí hash při zpracování vstupní zprávy je připojena ke zprávě v okamžiku, kdy je známo, že zpráva je správná. Příjemce kontroluje integritu zprávy vypočítáním imitancí přijatého vzkazu a porovnávat jej s výsledným kódem hash, který musí být vysílán bezpečným způsobem. Jeden z těch bezpečné způsoby Možná šifrování imitovky uzavřený klíč odesílatel, tj. Vytvoření podpisu. Je také možné šifrovat získaný algoritmus kód hash pro symetrické šifrování, pokud mají odesílatel a příjemce obecný klíč symetrického šifrování.

Zadaný proces získávání a používání imitovky je popsán v domácím standardním GOST 28147-89. Standardní nabídky pro použití mladšího 32 bitů bloku získaného na výstupu šifrovacího provozu celé zprávy v režimu šifrování bloku pro monitorování integrity vysílané zprávy. Stejným způsobem může být použit jakýkoliv blok pro generování imitavky algoritmus symetrického šifrování.

Dalším možným způsobem, jak použít blokovou šifru pro generování hašovacího kódu je následující. Zdrojová zpráva je zpracována v sériových blokech. Poslední blok, v případě potřeby je doplněn nulami, někdy v posledním bloku připisujete délku zprávy ve formuláři binární čísla. V každé fázi šifrování hodnoty hash získané v předchozím stupni, přičemž současný blok zprávy jako klíč. Poslední zadaná šifrovaná hodnota bude konečná hash.

Ve skutečnosti, několik dalších schémat pro použití blokové šifry vytvořit hash funkci. Nechť mi být zdrojová bloková jednotka, hi - hodnota funkce hash na stupni I. stupně, f je blok šifrovacího algoritmu používaného v jednoduchém režimu náhrady - přídavný provoz modulu 2. Pak je možné, Například následující systémy tvorby funkcí hash:

Ve všech těchto diagramech se délka generované hodnoty hash rovná délce bloku během šifrování. Všechny tyto, stejně jako některé další systémy pro použití bloku algoritmu pro šifrování pro výpočet hodnot hash mohou být použity v praxi.

Hlavní nevýhodou funkcí hash určených na základě blokových algoritmů je relativně nízká rychlost Práce. Požadovaný kryptoskop lze také zajistit pro menší počet operací na vstupních datech. Existují rychlejší hashové algoritmy navržené nezávisle na nuly, založené na požadavcích na kryptické odolnosti (nejčastější z nich - MD5, SHA-1, SHA-2 a GOST R 34.11-94).


Co je hash?Funkce hash se nazývá matematická transformace informací v krátké, určité délce řetězce.

Proč to potřebuješ?Analýza pomocí hash funkcí je často používána pro monitorování integrity důležitých souborů. operační systém, důležité programy, důležitá data. Kontrola lze provádět jak podle potřeby, tak pravidelně.

Jak se to dělá?Zpočátku určete, která integrita, jejíž soubory musí být sledovány. Pro každý soubor se vypočítá pro výpočet hodnoty jeho hash přes speciální algoritmus při zachování výsledku. Po požadovaném čase se provádí podobný výpočet a výsledky jsou porovnány. Pokud se hodnoty liší, znamená to, že informace obsažené v souboru byla změněna.

Jaké vlastnosti by měly mít funkci hash?

  • musí být schopen provádět transformace údajů svévolné délky k pevnému;
  • musí mít otevřený algoritmus tak, aby byl jeho kryptoskop prozkoumán;
  • musí být jednostranný, to znamená, že by neměly být žádné matematické schopnosti stanovením zdrojových dat;
  • musí "odolat" konfliktům, to znamená, že by nemělo dát stejné hodnoty s různými vstupními údaji;
  • by neměly vyžadovat velké výpočetní prostředky;
  • s sebemenší změnou vstupních dat se výsledek významně změní.

Jaké jsou populární algoritmy hashing?V současné době se používají následující funkce hash:

  • CRC - cyklický přebytečný kód nebo kontrolní součet. Algoritmus je velmi jednoduchý, má velký počet Variace v závislosti na požadované délce výstupu. Ne kryptografický!
  • MD 5 je velmi populární algoritmus. Jako on předchozí verze MD 4 je kryptografická funkce. Hesha velikost 128 bitů.
  • SHA -1 je také velmi oblíbený kryptografický přístav. Hesha velikost 160 bitů.
  • GOST R 34.11-94 - Ruská kryptografická norma pro výpočet hash funkcí. Hesha velikost 256 bitů.

Kdy mohou tyto algoritmy používat správce systému?Často při stahování jakéhokoliv obsahu, jako jsou programy od výrobce, hudby, filmů nebo jiných informací. kontrolní částkyvypočteno podle specifického algoritmu. Z bezpečnostních důvodů, po stažení, je nutné provést nezávislý výpočet hash funkce a porovnat hodnotu s tím, co je uvedeno na webových stránkách nebo v aplikaci do souboru. Udělal jsi to někdy?

Co je vhodnější počítat hash?Nyní existuje velký počet podobných nástrojů oba placené, tak i zdarma k použití. Osobně se mi líbil Hashtab. Za prvé, nástroj během instalace je vložen ve formě záložky na vlastnosti souborů, za druhé, umožňuje vybrat velký počet hashových algoritmů a třetí je zdarma pro soukromé nekomerční použití.

Co je ruština?Jak je uvedeno výše v Rusku, existuje standard hashing Gost R 34.11-94, který se používá všude v mnoha výrobci nástrojů pro bezpečnost informací. Jedním z těchto prostředků je programem stanovení a kontroly původního stavu. softwarový balíček "Opravit". Tento program je prostředkem ovládání účinnosti aplikace SZI.

Oprava (verze 2.0.1) pro Windows 9x / NT / 2000 / XP

  • Vypočítejte kontroly zadaných souborů jedním z 5 implementovaných algoritmů.
  • Fixace a následná kontrola původního stavu softwarového balíčku.
  • Porovnání verzí softwarového balíčku.
  • Fixace a řízení katalogů.
  • Monitorování změn ve specifikovaných souborech (adresáře).
  • Formování zpráv v TXT, HTML, SV formátech.
  • Produkt má certifikát FREC na NDV 3 č. 913 až do 1. června 2013.

A co Eds?Výsledek výpočtu funkce spolu s tajným klíčem uživatele vstupuje do vstupu kryptografického algoritmu, kde se vypočítá elektronicky digitální podpis. Přísně řečeno, funkce hash není součástí algoritmu Eds, ale často se to provádí konkrétně, aby se vyloučil útok pomocí veřejného klíče.

V současné době vám mnoho e-commerce aplikace umožňují uložit tajný klíč uživatele v uzavřené oblasti token (rutoken, etoken) bez technické schopnosti extrahovat odtud. Samotný token má velmi omezenou plochu paměti, měřená v kilobajtech. Chcete-li podepsat dokument, není možné přenášet dokument do tokenu sám, ale převést hash dokumentu do tokenu a na výstupu, aby se EDS dostal velmi jednoduchý.

Otázky:

1. Koncept funkce hash.

2. Použijte blokové algoritmy pro šifrování pro vytvoření hašovací funkce.

3. Přehled algoritmů pro tvorbu hash funkcí.

1. Koncepce funkce hash

Funkce hash.(Funkce hash) se nazývá matematická nebo jiná funkce, která pro řádky libovolné délky vypočítá některé celé číslo nebo jiný řetězec pevné délky. Matematicky to může být napsáno takto:

h. \u003d H (m) ,

kde M. - Zdrojová zpráva někdy zvaná současnost, dárek , ale h. - výsledek nazývá hodnotu hash funkce (stejně jako kód hash. nebo digest zpráva (z angličtiny. digest zprávy.)).

Význam funkce hash je určení charakteristické funkce vzorku - význam funkce hash. Tato hodnota má obvykle určitou pevnou velikost, například 64 nebo 128 bitů. Kód Hash může být dále analyzován tak, aby vyřešil jakýkoliv úkol. Například Hashing lze použít k porovnání dat: Pokud jsou různé hash-kódy odlišné, jsou zaručeny pole; Pokud jsou stejné pole s největší pravděpodobností stejné. Obecně platí, že jednoznačná korespondence mezi zdrojovými daty a kodexem hash není způsobena skutečností, že počet funkcí hash je vždy menší než možnosti vstupu. Proto existuje mnoho vstupních zpráv, které poskytují stejné kódy hash (takové situace se nazývají kolisia ). Pravděpodobnost výskytu kolizí hraje důležitou roli při posuzování kvality hash funkcí.

Funkce hash jsou široce používány v moderní kryptografii.

Nejjednodušší hash funkce může být zkompilována pomocí operace "součet modulu 2" následujícím způsobem: Získáme vstupní řetězec, složili všechny bajty modulu 2 a bajtový výsledek se vrátí jako hodnota hash fuch. Délka funkce hash bude v tomto případě 8 bitů bez ohledu na velikost vstupní zprávy.

Nechte například původní zprávu přeložena do digitálního zobrazení, následující (v hexadecimálním formátu):

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

Zpráva přeneseme na binární vzhled, psát bajty navzájem a položit bity v každém sloupci modulem 2:

0010 1011

0001 0100

1010 1001

0101 1111

1110 0100

——————-

0010 1101

Výsledek: 0010 1101 nebo 2 D. A bude to hodnota hash funkce.

Taková hašovací funkce však nemůže být použita pro kryptografické účely, například za účelem vytvoření elektronického podpisu, protože je poměrně snadné změnit obsah podepsané zprávy bez změny hodnot kontrolního součtu.

Proto funkce testovací hash není vhodná pro kryptografické aplikace. V kryptografii je funkce hash považována za dobré, pokud je obtížné vytvořit dva typy se stejnou funkcí hash, stejně jako v případě, že výstup funkce nemá explicitní závislost na vchodu.

Formulujeme základní požadavky na kryptografické hash funkce:

Funkce Hash musí být použitelná pro zprávu o libovolné velikosti;

· Výpočet hodnoty funkce musí být proveden dostatečně rychle;

· Se známým významem hash funkce by mělo být obtížné (téměř nemožné) najít vhodný prototyp M. ;

· S dobře známou zprávou M. Mělo by být obtížné najít jinou zprávu. M ' se stejnou hodnotou funkce hash, jako zdrojová zpráva;

· Mělo by být obtížné najít libovolný pár náhodných různých zpráv se stejnou funkcí hash.

Vytvořit funkci hash, která splňuje všechny uvedené požadavky, není snadný úkol. Je také třeba si uvědomit, že funkce funkce je přijata na funkci libovolné velikosti a výsledek huss by neměl být stejně stejný pro tyto různé velikosti.

V současné době jsou v praxi funkcity používány jako funkce hash, zpracování bloku vstupního hlášení za jednotkou a výpočtem hash- h I. Pro každý blok M I. Vstupní zpráva na závislosti

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

kde h I-1 - výsledek získaný při výpočtu funkce hash pro předchozí blok vstupních dat.

Výsledkem je výtěžek hash funkce h N. je funkce ze všech n. Vstupní bloky.

2. Použijte šifrování bloku algoritmů pro vytvoření hašovací funkce.

Jako hašovací funkce můžete použít blokový algoritmus pro symetrické šifrování. Pokud je použitý algoritmus bloku kryptografickou vzpěru, pak bude hash-funkce založená na něm spolehlivá.

Nejjednodušší způsob použití bloku algoritmu pro získání hash kód je šifrování zprávy v režimu CBC ( Vyrobení šifrovacího bloku - režim spojky CiphereTex). V tomto případě je zpráva reprezentována jako posloupnost bloků, jejichž délka se rovná délce jednotky šifrovacího algoritmu. V případě potřeby je poslední jednotka doplněna na pravé nuly, takže jednotka požadované délky je. Hash bude poslední šifrovaný textový blok. S výhradou spolehlivého algoritmu šifrování bloku bude získaný hash mít následující vlastnosti:

· Prakticky nemožné, aniž by znemožnil šifrovací klíč výpočet hodnoty hash pro dané otevřené množství informací;

· Je prakticky nemožné, aniž by znemožnil šifrovací klíč výběru otevřených dat pro zadanou hodnotu hash.

Tímto způsobem se vytvoří pokorný imitovka nebo autentikátor a slouží ke kontrole integrity zprávy. Simulátor je tedy řídicí kombinací, která závisí na otevřených datech a tajných klíčových informacích. Účelem používání imitovky je detekovat všechny náhodné nebo úmyslné změny v řadě informací. Hodnota získaná funkcí hash při zpracování vstupní zprávy je připojena ke zprávě v okamžiku, kdy je známo, že zpráva je správná. Příjemce kontroluje integritu zprávy vypočítáním imitancí přijatého vzkazu a porovnávat jej s výsledným kódem hash, který musí být vysílán bezpečným způsobem. Jeden z těchto bezpečných způsobů může být šifrován imitanci odesílatele uzavřeným klíčem, tj. Vytvoření podpisu. Je také možné šifrovat získaný algoritmus kód hash pro symetrické šifrování, pokud mají odesílatel a příjemce obecný klíč symetrického šifrování.

Zadaný proces získávání a používání imitovky je popsán v domácím standardním GOST 28147-89. Standardní nabídky pro použití mladšího 32 bitů bloku získaného na výstupu šifrovacího provozu celé zprávy v režimu šifrování bloku pro monitorování integrity vysílané zprávy. Stejným způsobem, jakýkoliv blokový algoritmus pro symetrické šifrování lze použít k vytvoření imitavky.

Dalším možným způsobem, jak použít blokovou šifru pro generování hašovacího kódu je následující. Zdrojová zpráva je zpracována v sériových blokech. Poslední blok je doplněn nulami v případě potřeby, někdy je délka zprávy ve formě binárního čísla přičítána poslednímu bloku. V každé fázi šifrování hash získané v předchozím stupni, přičemž současný blok zprávy jako klíč. Poslední zadaná šifrovaná hodnota bude konečná hash.

Tak, pokud je to obvyklé schéma šifrování zpráv M. pomocí blokové šifry f. na klíč NA Zaznamenali jsme As. E \u003d f (m, k) pak hash kód schéma h. Podle výše popsaného algoritmu si dokážete představit, jak

h I. = f. ( h I. -1 , M. )

Jako počáteční kód hash h 0. Udělejte si konstantní. Šifrování se provádí v režimu jednoduchého výměny. Použitím zadaná metoda Velikost bloku se shoduje s délkou klíče a velikost hodnoty hash bude délka jednotky.

Dalším způsobem, jak použít blokovou šifru v jednoduchém režimu náhrady, je také možné: Prvky zpráv jsou šifrovány s hash hodnotami získanými v předchozí fázi:

h I. = f. ( M. , h I. -1 ,)

Ve skutečnosti, několik dalších schémat pro použití blokové šifry vytvořit hash funkci. Nech být M I. - blok zdrojové zprávy, h I. - Hodnota funkce hash i. I. -pódium, f. - Blokový algoritmus pro šifrování použité v jednoduchém režimu výměny - přídavný provoz modulu 2. Potom je možné, například následující funkce Hash Funkce Schémata:

Ve všech těchto diagramech se délka generované hodnoty hash rovná délce bloku během šifrování. Všechny tyto, stejně jako některé další systémy pro použití bloku algoritmu pro šifrování pro výpočet hodnot hash mohou být použity v praxi.

Hlavní nevýhodou hash funkcí určených na základě blokových algoritmů je relativně nízká rychlost. Požadovaný kryptoskop lze také zajistit pro menší počet operací na vstupních datech. Existují rychlejší algoritmy hash (nejběžnější - MD5, SHA-1, SHA-2 a GOST R 34.11-94).

3. Přezkum algoritmů pro tvorbu hash funkcí.

V současné době jsou nabízeny různé speciální algoritmy a prakticky používané k výpočtu funkce hash. Nejznámější algoritmy jsou MD5, SHA-1, SHA-2 a další verze SHA, stejně jako domácí algoritmus nastínil v Gost R 34.11-94.

Algoritmus MD5. Objevil se na počátku 90. let dvacátého století v důsledku zlepšení algoritmu tvorby hash MD4. Symboly ve jménu "MD" Průměrná zpráva Digest - souhrn zprávy. Autor algoritmů MD4 a MD5 - R. RIVEST (R.RIVEST). V důsledku použití MD5 je pro libovolnou zprávu vytvořen 128bitový hash. Vstupní data jsou zpracovávána 512 bitovými bloky. Algoritmus používá elementární logické operace (Inverze, spojení, přidání modulu 2, cyklické směny atd.), Stejně jako běžný aritmetický doplněk. Komplexní opakování těchto elementárních funkcí algoritmu zajišťuje, že výsledek je po zpracování dobře smíchán. Proto je nepravděpodobné, že by dvě zprávy vybrané náhodou měly stejný kód hash. Algoritmus MD5 má následující vlastnost: Každý kousek výsledné hodnoty hash je funkce z každého vstupního bity. Předpokládá se, že MD5 je nejsilnější hash funkce pro hodnotu 128bitové hash.

Algoritmus Sha. Bezpečný hash algoritmus - bezpečný hash-algoritmus) byl vyvinut Národním institutem norem a technologií (NIST) Spojených států a publikoval jako americký federální informační standard v roce 1993. SHA-1, stejně jako MD5, založený na algoritmu MD4. SHA-1 tvoří 160bitový hash na základě zdroje zpracování 512 bitů bloků. Algoritmus SHA-1 také používá jednoduché logické a aritmetické operace. Nejdůležitější rozdíl mezi SHA-1 z MD5 je, že hash kód SHA-1 je 32 bitů delší než Hash Code MD5. Pokud předpokládáme, že obě algoritmy jsou stejné v obtížnosti pro kryptanalýzu, pak SHA-1 je odolnější algoritmus. Pomocí útoku pomocí hrubé síly (čelní útok) je obtížnější vytvořit libovolnou zprávu, která má daný kód hash, a je také obtížnější vytvořit dva zprávy, které mají stejný hash kód.

V roce 2001 přijal Národní institut norem a technologií Spojených států tři hash funkce jako standard s větší délkou hash kódu než na SHA-1. Tyto hash funkce se často nazývají SHA-2 nebo SHA-256, SHA-384 a SHA-512 (délka hash-kódu vytvořené algoritmy je uvedena v názvu). Tyto algoritmy se liší nejen do délky vytvořeného hash kódu, ale také používají interní funkce a délka zpracovaného bloku (při SHA-256 délka jednotky - 512 a délka SHA-384 a SHA-512 je 1024 bitů). Postupná zlepšení algoritmu SHA vede ke zvýšení jeho kryptické rezistence. Navzdory rozdílům v algoritmech zvažovaném od sebe navzájem jsou všechny z nich další vývoj SHA-1 a MD4 a mají podobnou strukturu.

V Rusku je přijata GOST P34.11-94, což je domácí standard pro funkce hash. Jeho struktura je velmi odlišná od struktury algoritmů SHA-1.2 nebo MD5, které jsou založeny na algoritmu MD4. Délka hash kódu vytvořeného algoritmem GOST R 34.11-94 je 256 bitů. Algoritmus je postupně zpracován zdrojovou zprávou bloky 256 bitů vlevo dole. Parametr algoritmu je výchozí vektor hash - libovolná pevná hodnota je také 256 bitů. V algoritmu, GOST R 34.11-94, operace permutace, smykové, aritmetické přidávání, přidání modulu 2. AS pomocná funkce GOST 34.11-94 používá algoritmus podle GOST 28147-89 v jednoduchém režimu náhrady.

4. Požadavky na hash funkce

Funkce Hash se nazývá jednosměrná funkce, která je určena pro přijímání digestu nebo "otisk prstu", zprávy nebo nějaký datový blok.

Kód hash je vytvořen funkcí N. :

h \u003d h (m)

Kde M. je zpráva o svévolné délce a h. Jedná se o kód hash s pevnou délkou.

Zvažte požadavky, pro které musí funkce hash shodovat tak, aby mohla být použita jako ověřitele zprávy. Zvažte velmi jednoduchý příklad hash funkce. Pak analyzujeme několik přístupů k výstavbě hash funkce.

Funkce hash. N. Toto slouží k ověření zpráv musí mít následující vlastnosti:

1. Hash funkce N. Mělo by být aplikováno na datový blok jakékoli délky.

2. Hash funkce N. Vytvoří výstup pevné délky.

3. N (m) relativně snadno (pro polynomiální čas) se vypočítá pro libovolnou hodnotu M. .

4. Pro daný kód hash h. Je to jasně nemožné najít M. takový H (m) \u003d h .

5. Pro dané h. To je výpočtně nemožné zjistit

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

6. Je to výpočtně není možné najít libovolný pár ( h. , y. ) takový to H (y) \u003d h (x) .

První tři vlastnosti vyžadují, aby funkce hash vytvořila kód hash pro libovolnou zprávu.

Čtvrtá vlastnost určuje požadavek na jednostrannost funkcí hash: Snadno vytvářet hash kód pro tuto zprávu, ale není možné zprávu obnovit na tomto hash kódu. Tato vlastnost je důležitá, pokud ověřování pomocí funkce Hash obsahuje tajnou hodnotu. Samotná tajná hodnota však nemusí být odeslána, pokud funkce hash není jednostranná, nepřítel může snadno odhalit tajnou hodnotu následujícím způsobem. Při zachycení převodu obdrží útočník zprávu M. a hash kód C \u003d h (SAB || m) . Pokud útočník může invertovat hašovací funkci, tedy se tedy může dostat SAB || M \u003d h - 1 (c) . Protože útočník teď ví a M. a SAB || M. , přijímat SAB. docela jednoduché.

Pátá vlastnost zajišťuje, že je nemožné najít jinou zprávu, jehož hodnota funkce hash by se shodovala s hodnotou funkce hash tato zpráva. To zabraňuje falešnému ověřiteli při použití šifrovaného hash kódu. V tomto případě může soupeř přečíst zprávu, a proto vytvořit svůj kód hash. Ale protože nepřítel nevlastní tajný klíč, nemá možnost změnit zprávu tak, aby ho příjemce nenajde. Pokud tato vlastnost není provedena, útočník má možnost provádět následující posloupnost akcí: Chcete-li zachytit zprávu a kód šifrovaného hash, vypočítat kód Hash, vytvořit alternativní zprávu se stejným kódem hash, nahradit původní zprávu k falešnému. Vzhledem k tomu, že hash kódy těchto zpráv se shodují, příjemce nebude detekovat substituci.

Hash funkce, která splňuje první pět vlastností, se nazývá jednoduchá nebo slabá hash funkce. Pokud se provede šestá vlastnost, pak se tato funkce nazývá silná funkce hash. Šestá vlastnost chrání proti třídním útokům, známému jako útok "narozeniny".

5. Jednoduché funkce hash

Všechny funkce hash se provádějí následovně. Vstupní hodnota (zpráva, soubor atd.) Je považována za sekvenci n. bloky. Vstupní hodnota je zpracovávána postupně blokovat za jednotkou a je vytvořen. m. Hodnota hash kód.

Jedním z nejjednodušších příkladů hash funkce je XOR Bitwise každý blok:

S I. - i. I. Bit hash kód, 1 <= i <= n .

k. - číslo n. vstup do bloků.

b ij. i. I. Bit B. j. Blok.

Pak je celá zpráva zašifrována, včetně hash kódu, v režimu CCS k vytvoření šifrovaných bloků Y1, Y2, ..., YN + 1. Podle definice, mám:

Xn + 1 je hash kód:

Vzhledem k tomu, že komponenty v předchozí rovnosti lze vypočítat v libovolném pořadí, proto se kód Hash nebude změněna, pokud budou zašifrované bloky upraveny.

Počáteční standard navrhovaný NIST používal jednoduchý XOR, který byl použit k 64bitovým blokům zpráv, pak je celá zpráva zašifrována pomocí režimu CCS.

"Narozeninový paradox"

Před zvážením složitějších funkcí hash je nutné analyzovat jeden konkrétní útok na jednoduché funkce hash.

Takzvaný "narozeninový paradox" je následující. Předpokládejme, že počet výstupních hodnot hash N. stejně n. . Co by mělo být číslo k. na konkrétní hodnotu X. a hodnoty Y1. Yk. Pravděpodobnost, že alespoň jedna yi byla provedena rovnost

H (x) \u003d h (y)

více než 0,5.

Pro jednoho Y. pravděpodobnost, že H (x) \u003d h (y) , rovnat se 1 / N. .

Tedy pravděpodobnost, že , rovnat se 1 - 1 / n .

Pokud vytvoříte k. Hodnoty, pravděpodobnost, že žádná shoda nebude rovna výrobku pravděpodobností odpovídající jedné hodnotě, tj. (1 - 1 / n) k .

V důsledku toho je pravděpodobnost alespoň jedné náhody stejné

1 - (1 - 1 / n) k

Tak jsme zjistili, že m. Kód hash je dostačující na výběr 2m-1 Zprávy tak, aby pravděpodobnost shody shodidanců hash kódy byla větší než 0,5.

Zvažte následující úkol: označeno P (n, k) pravděpodobnost, že v souboru k. prvky, z nichž každá může trvat n. Hodnoty, existují alespoň dva se stejnými hodnotami. Co by mělo být stejné k. na P (n, k) by bylo více. 0,5 ?

Počet různých způsobů, jak vybrat prvky takovým způsobem, že nemá dvojité, stejné

n (n - 1) ... (n - k + 1) \u003d n! / (n-k)!

Všechny možné způsoby, jak si vybrat prvky stejné n K.

Pravděpodobnost, že žádné čtyřhry je stejný n! / (N - k)! N k

Pravděpodobnost, že existuje duplikát, resp.

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)]

Pokud má kód hash délku m. Bit, tj. Akceptovat 2m. Hodnoty, T.

Podobný výsledek se nazývá "narozeninový paradox", protože v souladu s výše uvedenými argumenty za účelem pravděpodobnosti shody shody okolností narozenin dvou lidí, aby byly větší než 0,5, mělo by být ve skupině pouze 23 osob. Tento výsledek se jeví jako úžasné, možná proto, že pro každou jednotlivou osobu ve skupině je pravděpodobnost, že narozeniny někoho jiného ve skupině se shodují s jeho narozeninami, je poměrně malá.

Vraťme se k posouzení vlastností funkcí hash. Předpokládejme, že se používá 64bitový kód hash. Lze se domnívat, že je poměrně dostačující, a proto bezpečnou délku pro hash kód. Například, pokud kód šifrovaného hash Z Přenášeny s příslušnou nezašifrovanou zprávou M. pak bude muset nepřítel najít M ' takový

N (m) \u003d n (m) ,

za účelem nahradit zprávy a oklamat příjemce. V průměru by nepřítel by měl prolomit 263 zpráv, aby bylo možné zjistit, že kód hash je roven zachycené zprávě.

Nicméně, různé druhy útoků založených na "narozeninovém paradoxu" jsou možné. Je možná následující strategie:

1. Nepřítel vytváří 2 m / 2 Možnosti zprávy, z nichž každý má určitý jednoznačný význam. Nepřítel připravuje stejný počet zpráv, z nichž každý je falešný a má za cíl nahradit tuto zprávu.

2. Dva sady zpráv se porovnávají při hledání pár zpráv, které mají stejný kód hash. Pravděpodobnost úspěchu v souladu s "narozeninovým paradoxem" je větší než 0,5. Pokud není nalezen příslušný pár, jsou vytvořeny další zdroje a falešné zprávy, dokud nebude nalezena páry.

3. Útočník nabízí odesílateli počáteční verzi zprávy pro podpis. Tento podpis pak může být připojen k falešné volbě pro přenos do příjemce. Vzhledem k tomu, že obě možnosti mají stejný kód hash, bude vytvořen stejný podpis. Nepřítel bude v úspěchu přesvědčen, ani neví klíč šifrovacího klíče.

Pokud se použije 64bitový kód hash, je nezbytná složitost výpočtů cca 232.

Závěrem se domníváme, že délka hash kódu musí být poměrně velká. Délka rovnající se 64 bitům není v současné době považována za bezpečnou. Je výhodné, aby délka tvoří pořadí 100 bitů.

Použití řetězce šifrovaných bloků

Existují různé hash funkce založené na vytváření řetězce šifrovaných bloků, ale bez použití tajného klíče. Jeden z těchto hash funkcí byl navržen Rabinem. Zpráva M. Rozdělení na bloky pevné délky M1, m2 ,. . . , MN. a pomocí symetrického šifrovacího algoritmu, jako je DES, pro výpočet hash kódu G. následujícím způsobem:

H 0. - počáteční význam N I. = E mi. G. = H N.

To je podobné použití šifrování v režimu CSA, ale v tomto případě neexistuje žádný tajný klíč. Stejně jako v případě jakékoli jednoduché funkce hash je tento algoritmus náchylný k "narozeninový útok", a pokud šifrovací algoritmus je DES a je vytvořen pouze 64bitový kód hash, systém je zvažován docela zranitelný.

Mohou existovat další útoky jako "narozeniny", které jsou možné i v případě, že nepřítel má přístup pouze k jedné zprávě a odpovídajícímu šifrovaném kódu hash a nemůže přijímat několik párů zpráv a šifrovaných hash kódů. Následující scénář je možný: Předpokládejme, že nepřítel zachytil zprávu s autentikátorem ve formě šifrovaného kódu hash, a je známo, že nezašifrovaný hash kód má délku m. bity. Dále musí nepřítel provádět následující akce:

· Použití algoritmu popsaného výše, vypočítat nešifrovaný hash kód G. .

· Vytvořte falešnou zprávu ve formuláři Q1, Q2 ,. . . , Qn-2 .

· Vypočítat N i \u003d e qi pro 1 <= i <= N-2 .

· Vytvořit 2 m / 2 Náhodné bloky H. A pro každý takový blok H. vypočítat E h. . Vytvořit navíc 2 m / 2 Dostatek bloků Y. a pro každý blok Y. vypočítat D y [g] kde D. - zdobení funkce odpovídající E. . Na základě "narozeninového paradoxu" můžeme říci, že s vysokým stupněm pravděpodobnosti bude tato sekvence obsahovat bloky H. a Y. takový E x \u003d d y [y] .

· Vytvořit zprávu Q1, Q2 ,. . . , Qn-2, X, Y . Tato zpráva má kód hash G. A proto může být použit s šifrovaným autentikátorem.

Tato forma útoku je známa jako útok "Setkání ve středu". V různých studiích jsou nabízeny jemnější metody pro zvýšení přístupu založeného na blokovém řetězci. Například devis a cena popsala následující volba:

Další možností je možná:

Oba tyto schémata však mají také zranitelnosti při různých útocích. V obecnějším případě může být ukázáno, že některá forma "narozeninový útok" je úspěšný s jakýmkoliv hash algoritmem, který zahrnuje použití řetězce šifrovaných bloků bez použití tajného klíče.

Další výzkum byl zaměřen na nalezení dalších přístupů k vytváření hashových funkcí.

MD5 hash funkce

Zvažte MD5 zprávu Digest Algoritmus (RFC 1321) vyvinutý Ron Rivesomem z MIT.

MD5 Provedení logiky

Algoritmus obdrží libovolnou délku na vstupu a vytváří výstupu 128 dávkové zprávy jako výstup. Algoritmus se skládá z následujících kroků:

Obr. 8.1.MD5 Provedení logiky

Krok 1: Přidání chybějících bitů

Zpráva je doplněna tak, aby se jeho délka rovná 448 modulu 512 (). To znamená, že délka přidané zprávy o 64 bitů je menší než číslo, více 512. Přidání se vždy provádí, i když má zpráva požadovanou délku. Pokud je například délka zprávy 448, je doplněna 512 bitů na 960 bitů. Počet přidaných bitů je tedy v rozmezí od 1 do 512.

Přidání sestává z jednotky, pro kterou následuje požadovaný počet nul.

Krok 2: Přidání délky

64-bitová reprezentace zdroje délky (před přidáním) zpráv v bitech je spojeno s výsledkem prvního kroku. Pokud je počáteční délka větší než 2,64, použije se pouze posledních 64 bitů. Pole tedy obsahuje délku zdrojové zprávy modulem 2 64.

V důsledku prvních dvou kroků je vytvořena zpráva, jejíž délka je více 512 bitů. Tato prodloužená zpráva je reprezentována jako sekvence 512-bitových bloků Y 0, Y 1 ,. . ., Y L-1, zatímco celková délka prodloužené zprávy se rovná L * 512 bitů. Délka přijaté pokročilé zprávy je tedy více než šestnáct 32bitová slova.

Obr. 8.2.Struktura rozšířené zprávy

Krok 3: Inicializace vyrovnávací paměti MD

Používá se 128bitový pufr pro ukládání meziproduktu a konečných výsledků funkce hash. Vyrovnávací paměť může být reprezentována jako čtyři 32bitové registry (A, B, C, D). Tyto registry jsou inicializovány následujícími hexadecimálními čísly:

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

Krok 4: Zpracování sekvence 512-bitových (16-lyrických) bloků

Základem algoritmu je modul sestávající ze čtyř cyklických ošetření, označených jako HMD5. Čtyři cykly mají podobnou strukturu, ale každý cyklus využívá svou elementární logickou funkci, označenou f f, f g, f h a f i, resp.

Obr. 8.3.Zpracování příštím 512-bitového bloku

Každý cyklus trvá jako vstupní proud 512-bitový blok y q, aktuálně zpracovaný a 128bitová hodnota bufferu ABCD, což je mezilehlá hodnota digestu a změní obsah této vyrovnávací paměti. Každý cyklus také používá čtvrtou část 64-elementu tabulky t, na základě funkce hříchu. I-Th Element T, označený T [I], se rovná celé části 2 32 * ABS (hřích (i)), je nastaven v radiánech. Protože ABS (hřích (i)) je číslo mezi 0 a 1, každý prvek t je celek, který může být reprezentován o 32 bitů. Tabulka poskytuje "náhodnou" sadu 32bitových hodnot, které musí eliminovat pravidelnost ve vstupních datech.

Pro získání MD Q + 1 je výtěžek čtyř cyklů tvořen modulem 2 32 s MD Q. Přidávání se provádí samostatně pro každou ze čtyř slov v pufru.

CLS S je cyklický posun vlevo od 32bitových bitů argumentů.

X [k] - m - k-o 32bitové slovo v bloku zpráv Q-OHM 512.

T [i] - I-O, 32bitové slovo v matrici T.

+ - Přidání modulu 2 32.

Na každém ze čtyř cyklů algoritmu se používá jedna ze čtyř elementárních logických funkcí. Každá elementární funkce přijímá tři 32bitová slova na vstupu a výstup vytvoří jedno 32bitové slovo. Každá funkce je množstvím dávkových logických operací, tj. Nth Výstupní bit je funkce z n-b bit ze tří vstupů. Elementární funkce jsou následující:

Pole 32bitových slov X obsahuje hodnotu aktuálního 512-bitového vstupního bloku, který je aktuálně zpracován. Každý cyklus probíhá 16krát a protože každý blok vstupní zprávy je zpracován ve čtyřech cyklech, pak se každá vstupní jednotka zpracovává podle diagramu znázorněného na Obr. 4, 64 krát. Pokud odešlete vstup 512-bitový blok ve formě šestnácti 32bitových slov, každý vstupní 32bitové slovo se používá čtyřikrát, jednou v každém cyklu, a každý prvek tabulky T, skládající se z 64 32-bitů slova, používá se pouze jednou. Po každém kroku cyklu se vyskytuje cyklický posun doleva ze čtyř slov A, B, C a D. V každém kroku se mění pouze jedna ze čtyř slov ABCD vyrovnávací paměti. V důsledku toho, každý pufrový slovo se mění 16krát a pak 17. čas na konci získat konečný výstup této jednotky.

strávit.

2. Rychlost: Provádění programu algoritmu musí být provedeno poměrně rychle. Algoritmus musí být zejména dostatečně rychlý na 32bitové architektuře. Proto je algoritmus založen na jednoduché sadě elementárních operací přes 32bitová slova.

3. Jednoduchost a kompaktnost: Algoritmus by měl být jednoduchý v popisu a snadno se program, bez velkých programů nebo zástupných znaků. Tyto vlastnosti mají nejen zjevné programové výhody, ale také žádoucí z hlediska bezpečnosti, protože analyzují možné slabé body, je lepší mít jednoduchý algoritmus.

4. Požadovaná malou-endian architekturou: Některé architektury procesoru (například linky Intel 80xxx) ukládají slova Left Byte nižší bajtové adresy (Little-Endian). Ostatní (např. Sun Sparcstation) ukládají správné bajty slova v poloze Junior Byte adresy (Big MD4 dodatečná konstanta v prvním cyklu se nepoužije. Podobná přídavná konstanta se používá pro každý krok ve druhém cyklu. Další další Konstanta se používá pro každou z kroků ve třetím cyklu.. Kód hash je funkce z každých bitů vstupu. Komplexní opakování elementárních funkcí FF F, FG, FH a FI zajišťuje, že výsledek je dobře smíšený; to znamená, že je nepravděpodobné, že dvě zprávy vybrané náhodou i v případě, že mají zjevně podobné vzory, měly stejné štěpení, které vytvářejí stejnou hodnotu výstupu. To znamená, že provedení MD5 přes jeden blok 512 bitů povede k Stejný výstup pro dva různé vstupní hodnoty v bufferu ABCD. Zatímco způsob rozšiřování tohoto přístupu pro úspěšný útok MD5 neexistuje.