Příspěvek volně navazuje na předchozí díly útoků na hesla, často se totiž setkáme s obrazy hesel, které vznikly za pomocí hashovacích funkce nebo šifry. V tomto příspěvku se seznámíme s terminologií a hashovacími funkcemi MD5 a SHA-1.

Základní pojmy

Šifra

Šifra je kryptografický algoritmus, který vezme prostý text a převede jej na nečitelný šifrovaný text.  Takový algoritmus ke svoji činnosti dále potřebuje klíč, který reprezentuje tajnou informaci, bez které není možné získat původní prostý text. Klíč je intergální součást šifrovacího algortimu a jeho hodnota ovlivňuje nastavení šifrovací a dešifrovací operace. Díky klíči nemusíme šifrovací algortimus tajit. Šifry dále rozlišujeme podle symetrie algoritmu a zda jsou blokové nebo proudové.

Symetrické šifry používají jeden klíč pro obě operace, tj. šifrujeme a dešifrujeme stejným klíčem. Příkladem symetrických šifer jsou algoritmy DES, 3DES (triple des) a AES.

Asymetrické šifry používají dva různé klíče veřejný a privátní, který nikdy nezveřejňujeme. Asymetrické šifrovací algoritmy jsou založeny na matematických modelech, které umožňují použítí odlišných klíčů (proměnných) pro různé operace. Nejznámnějším je šifra RSA využívající faktorizaci prvočísel.

Bloková šifra je taková, která „rozseká“ prostý text do menších bloků a provádí šifrovací nebo dešifrovací operaci na úrovni jednotlivých bloků. Zajímavé na blokových šifrách je, že mají více módů zapojení bloků.

Proudová šifra je taková, která provádí operaci šifrování nebo dešifrování na úrovni jednotlivých bitů prostého textu.

Hashovací funkce

Hashovací funkce je jednosměrná kryptografická funkce, která jako vstupní parametr přijímá zprávu a udělá z ní otisk do velmi malého prostoru, typicky 32 hexadecimálních znaků a více. Jednosměrná funkce znamená, že ji nelze reverzovat a získat zprávu na základě jejího otisku. Další vlastností hashovací funkce je její rozptyl do prostoru otisků. Pro dvě velmi podobné zprávy dostaneme úplně jiné otisky. Z podstaty menšího prostoru otisků, v porovnáním s prostorem zpráv, je jasné, že musí docházet ke kolizím, kdy dvě odlišné zprávy mohou mít společný otisk. Určitá míra kolize je akceptovatelná. Hashovací funkce používáme například ke kontrole intergity souborů nebo k podpisům zpráv. Příkladem hashovacích funkcí jsou funkce MD5 a SHA-1.

Kód

Kód vyjadřuje původní informaci jiným způsobem. Kódování je aplikace algoritmu, který mění podobu prostého textu na jeho zakódovanou podobu bez použití klíče. To znamená, že cílem kódování není informaci tajit. Kdokoliv identifikuje použitý algoritmus kódování, je schopen původní informaci přečíst. K čemu je tedy kódování dobré? Kódování informace se používá například k jejímu efektivnímu uložení nebo jde o ochranu ve smyslu lepší odolnosti před nežádoucími vlivy, které se vyskytují při transportu informace informačním kanálem. Kódování může k původní informaci přidat další údaje, které umožní detekovat chybu při přenosu nebo dokonce část poškozené informace opravit. Kódování potkáme nejčastěji v aplikačních protokolech, například URL kódování, BASE64, kódování znaků na HTML entity apod.

Intuitivně kódy vnímáme jako cokoliv, co není čitelné, protože nejsme schopni na první pohled rozlišit, zda se jedná o kódovaný nebo šifrovaný text. Kódem můžeme mít také na mysli „vstupní kód“, tj. tajnou informaci k povolení určité operace. Pokud si tyto souvislosti uvědomíme, neměly by nám kódy překážet v dalším porozumění.

Python – jazyk na pokusy

Na naše pokusy budeme potřebovat interpretovaný jazyk Python ve verzi 2.7. Uživatelé MS Windows si mohou stáhnout Python instalátor, který by měl obsahovat většinu potřebných knihoven.

Uživatelé OS Linux mají již Python předinstalovaný, pokud vám chybí knihovny, použijte PIP manažera. Následující příklad je pro linuxovou distribuci Ubuntu a „dotáhne“ do systému jazyk python, manažera balíčků pip a python knihovnu hashlib.

Máme-li připravené prostředí python a knihovnu hashlib, můžeme se vrhnout na příklady.

Hashovací funkce MD5

Přepíšeme is následující program a jdeme testovat chování funkce MD5.

Skript md5.py

Nejdříve vyzkoušíme otisk zprávy „koala“. Zprávu obalujeme pro jistotu do uvozovek, abychom donutili interpreter shellu předat celou zprávu jako jeden argument, jinak by náš program nemusel fungovat správně v případě, kdy by zpráva obsahovala více slov oddělených mezerou.

Příklad 1 – MD5 – Opakovaná volání

Z výpisu vidíme, že zpráva „koala“ vytvoří otisk o délce 32 znaků. Můžeme dále usoudit, že tato hashovací funkce v otiscích používá pouze hexadecimální znaky (vidíme číslice 0-9 a A-F). Opakujeme-li volání programu, otisk je stále stejný.

Příklad 2 – MD5 – Nepatrná změna zprávy

Nyní vyzkoušíme zprávu nepatrně změnit, abychom porovnali, jak se změní otisky. Použijeme zprávu „koala“ a „kaola“.

Z výpisu vidíme, že otisky obou zpráv jsou zcela odlišné.

Příklad 3 – MD5 – Kolize

Pro nalezení kolize budeme potřebovat delší vstupní text a pomůžeme si zdokumentovaným nálezem MD5 kolize Marca Stevense.

Nejprve stáhneme příklady obou zpráv message1.bin a message2.bin do pracovního adresáře s našim skriptem md5.py. Spočítáme jednotlivě MD5 otisky pro oba soubory.

Z výpisu vidíme, že oba otisky jsou naprosto stejné! Příklazem diff jsme ověřili, že oba vstupní soubory jsou rozdílné.

Hashovací funkce SHA-1

Pro seznámení s hashovací funkcí SHA-1 mírně upravíme náš předchozí program v části výpočet a nazveme jej sha1.py.

Vyzkoušíme SHA-1 na zprávě „pejsek a kočička“.

Vidíme, že otisk SHA-1 je opět v hexadecimálním tvaru, zabírá 40 hexadecimálních znaků na rozdíl od hashovací funkce MD5, která měla 32 hexadecimálních znaků. Další testy by byly obdobné jako u příkladů s hashovací funkcí MD5 a pro jejich jednoduchost je vypustíme.

Knihovna hashlib dokumentuje další kryptografické funkce a prozrazuje něco i o struktuře jejich algoritmů. Například velikost atribut block_size může napovědět, zda jde o kryptografický algoritmus využívající bloky.

Závěr

V tomto příspěvku jsme se stručně seznámili s rozdělením pojmů kód, šifra a hashovací funkce. Vyzkoušeli jsme si na příkladech použití hashovacích funkcí MD5 a SHA-1.

Pro úplnost musíme dodat, že použití hashovací funkcí MD5 a SHA-1 již není bezpečné, protože existuje alespoň teoretická možnost provedení útoku.

Pochybnost o bezpečnosti SHA-1 byla vyjádřena odborníky v roce 2005. Hashovací funkce MD5 ztratila kredit mnohem dříve a to v roce 1996. První praktický útok na funkci MD5 byl prokázán v roce 2005.