Základní principy šifrování

Featured Image

Poté, co jsem v rychlosti naškrábal a ve spěchu vydal článek Jak nešifrovat, mě několik čtenářů požádalo, zda bych nesepsal na toto téma trochu víc; a já se rozhodl jim vyhovět, neboť i šifrování může být použito jako prostředek v boji proti státu. Protože ti, kdo mají o šifrování nějaké povědomí, dokáží proti policii chránit svá data sami, je tento text určen pro BFU (v tomto kontextu čtěte „běžný Franta uživatel“); kdo již o šifrování něco ví, může tento článek s klidem zavřít, nic nového tu nenajde (a bude-li přesto číst, omlouvám se za různá zjednodušení a nepřesnosti, kterých jsem se dopustil pro zvýšení pochopitelnosti).

Hned na začátku upozorňuji, že článek nebude obsahovat žádné návody ve smyslu, na který link máte kliknout, co stáhnout, jak to nainstalovat a používat; neexistuje totiž žádný jeden univerzální a nejlepší software pro všechna myslitelná použití, nemluvě o tom, že i kdyby existoval, není záruka, že bude funkční ještě zítra. V článku vysvětlím základy toho, co je to vlastně šifrování, jak funguje, ale především jak nefunguje a na co si dát pozor. Po jeho přečtení sice nebudete ještě vědět, jak se jmenuje software, který potřebujete, ale budete mít snad alespoň přibližně jasno v tom, co hledat; nemluvě o tom, že jste-li vážně BFU, doporučuji si nastudovat daleko více než tento článek, který dává vážně jen nejzákladnější náhled na problematiku (a i poté je nejlepší se poradit s někým, kdo se tím třeba živí, nebo tomu alespoň výrazně rozumí; a také vzít do úvahy, že touhu udílet rady má i mnoho lidí, kteří o problematice prakticky nic nevědí). Kdybych měl shrnout nejdůležitější poselství článku, řekl bych přibližně toto: „Je to zajímavá a krásná problematika, ale chcete-li vážně šifrovat tak, aby to mělo smysl, je zapotřebí o tom vědět mnohem více, než se na první pohled zdá, nebo mít někoho, kdo Vám poradí.“

Než si zodpovíme otázku, co je vlastně šifrování, pojďme si objasnit jiný pojem – kódování. Zakódování nějaké informace znamená její transformaci do předem stanoveného formátu; dekódování je pak opačný proces (příkladem budiž Morseova abeceda: při kódování převádíme písmena na signály; sekvence takových signálů pak zas zpět na písmena při dekódování). Šifrování je speciálním případem kódování: Krom informace samotné totiž do kódovacího procesu vstupuje ještě takzvaný klíč; k dekódování je pak zapotřebí krom zašifrované zprávy samotné opět klíč (bez něj zprávu dešifrovat nelze). Tento klíč může být buď stejný jako ten, který jsme použili k šifrování, pak takovou šifru nazýváme symetrickou, nebo může jít o klíč jiný, to v případě šifry asymetrické (v takovém případě máme vždy dvojici klíčů, z nichž jedním data zašifrujeme, aby šla rozšifrovat pouze tím druhým).

Výhody, nevýhody a vhodné použití pro symetrické a asymetrické šifry probereme později, teď se pojďme podívat na to, co je vlastně klíč a jaké by měl mít vlastnosti: Jedná se o různě dlouhou (v závislosti na šifře) posloupnost bitů (prostě data); protože tuto posloupnost (data) používáme k šifrování, je nezbytně nutné, aby ji znali jen ti, kterým jsou data určena (protože kdo ji zjistí, může dešifrovat to, co mu má zůstat utajeno). Nemusejí ji mít přímo v hlavě, každopádně je třeba si uvědomit, že kdokoliv k ní získá přístup, může číst námi zašifrovaná data. Především ale nesmíme zapomínat na to, že klíč jsou pouze data, takže i když nám nikdo přímo fyzicky neukradne médium, na kterém jsou uložena, může se k nim dostat i jinak; například tak, že je prostě uhodne (a pokusů má tolik, na kolik má čas). Z toho důvodu je esenciálně nutné, aby tato data byla náhodná, protože nejsou-li, dají se snáze uhádnout.

