šifrování: | e(text, šifrovací klíč) = šifra |
dešifrování: | d(šifra, dešifrovací klíč) = text |
Pointa je samozřejmě v tom, že text na prvním řádku tabulky je totožný s textem na druhém řádku (šifra samozřejmě také); funkce e a d zde představují kódovací respektive dekódovací algoritmy. Věda, která se zabývá různými šifrovacími schématy, se nazývá kryptografie a je založena na mnoha hlubokých poznatcích z matematiky (teorie čísel) a informatiky (teorie informace, teorie složitosti) - o některých z nich se alespoň náznakem zmíníme.
Možná vás to překvapí, ale přes velké rozšíření počítačů je většina problémů reálného světa na počítači špatně řešitelná, v tom smyslu, že čas, který zaberou potřebné výpočty, je příliš velký nebo dokonce že takový výpočet je principiálně nemožný.
O tom, že skutečně existují problémy, které nejdou na počítači vyřešit už z principu, nás přesvědčil pan Alan Turing, jeden ze zakladatelů informatiky a autor všeobecně používaného abstraktního matematického modelu počítače (tzv. Turingův stroj). Ukázal totiž, že problém zastavení Turingova stroje je Turingovým strojem neřešitelný. Pokud jsem vás teď vyděsil, vytrvejte, jde v podstatě o "trivialitu" - uvedený problém se totiž dá popsat takto: máte napsat počítačový program, který o libovolném jiném počítačovém programu rozhodne, zda se při spuštění s konkrétními vstupními daty zastaví nebo ne. (O tom, že ne každý program se vždy zastaví, vás snad zkušenosti s výpočetní technikou a klávesami CTRL+ALT+DEL dostatečně poučily.) Ukazuje se, že tento jistě užitečný program nemůže z principu existovat.Čas výpočtu se většinou udává jako nějaká funkce velikosti vstupních dat. Malý příklad - hledání v telefonním seznamu. Je jasné, že vyhledání určité osoby nám zabere tím více času, čím je telefonní seznam větší. Teorie složitosti většinou tento vztah chápe přibližně - odpovídá na otázku, jak se změní čas výpočtu při změně velikosti vstupu (například pokud zvolíme špatnou metodu hledání v seznamu a budeme ho číst od začátku než narazíme na správné jméno, vyjde nám, že bude-li seznam dvakrát delší, strávíme nad ním dvakrát více času).
Podle tohoto vztahu mezi velikostí vstupních dat a časem výpočtu nejlepšího existujícího algoritmu (pozor - ne každý existující algoritmus musí být známý!) lze problémy rozdělit do skupin. Některé skupiny je na počítači možné řešit snadno (sem patří například vyhledávání v seznamech, řazení, jednoduché matematické operace a podobně), některé obtížně (násobení matic), některé problémy nelze prakticky řešit vůbec, protože na výsledek bychom museli čekat miliony let. Těmto nezvládnutelným problémům se říká exponenciální a platí u nich jednoduchý vztah - pokud se vstupní data zvětší o jediný bit, vzroste čas výpočtu nejméně dvakrát (přesněji nejméně konstanta-krát). Exponenciální problémy lze v principu na počítači řešit - trvá to ale nepříjemně dlouho a pro velké problémy to nelze v reálném čase zvládnout. Dají se ale nalézt rychlejší postupy, takže i velikost reálně řešitelných exponenciálních problémů roste.
Typickým příkladem exponenciálního problému je hledání neznámého čísla - představte si, že hrajete s přítelem následující hru: on si myslí nějaké číslo od jedné do deseti a vy máte zjistit, které to je. Vy hádáte čísla a váš partner vám pouze sdělí, jestli jste uhodli nebo ne. Nezbývá vám nic jiného, než prostě vyzkoušet všechna čísla od jedné do deseti. Teď si představte, že máte inteligentnějšího přítele, který zvládá čísla až do sta - máme tedy pouze o jedinou cifru navíc a desetkrát více možností. (Z toho plyne poučení - s inteligentnějšími přáteli je někdy potíž :-)).Existuje ještě jedna zajímavá skupina problémů - problémy, kterým se říká NP-úplné. Tento pojem nebudeme raději dešifrovat, řekněme si pouze tolik - nejlepší známý algoritmus řešení těchto problémů má exponenciální složitost (tedy nezbývá než vyzkoušet všechna možná řešení). Existence rychlejšího (polynomiálního) algoritmu není dokázána a zůstává jednou z velkých nevyřešených otázek teorie složitosti. Přitom formulace těchto problémů je jednoduchá a většina z nich vychází z reálného světa. Posuďte sami - tady jsou některé NP-úplné problémy:
Všechny tyto problémy vypadají na první pohled jednoduše - jediná známá metoda řešení je ale vyzkoušet všechny možné kombinace. Je možné, že existuje rychlejší způsob, zatím ho ale nikdo nezná.
I když přece. V roce 1994 Leonard D. Adleman ukázal, že je možné efektivně vyřešit problém obchodního cestujícího. Nikoliv na počítači, ale...klonováním DNA! A dále - byl sestaven teoretický model kvantového počítače, který je schopen efektivně nalézt prvočíselný rozklad daného čísla. Zatímco první metoda je prakticky použitelná, druhá nikoliv - sestrojit kvantový počítač doopravdy se zdá nemožné. Jenže i nemožné věci se, jak známo, někdy prostě stanou.Kryptografové by byli rádi, aby nejlepší možný algoritmus prolomení dané šifry měl exponenciální složitost; ve skutečnosti prolomení většiny existujících šifer je NP-úplný problém. I když je nepravděpodobné, že někdo najde jeho efektivní řešení, vyloučené to není. Zatím tedy zbývá pouze zkoušet všechny možné klíče.
Jinými slovy, dešifrovací klíč je jediná informace, kterou je třeba chránit před odhalením, ostatní parametry šifrovacího systému (použité algoritmy, zašifrovaný text, případně šifrovací klíč) mohou být veřejně známé. (Ve skutečnosti aby byl systém označen jako důvěryhodný, musí projít řadou testů a použité algoritmy tedy musí být veřejně dostupné.) Otázka klíčů je snad nejdůležitější v celé kryptografii - způsob, jak se klíče generují, jak se distribuují, jejich délka, omezení platnosti, to vše má vliv na bezpečnost používaného systému.
Klíčem může být v podstatě libovolná posloupnost binárních čísel (tedy 0 a 1), jejíž délka je daná používaným schématem. Tato posloupnost by měla být co nejvíce náhodná, respektive měla by mít statistické vlastnosti náhodné posloupnosti a mělo by být na počítači obtížné ji predikovat (uhodnout následující bit, známe-li všechny předcházející). Zdánlivě jednoduchá vlastnost, není ji však lehké na počítači splnit - generování opravdu náhodných čísel nelze popsat algoritmem (pak by to nebyla náhodná čísla ;-)), proto se pro generování klíčů používají informace v podstatě nenáhodné, nicméně těžko odhadnutelné (například obsah paměti v daný časový okamžik a podobně). Na klíč mohou být kladeny i další požadavky (typu musí to být prvočíslo a podobně), které jeho nalezení ztěžují. Volba klíče (kromě jeho utajení) může být velkou slabinou šifrovacího systému.
V zásadě existují dva přístupy k šifrování - šifrování s veřejným klíčem a symetrické šifrování.
Představme si jednoduchý kryptografický protokol - dva partneři (A a B) navážou spojení, sdělí si navzájem své veřejné klíče a potom si posílají zašifrované zprávy. Představme si teď ale útočníka U, který má možnost vstoupti do jejich komunikace už při navazování spojení tak, že A i B jsou přesvědčeni, že hovoří spolu - ve skutečnosti ale komunikují prostřednictvím útočníka U. Jeho úloha je jednoduchá - zachytí veřejné klíče A i B a nahradí je svým vlastním, aniž to A nebo B zjistí. Potom už může v klidu číst zasílané zprávy zakódované jeho veřejným klíčem, posílat je na správnou adresu zašifrované správným veřejným klíčem a mnout si ruce. (Tento druh útoku se nazývá man-in-the-middle attack.)
V čem je chyba? A ani B zde nemají možnost, jak ověřit, že získané veřejné klíče opravdu patří jejich partnerovi. Mohou získat klíče jinak (například od nějaké důvěryhodné osoby), lepší je ale použít tak zvané certifikáty.
Jak již bylo řečeno, zatím jediný známý způsob, jak nějakou šifru prolomit, je zkoušet všechny možné kombinace klíčů. Ukazuje se ale, že ani toto není úplně neřešitelný problém - jak neustále roste výkonnost dostupných počítačů i jejich počet a nacházejí se nové rychlejší algoritmy, stává se tato metoda útoku celkem reálnou. Samozřejmě použití delšího klíče ji opět odsune kamsi do neznáma, nicméně také prodlouží časy pro šifrování a dešifrování. Je tedy třeba najít přijatelný kompromis. Zdá se ale, že 256-bitové klíče jsou dostatečně dlouhé na to, aby energie, kterou by spotřeboval (libovolný) počítač při probírání všech možných klíčů daleko převyšovala energii výbuchu menší supernovy. Nechat explodovat hvězdu kvůli rozluštění zprávy typu "Přijdu na rande později. M." se asi nevyplatí.
Běžně používané délky klíčů (56-bitů u DESu) jsou nicméně prolomitelné
dostupnými prostředky (více o tom v kapitolce o DESu), krátké klíče je
tedy možné používat pouze pro zprávy, jejichž hodnota časem (rychle)
mizí.
Používané šifrovací algoritmy
Opusťme tedy konečně suchou teorii a povězme si něco o algoritmech,
které se nejčastěji používají pro kódování dat. Začněme perfektní,
nerozluštitelnou šifrou.
Je tedy DES bezpečný? Ne příliš. Díky malé délce klíče stroj, který je speciálně určený pro luštění DESu a stojí přibližně milion dolarů, dokáže šifru rozluštit průměrně za tři a půl hodiny. Pověsti říkají, že NSA s pomocí pouze jí známých technik a postupů to dokáže za tři až patnáct minut. Letos jsme se mohli zúčastnit mezinárodního projektu, který byl zaměřen na prolomení DESu - americká firma RSA Data Security vypsala odměnu $10000 pro toho, kdo rozluští DESem zašifrovaný text. Informace o průběhu celé akce byly k dispozici na stránkách DESCHALL a DES Coordinated Challenge, projektu (respektive obou projektů - amerického a evropského) se zúčastnily desítky tisíc počítačů na celém světě (78 000 pouze v americkém projektu); vyzkoušena byla dohromady polovina z celkového množství 7.2x1016 klíčů když rychlost testování dosáhla v závěru až 7 miliard klíčů za vteřinu. Výhercem ceny se po čtyřech měsících stal Michael K. Sanders z Utahu, který nalezl správné rozluštění na svém počítači Intel Pentium s operačním systémem FreeBSD. Zašifrované sdělení znělo: "Strong cryptography makes world a safer place."
Za poznámku stojí důvod, proč vlastně existovaly dva soupeřící projekty. Díky restrikcím americké vlády na export šifrovacích technologií nebylo možné software vytvořený americkým týmem používat mimo území USA. Švédský tým, který koordinoval konkurenční projekt DES Challenge, musel tedy vytvořit vlastní programy; přestože začal pracovat s jistým zpožděním, díky možnosti rozšířit program po celém světě záhy amerciký projekt dohnali.
DES je tedy snadno rozluštitelný velkými podniky a organizacemi, pro bankovnictví a podobně důležité oblasti se nehodí - pro osobní použití celkem vyhovuje. DES v současné době používá mnoho softwarových systémů - Kerberem počínaje a UNIXy obecně konče (používají ho pro šifrování hesel).
RSA je de facto standardem pro systémy s veřejným klíčem, je
vhodný zejména pro distribuci sdílených symetrických klíčů a pro
digitální podpisy, pro běžné šifrování dat například pro přenos po
síti se nehodí (jednak je pomalý, jednak je poměrně obtížné generovat
klíče - musí to být poměrně velká prvočísla).
Jednosměrné a hašovací funkce
Jednosměrná funkce je v podstatě způsob, jakým nějaký dokument převést
na jiný tvar - takový, ze kterého je prakticky nemožné odvodit tvar
původní nebo nalézt jiný dokument, který by dával po převedení
jednosměrnou funkcí stejný výsledek (Zašifrovat text a zapomenout klíč
je jednosměrná funkce.)
Hašovací funkce je taková, kde výsledný tvar má pevnou a většinou
mnohem kratší délku než původní text. K čemu se mohou jednosměrné
hašovací funkce hodit? Například k ověření obsahu dokumentu. Pokud
pro nějaký dokument spočítáme jeho hašovací funkci a odešleme ho po
síti svému partnerovi, může spočítat hašovací funkci obdržené zprávy a
porovnat ji s naší hodnotou - pokud se liší, dokument, který obdržel,
je jiný. (Pokud je hodnota stejná, je vysoká pravděpodobnost, že
dokument je totožný.)
Digitální podpisy
Jaké má (mít) obyčejný podpis vlastnosti? Třeba:
Je zřejmé, že obyčejné podpisy tyto vlastnosti většinou nemají. Digitální podpisy je mít mohou. Pro digitální podpisy lze využít některé algoritmy pro šifrování s veřejným klíčem, třeba RSA. (Algoritmy musí mít tu vlastnost, že šifrování a dešifrování jsou komutativní operace - t.j. text lze zašifrovat tajným klíčem a potom dešifrovat veřejným.) Dokument podepíšete jednoduše tak, že jej zašifrujete svým tajným klíčem. Tento digitální podpis splňuje všechny výše uvedené vlastnosti, má však některé praktické nevýhody - je pomalý. Proto se používá především ve spojení s jednosměrnými hašovacími funkcemi. Nepodepisujete potom samotný dokument, ale výsledek jednosměrné funkce, což má několik výhod - procedura je mnohem rychlejší, podpis je možné uložit odděleně od dokumentu (nebo i samostatně) a samotný dokument tak držet v tajnosti a podobně. Pro digitální podpisy existují i speciální algoritmy, například DSA.
Údaje v tomto díle byly čerpány zejména z knihy Bruce Schneiera "Applied Cryptography".