Zde je bohužel nezbytná vsuvka na téma, co je to vlastně náhodnost (přesněji řečeno entropie); co jsou náhodná data? Pro naše potřeby to znamená, že v nich nejsou vzory; čím více a jasnějších vzorů, tím méně entropie. A bohužel pro všechny, kdo potřebují entropii, svět už je takové místo, že vzory jsou téměř ve všem. Jak to myslím? Dotkněte se prstem čehokoliv ve Vaší blízkosti a podívejte se, jakou barvu má to, čeho se dotýkáte; nyní se dotkněte něčeho o půl centimetru vedle… má to stejnou barvu? Nevím to, ale kdybych měl hádat, tipnu si, že ano. Dobrá, teď si myslete slovo; opět nevím, jaké to je, ale řekl bych, že v něm nejspíše bude písmeno A, zatímco tam pravděpodobně nebude písmeno X. Proč? Protože i řeč obsahuje vzory. Dokonce, i když dám na klávesnici kocoura, očekávám vzor (jdu ho tam vážně dát, ještě nevím, co vznikne): ¨WEwësss wšeéé= éíooéíwsecv éééééééc vé. A skutečně, předpoklad byl správný; kdybyste měli tipnout další znak, který by následoval, kdyby kocour neodešel, řeknete spíše „é“, nebo třeba „k“? Všude jsou vzory. I když se pokusíte napsat text, ve kterém nejsou, budou tam; vzorem se nejspíše paradoxně stane Vaše snaha vzor nevytvořit (např. sekvence dvou stejných po sobě jdoucích znaků mohou být méně časté, než by byly při náhodném výběru). Jaké jsou dopady v praxi? Obrovské; existuje skoro půl milionu možností, jak sestavit náhodnou posloupnost čtyř písmen anglické abecedy, avšak ani ne třicet tisíc, jste-li omezeni vzorem, že samohlásky musejí střídat souhlásky a jen necelých sedm tisíc, musí-li to být existující anglické slovo (což je ještě silnější vzor). Čím méně entropie (tedy čím jasnější vzor), tím vyšší šance fízlů klíč uhodnout; nesmíme zapomínat na to, že ty vzory neodhalují lidé, ale programy k tomu určené, které to umějí daleko rychleji než jakýkoliv smrtelník. Má-li někdo pocit, že by k tomuto odstavci mohl říci jedno zásadní „ale“ a otřást jím v základech, dost možná tomu tak skutečně je (a můžeme to probrat v komentářích), zde jsem musel v rámci pochopitelnosti zjednodušit trochu více; závěr tohoto zjednodušeného modelu je však totožný se závěrem, který potvrzuje praxe: I když se něco jeví náhodně, nemusí to tak být, přičemž každý (i skoro neznatelný) vzor útočníkovi pomáhá (čím je silnější, tím více); a zapamatujme si, že řeč (slova, věty; bez ohledu na jazyk) obsahuje vzory nesmírně silné a entropie je v ní opravdu málo (data s vysokou entropií mimochodem nelze moc komprimovat, protože kompresní algoritmy dělají z velkých dat s nízkou entropií malá data s vysokou entropií; to je také důvod, proč nepřináší dobré výsledky opakovaná komprese již zkomprimovaných dat, a proto se třeba text komprimuje skvěle, ale některé obrázky a prakticky všechna videa ne — jsou již zkomprimovaná). Kde tedy brát náhodu? Skutečnou náhodou (alespoň dle poznatků kvantové fyziky) nám mohou poskytnout hardwarové generátory náhodných čísel; leckdy se bez nich však obejdeme, protože existují situace a algoritmy, které jsou na prolomení klíče méně citlivé (i zde platí, co jsem psal výše, tedy že čím méně entropie, tím větší šance pro fízly, jen prostě i ta „větší“ šance může někdy být téměř nulová).

A nyní se můžeme zase vrátit k samotnému šifrování. Již na začátku jsme si řekli, že existují šifry symetrické a asymetrické; jak vlastně fungují a jaké jsou jejich výhody a nevýhody? Symetrické šifry jsou většinou založeny na nějakém „smíchání a zašmodrchání“ klíče s daty tak, že je bez znalosti klíče nikdo neumí přečíst; celý ten proces má samozřejmě extrémně složité matematické pozadí, takže píši-li „smíchání a zašmodrchání“, je to asi jako kdybych o letu na Měsíc napsal, že raketa je něco jako zábavní pyrotechnika, jen trochu větší, takže dostřelí až na Měsíc a pak zas spadne zpátky. Hlavní a obrovská výhoda symetrických šifer spočívá v tom, že jsou velmi rychlé a většinou je lze snadno implementovat hardwarově (pak jsou ještě rychlejší). Asymetrické šifry jsou typicky založeny na tom, že umíme (respektive počítače umějí) poměrně rychle násobit dvě velmi velmi velmi velmi velká čísla, ale neumíme (respektive neznáme algoritmus, který by uměl) taková čísla v rozumném čase faktorizovat (tedy rozložit na prvočísla, jsou-li tato prvočísla velmi velmi velmi velmi velká); to mimo jiné znamená, že kdyby někdo přišel s něčím, co rozumně rychle faktorizovat umí (nemusel by to ani být algoritmus, ale třeba bedna plná krystalů, která pracuje s lomy světla), dokázal by snadno lámat tyto šifry, což by byl problém. Oproti symetrickým jsou asymetrické šifry zatraceně pomalé (a když říkám zatraceně, myslím tím o několik řádů pomalejší); na druhou stranu mají zjevnou výhodu, že k tomu, abyste rozšifrovali mou zprávu, vám nemusím dodávat klíč (pomocí kterého tu zprávu může přečíst kdokoliv), ale prostě si od vás vezmu jeden z vašich dvou klíčů (kterým zprávu zašifruji a který může hlavně kdokoliv vidět), zatímco pouze vy budete mít ten, kterým ji můžete dešifrovat.

Použití symetrické šifry je poměrně zjevné: Například chci zabezpečit svůj pevný disk proti fízlům, zašifruji jej symetrickým klíčem, který budu mít jen já, takže by ho ze mě museli jedině vymlátit, jinak mají smůlu; a i proti takovým případům existují programy: ty mohou zpřístupnit tajnou sekci dat jedním klíčem, zatímco supertajnou (jinou) sekci klíčem jiným. Jak si však zapamatovat náhodný klíč, který má třeba 256 bitů? Inu, od toho jiní matematičtí géniové stvořili hash; a co že to je? Hashovací funkci si lze pro naše potřeby (obecně je její definice širší) představit jako transformaci, které zadáme na vstupu libovolné heslo (ve kterém mohou být i vzory, vizme výše) a ona nám vygeneruje (krátký) klíč požadované délky (třeba těch 256 bitů), ve kterém vzory nejsou; respektive tam jsou, ale takové, že je se současnou úrovní poznání a techniky nedokáže žádný fízl nijak využít. Jako bonus neznáme algoritmus, který by dokázal zpětně z klíče dostat v rozumném čase to heslo; samozřejmě to nesmí být heslo příliš slabé, protože kdokoliv může zkoušet všechna možná hesla a hashovat je tak dlouho, dokud se výstup z jeho funkce nebude shodovat s naším klíčem. Zvolíme-li jako heslo třeba existující slovo, nezachrání nás ani sebelepší šifra; zde bohužel platí, že dobré heslo by mělo být dlouhé, nepodobné existujícím slovům, obsahovat velká i malá písmena, číslice, speciální znaky, panenskou krev… no dobře, tak krev ne, ale ten zbytek ano. Pro srovnání si vezměme jako příklad fízla se schopností otestovat sto tisíc hesel za vteřinu: postavíme-li mu do cesty osmimístné heslo složené jen z malých písmen, zabavíme ho na necelý měsíc; bude-li však heslo obsahovat krom malých písmen i ta velká, číslice a speciální znaky, protáhne se mu to na několik tisíc let (a jen přidáním devátého znaku má z tisíců statisíce, s desátým znakem pak desítky milionů; a roste to opravdu rychle, někde na přelomu jedenáctého a dvanáctého znaku překračujeme stáří vesmíru).

Asymetrické šifry jsou vhodné pro komunikaci: Jak už bylo uvedeno výše, ke každému šifrovacímu klíči existuje klíč dešifrovací; s touto dvojicí klíčů zacházíme tak, že šifrovací klíč zveřejníme, zatímco dešifrovací si necháme, takže kdokoliv nám chce pak napsat, prostě vezme náš veřejný klíč, tím zprávu zašifruje, takže ji pak můžeme dešifrovat pouze a jen my (nikdo jiný nemá dešifrovací klíč). Mimochodem, když klíče prohodíme (šifrovací uchováme v tajnosti a dešifrovací zveřejníme), máme elektronický podpis (tedy principiálně; konkrétní algoritmy se na to z dobrých důvodů používají různé: RSA a DSA; nicméně s mírou nepřesnosti, ve které se v rámci tohoto článku pohybujeme, můžeme o těch algoritmech prohlásit, že v podstatě dělají totéž), protože když někdo pomocí zveřejněného klíče naši zprávu dešifruje, je jasné, že jsme ji šifrovali my (nikdo jiný šifrovací klíč nemá), což si zapamatujme, ještě na to dojde řeč. K přenosu velkých dat lze využít výhod obou typů šifer: Data nejprve zašifrujeme symetrickou šifrou (což je rychlé), zatímco klíč (který je malý) zašifrujeme pomalou asymetrickou šifrou veřejným klíčem toho, komu chceme data poslat; on si nejprve dešifruje klíč, aby jím pak mohl dešifrovat i data samotná.

Až tak jednoduché to tedy je? Inu, dokud může útočník naše data pouze číst, pak ano, tohle skutečně funguje; jenže v praxi na Internetu je může nejen číst, ale i měnit. Co tedy udělá? Představme si modelovou situaci, kdy komunikuje Alice a Bob po lince, na které sedí fízl: Alice pošle Bobovi svůj veřejný klíč, fízl zprávu zachytí a pošle Bobovi místo toho svůj veřejný klíč (Bob si bude myslet, že je to Alicin klíč); Bob pak tímto klíčem zašifruje zprávu, kterou odešle, fízl ji zachytí, dešifruje, pak zašifruje Aliciným veřejným klíčem (ten získal v minulém kroku) a pošle dál Alici (jako kdyby byla od Boba). Výsledek? Alice i Bob žijí v domnění, že vše proběhlo správně, Alice zprávu přijala, ale ouha, má ji i fízl. Lze s tím něco dělat? Do jisté míry ano. Opatří-li Alice svůj veřejný klíč svým elektronickým podpisem, nemůže fízl podstrčit Bobovi svůj klíč tak, aby si Bob myslel, že je to Alicin klíč. Jsme hotovi? Ano, pokud si Bob dokázal ověřit pravost Aliciného podpisu. K čemuž potřeboval co? Klíč jejího podpisu. Jak ale může vědět, že je pravý, když na drátě sedí fízl? Od toho máme certifikační autority (CA), které jej digitálně podepíší. A celý problém se přesouvá na CA (fízl může číst a pozměňovat i komunikaci Boba s CA); a ta jej může přehodit na jakoukoliv další CA a tak dále… a řešení? Inu, nepůjde to bez toho, aby Bob zvedl zadek a s někým si nějaký klíč fyzicky vyměnil; toto je velmi důležitý poznatek: po nezabezpečené lince lze provozovat zabezpečenou komunikaci, avšak pouze v případě, že jsme si předtím po zabezpečené lince (což reálně není prakticky žádná, takže typicky osobně) s někým vyměnili klíč.

Ptáte se, k čemu byla celá ta hra na kohoutka a slepičku s elektronickými podpisy, CA a tak dále? Proč si Bob s Alicí nevyměnili klíče rovnou? To samozřejmě mohli a bylo by to dokonce nejlepší řešení, pokud by chtěli komunikovat jen spolu a věděli to předem. Na druhou stranu si však představte firmu, kde je důležité, aby spolu zaměstnanci komunikovali přes Internet bezpečně; když přijde někdo nový, musel by (kdyby neexistovala CA) oběhnout všechny kolegy a vyměnit si s nimi klíče. Máme-li CA, postačí, když dotyčný vymění klíč s ní (osobně); pak už může komunikovat s každým, kdo udělal totéž (princip je popsaný výše pro Alici a Boba: Alice pošle Bobovi veřejný klíč pro šifrovanou komunikaci a podepíše jej; Bob si vyžádá klíč od Alicina elektronického podpisu, tentokrát podepsaný CA, se kterou Bob i Alice mohou bezpečně komunikovat i ověřit její podpis, protože si vyměnili klíče osobně hned na začátku; tak si Bob může ověřit, že Alicin klíč k elektronickému podpisu je skutečně pravý; tím zas může ověřit, že její veřejný klíč k šifrované komunikaci je skutečně autentický a zašifruje jím svou zprávu; fízl na drátě tentokrát utře). Pro uklidnění dodávám, že toto šílené pobíhání od čerta k ďáblu za nás řeší software; je však nutné vědět, že se něco takového děje a ani sebesofistikovanější program se neobejde bez toho, aby měl na vstupu něco, čemu může důvěřovat… a to se tam typicky objeví tak, že to od někoho fyzicky dostanete (třeba od zaměstnavatele), nebo už je to v počítači nainstalováno s operačním systémem; toto a všechny důsledky z toho vyplývající je třeba vztáhnout například na veškerou HTTPS komunikaci, podobně jako na to, když někde na Internetu kliknete na „přijmout certifikát“.

A několik praktických rad na závěr:
1/ Chceme-li v praxi používat nějaké šifry, zapomeňme na vlastní invenci a zejména selský rozum, který zde představuje cestu do pekel. Zapomeňme na různé vlastní „vylepšováky“ a tím spíše na to, abychom si třeba nějakou šifru zkoušeli napsat sami; jsem si poměrně jist, že ničeho takového nebude schopen ani jeden z čtenářů tohoto textu. Ačkoliv nemám takovou radu sám rád, zde ji dávám: Věřme odborníkům a důsledně se do puntíku řiďme jejich pokyny (tj. máme-li například šifru, která stojí a padá s kvalitou klíče, prostě používejme hardwarový generátor náhodných čísel a nenechme se uchlácholit tím, že „nějaká náhoda stačí“, protože typicky nestačí). Používejme hotová řešení a to přesně a pouze k tomu, k čemu jsou určena.
2/ Nevnímejme jako neprolomitelné ty šifry, které tak ani nejsou prezentovány (opět je třeba naslouchat matematikům); většina šifer stojí a padá s tím, že zatím (!) neznáme algoritmus, který by dokázal v rozumném čase něco udělat (například faktorizovat). Typicky neexistují ani důkazy, že takový algoritmus neexistuje (i když před pár lety jsem zachytil zvěsti o tom, že někdo dokázal, že P != NP; nevím, jak a jestli již vůbec nějak dopadlo ověřování důkazu), přičemž i kdyby neexistoval pro Turingův stroj (tedy pro naše počítače), může kdykoliv někdo vyvinout nějaké úplně nové zařízení, které to nějak bude umět. Jedinou skutečně neprolomitelnou šifrou je Vernamova šifra, která má však obrovské nevýhody (klíč musí být tak dlouhý jako zpráva a naprosto náhodný; a nemá samozřejmě žádný smysl tento klíč posílat přes nezabezpečenou linku zašifrovaný jiným algoritmem, protože ten nezajišťuje tu neprolomitelnost, ergo jej lze použít jen tehdy, když dopředu víte, s kým budete komunikovat a můžete mu klíč předat bezpečnou cestou předem).
3/ Dobrá šifra je odolná i tehdy, když útočník zná šifrovací algoritmus; všichni vědí, jak tyto algoritmy fungují, přesto jim je to bez znalosti klíče k ničemu. Tedy mělo by být; existovaly pokusy, jak zajistit bezpečnost právě skrze utajení algoritmu samotného, což se nazývá „security through obscurity“ a je to v zásadě nefunkční koncept.
4/ To, že nějaká šifra funguje dnes, neznamená, že bude fungovat i zítra. Příkladů šifer, které byly svého času bezpečné, zatímco dnes už nejsou, existují mraky. Používáme-li tedy nějaký způsob šifrování, typicky to (s ohledem na bod 1/) znamená, že máme nějaký software, který si stáhneme z důvěryhodného zdroje (a jak je to s tou důvěryhodností, jsme si vysvětlovali výše), přičemž si musíme neustále uvědomovat, že to není účetní systém, který když jsme si pořídili před pětadvaceti lety, můžeme ho stále používat, necháme-li si na počítačích DOS (to je mimochodem historka z praxe z jedné ne úplně malé firmy), nýbrž něco, co může každým dnem přestat fungovat. Musíme se tedy neustále udržovat v obraze, sem tam si o tom něco přečíst a „jít s dobou“; jsme-li skutečně takový BFU, že nedokážeme ani toto, potřebujeme někoho, kdo to bude dělat za nás. Z tohoto důvodu sem ani nedávám odkazy na nějaký zaručeně nejlepší šifrovací software, protože to si musí zjistit každý sám (či s něčí pomocí, ale individuálně pro jeho potřeby, takže já zde ani radit nemohu, protože nevím, co přesně kdo z vás chce šifrovat a jaké má na to nároky a požadavky); není-li totiž takového zjištění schopen (a nemá-li nikoho, kdo mu s tím pomůže), rozhodně nedokáže ani adekvátně reagovat na případné změny světa v této oblasti.


Související články:


12345 (8x známkováno, průměr: 1,50 z 5)
3 348x přečteno
Updatováno: 13.12.2015 — 21:42
D-FENS © 2017