Kódování a šifrování

Kódování a šifrování jsou dva termíny, které se často vyskytují vedle sebe a někdy jsou (mylně) používány jako synonyma. Jak kódování, tak šifrování provádějí transformaci nějaké textu/dat z jedné podoby do druhé, ale motivace za touto transformací se radikálně odlišují.

Kódováním měníme reprezentaci dat tak, aby se nám s výsledným kódem (zakódovaným textem) lépe pracovalo – například abychom jej mohli lépe distribuovat/posílat nebo aby byl odolnější, třeba vůči chybám přenosu či záznamu.

Šifrování také data nějak transformuje, ale ne pro usnadnění následné manipulace, ale s cílem skrýt jejich obsah před nepovolanýma očima.

Kódování

Klíčovým termínem kódování je kód. Kód je předpis, jak jednu skupinu symbolů přeměnit na jinou. Zakódovanému symbolu říkáme kódové slovo.

Známým příkladem takového kódu je třeba Morseova abeceda, která nám dává předpis, jak přepsat písmena a čísla do sekvencí teček a čárek a naopak. Morseova abeceda je příkladem kódu, který používáme pro snazší komunikaci. Písmena a čísla v ní umíme vyjádřit pomocí kratších a delších signálů, takže pro komunikaci můžeme použít i baterku. Bez Morseovy abecedy (resp. kódování) by se nám pomocí baterky zpráva přenášela těžko.

Dalším příkladem kódování je Braillovo písmo, které nám dává jasný předpis jak písmena z latinky přepsat do Braillovy abecedy a zpátky.

U kódů se občas můžeme setkat s pojmem arita, která nám udává, kolika různými symboly daný kód disponuje. Má-li kód aritu n, říkáme, že kód je n-ární. V případě morseovky máme kód s aritou tři (symbol tečky, čárky a mezery), jde tedy o 3-ární (ternární) kód.

Pokud jsi už četl kapitolu o Číselných soustavách, možná ti to přijde trochu povědomé. I na číselné soustavy se můžeme dívat jako na kódy. Pojem arity potom odpovídá bázi.

Kódování využíváme i tehdy, když se chceme vyhnout chybám přenosu nebo alespoň snížit jejich vliv. V takových případech mluvíme o kódech schopných detekovat chybu, které, jak již název napovídá, jsou schopny detekovat chybu (například v přenosu), nebo dokonce o samoopravných kódech, které jsou schopné chybu i do jisté míry napravit.

Než přejdeme k příkladu, na kterém si kódy schopné opravit chybu i samoopravné kódy ukážeme, bylo by dobré projít si nějakou terminologii k přenosu (nejen) kódů.

Komunikace, přenost dat, probíhá mezi dvěma stranami: odesílatelem (anglicky sender) a příjemcem (receiver). Tyto strany mezi sebou mají médium, tedy něco, po čem se mohou šířit zprávy (může to být kabel, ale i vzduch jako v případě Wi-Fi a mobilních sítí). Po médiu neposíláme zprávu jen tak, ale musíme ji zakódovat na straně odesílatele, to má na starost kodér, a dekódovat na straně příjemce, což je práce dekodéru.

Zpráva se po zpracování kodérem stane kódem, aby se na druhé straně vysílání po zpracování dekodérem stala zase zprávou
Schéma odesílatel - příjemce s kodérem, médiem a dekodérem mezi nimi

Kvalita komunikace nezávisí jen na rychlosti přenosu, ale i na jeho spolehlivosti. V případě, kdy nebudeme mít spolehlivý přenos (např. u morseovky nám ve výhledu mohou bránit větve pohybující se ve větru), komunikace se stane nespolehlivou. A přesně to je důvod, proč se zabýváme zmíněnými chybu detekujícími a samoopravnými kódy, protože nám stížené podmínky pomáhají překonat.

Představme si situaci, kdy máme běžecký závod, při kterém běžci běhají mezi jednotlivými stanovišti. S každým stanovištěm máme omezený kontakt (můžeme přenášet pouze jedničky a nuly), přičemž nás zajímá, zda na daném stanovišti už byli všichni běžci. Máme tedy dvě možné odpovědi: ANO a NE.

Zakódujeme si tedy ANO jako 1, NE jako 0. Zeptáme-li se stanoviště, zda jej navštívili všichni běžci, dostaneme buď 1, nebo 0. Problém nastane, pokud spojení není stoprocentně spolehlivé a čas od času nám posílanou hodnotu obrátí. V případě, že taková chyba nastane a stanoviště nám pošle ANO (1), dostaneme NE (0) čistě proto, že při přenosu došlo k chybě.

Zkusíme si tedy naše kódování upravit. Odteď budeme používat pro ANO kódové slovo 11 a 00 pro NE. To znamená, že přenášíme dvojnásobek dat než v přechozím případě, ale pokud dojde k chybě (dostaneme 10 nebo 01), jsme schopni takovou situaci detekovat a od stanoviště si vyžádat novou odpověď. Tento kód tedy umí detekovat jednu chybu (v případě, že by se staly chyby dvě, dostáváme se do stejné situace jako v předešlém případě).

Pokud bychom si z nějakého důvodu nechtěli říkat o novou odpověď, můžeme zkusit použít nějaký samoopravný kód. Naposledy si pojďme změnit způsob kódování našich odpovědí, ANO bude 111, NE bude 000. Jestliže dojde k chybě s tímto kódováním a obdržíme třeba odpověď 110, můžeme s určitou jistotou říct, že ze stanoviště nám bylo posláno ANO (111), protože alternativa (NE – 000 a dvě chyby v přenosu) je méně pravděpodobná.

V přípdě posledního samoopravného kódu stojí za povšimnutí, že daný kód umí opravit pouze jednu chybu, ale detekovat umí i dvě. Daní za tuto vlastnost je to, že oproti prvnímu kódování přenášíme trojnásobek dat (1/0 vs 111/000) na jednu informaci (ANO/NE).

Část věnovanou kódování uzavřeme Hammingovou vzdáleností. Hammingova vzdálenost dvou (stejně dlouhých) kódových slov je číslo, které udává, na kolika místech se slova liší. Pokud vezmeme všechna kódová slova daného kódu a spočteme všechny Hammingovy vzdálenosti mezi nimi, nejmenší vzdálenost je Hammingovou vzdáleností celého kódu. Tato vzdálenost udává, ke kolika chybám musí při přenosu dojít, abychom zaměnili dvě různá kódová slova. Jinak řečeno, pokud je Hammingova vzdálenost rovna m, pak kód umí detektovat m-1 chyb.

Když se podíváme na kódy z předchozího příkladu, dostaneme následující Hammingovy vzdálenosti:

  • 1 pro kódování ANO = 1, NE = 0; kód neumí detekovat chyby
  • 2 pro kódování ANO = 11, NE = 00; kód umí detekovat jednu chybu
  • 3 pro kódování ANO = 111, NE = 000; kód umí detekovat dvě chyby

Kdybychom měli kódovat stavy semaforu (červená, oranžová, zelená), pro následující kódy dostaneme odpovídající vzdálenosti:

  • 2 pro kódování červená = 1100, oranžová = 1001, zelená = 0110
  • 1 pro kódování červená = 11, oranžová = 01, zelená = 00
  • 2 pro kódování červená = 100, oranžová = 010, zelená = 001

Jak je vidět z prvního a posledního kódování semaforu, delší kódová slova nutně neznamenají větší vzdálenost.

Šifrování

V přechozí části jsme se kódováním snažili řešit situace, kdy musíme zprávu jednak adaptovat k přenosu (morseovka) a jednak reagovat na chyby vzniklé při přenosu. Šifrováním se budeme snažit přenášenou zprávu ochránit před slídivýma očima potenciálního záškodníka.

Alice a Bob si spolu vyměňují zprávu. Eva sleduje přenos na médiu a může si tak přečíst obsah zprávy
Přenos zprávy mezi Alicí a Bobem, kterou Eva odposlouchává

V kryptografii se běžně používají jména Alice a Bob pro dvě spolu komunikující strany. Třetí stranou, která se snaží komunikaci odposlouchávat, bývá obvykle Eva.

Šifra je předpis (algoritmus) transformace dat na šifrovaná data, přičemž tato šifrovaná data přečte jen ten, kdo vlastní tajnou informaci. Této informaci říkáme klíč. Klíč potřebujeme mít jak při šifrování (anglicky encryption) dat, tak při opačném procesu transformace šifrovaných dat (anglicky ciphertext) zpátky na původní data (anglicky plaintext). Tento opačný proces nazýváme dešifrování (anglicky decryption).

Alice a Bob tentokrát zprávu před přenosem zašifrují. Eva opět sleduje přenos, ale kvůli šifrování není schopna si přečíst obsah zprávy
Přenos zprávy mezi Alicí a Bobem, kterou Eva odposlouchává

Šifry dělíme na dva typy podle toho, zda klíč, který používáme při šifrování, je stejný jako ten, který používáme při dešifrování. Pokud ano, jde o symetrickou šifru, pokud pokaždé používáme jiný klíč, jde o asymetrickou šifru.

Symetrické šifry

Jak jsme už zmínili, symetrické šifry využívají stejný klíč pro šifrování i dešifrování. Díky tomu jsou obecně i výpočetně rychlejší než asymetrické šifry. Požadavek, aby obě strany měly stejný klíč, se může ukázat jako problém, protože před zahájením komunikace je potřeba k oběma stranám stejný klíč dostat.

Alice s pomocí klíče zašifruje zprávu a zašifrovaná data pošle Bobovi. Ten s pomocí stejného klíče zprávu dešifruje. Eva není schopna zprávu dešifrovat, protože nemá stejný klíč jako Alice s Bobem
Přenos zprávy mezi Alicí a Bobem, kterou Eva odposlouchává

Klasický příkladem symetrické šifry je Caesarova šifra, kterou používali, jak název napovídá, už starověcí Římané. Myšlenka šifry je přitom jednoduchá. Na začátku mám nějakou zprávu, kterou chci zašifrovat, a nějaké číslo n, které si zvolím. Šifrování probíhá tak, že procházíme text zprávy písmenko po písmenku a místo aktuálního písmene napíšeme písmeno o n pozic v abecedě posunuté. Pochopitelně pokud bychom se dostali na konec abecedy, vrátíme se na začátek (tj. pokud je n = 1 a písmenko je Z, dostaneme v anglické abecedě A, kdežto v české dostaneme Ž). Pro dešifrování pak musíme proces obrátit, písmeno tedy posouváme druhým směrem (např. při dešifrování se z C se při posunu o 2 stane A).

Zašifruj pomocí Caesarovy šifry s posunem 6 (tj. n = 6) zprávu informatika. Pomocí stejné šifry s posunem 1 dešifruj lszquphsbgjf. Pro jednoduchost ber v úvahu pouze anglickou abecedu. (Výsledek se ti ukáže po kliknutí.)

Po zašifrování bys měl dostat otluxsgzoqg.

Po dešifrování bys měl dostat kryptografie.

Samozřejmě v dnešní době Caesarovu šifru nepoužíváme, protože není bezpečná (k jejímu prolomení nám stačí vyzkoušet všechny posuny, kterých je 25 v případě anglické abecedy a 41 v případě české abecedy) a nemá ani spoustu vlastností, které od dobré šifry vyžadujeme (např. stejná data/písmena jsou šifrována stejně, což má z následek větší náchylnost vůči útokům využívající různé vlastnosti jazyka – některá písmena se v textu objevují častěji než jiná). Příkladem dnes hojně používané symetrické šifry je třeba AES (Advanced Encryption Standard), kterou používáme u Wi-Fi.

Asymetrické šifry

U symetrických šifer jsme si říkali, že potenciální slabinou je sdílení klíče mezi stranami ještě před začátkem komunikace. V případě asymetrických šifer tento problém řešit nemusíme, oproti symetrickým šifrám ale platíme rychlostí.

V případě asymetrické kryptografie má každá komunikující strana dva klíče: veřejný (anglicky public) a soukromý/privátní (anglicky private). Tyto klíče na sobě nejsou nezávislé, naopak, jsou spolu úzce spojené tak, že k dešifrování zprávy zašifrované s pomocí jednoho klíče potřebujeme právě ten druhý klíč.

Za asymetrickou kryptografií je hezká ale poměrně složitá matematika, takže to více rozebírat nebudeme. Ale pokud sis četl kapitolku věnovanou číselným soustavám, možná si vzpomeneš na funkci modulo. Ta se v asymetrické kryptografii hojně využívá – mluvíme o takzvané modulární aritmetice.

Jak je z názvů klíču patrné, jeden je veřejný a každý se k němu může dostat. Druhý je soukromý a nakládat s ním může jen vlastník. Komunikace mezi dvěma stranami pak probíhá tak, že odesílatel zašifruje zprávu pomocí veřejného klíče příjemce. Příjemce dostane zašifrovanou zprávu a protože jako jediný má odpovídající soukromý klíč, je schopen zprávu dešifrovat. Pokud bude chtít na zprávu reagovat, zašifruje odpověď veřejným klíčem původního odesílatele a proces se zopakuje na druhé straně.

Alice pomocí Bobova veřejného klíče zašifruje zprávu a odešle ji Bobovi. Ten ji pomocí svého soukromého klíče dešifruje. Eva má veřejné klíče Boba i Alice a sleduje přenos, přesto není schopna zprávu dešifrovat, protože nemá Bobův soukromý klíč.
Přenos zprávy mezi Alicí a Bobem, kterou Eva odposlouchává

V dnešní době je asymetrická kryptografie široce využívaná a to nejen k šifrování (např. RSA), ale třeba i k výměně klíčů (algoritmus Diffie-Hellman), kdy se pomocí asymetrické kryptografie dvě strany bezpečně shodnou na společném klíči – ten pak mohou použít pro symetrickou šifru, pokud je pro ně důležitá třeba rychlost komunikace.

V poslední době skloňovanou aplikací asymetrické kryptografie je digitální podpis. Ten slouží k ověření pravosti dokumentu. Pokud nám například v e-mailu přistane nějaký dokument, ještě to neznamená, že je pravý a nezměněný. Digitální podpis nám dává mechanismus, jak jeho pravost ověřit.

Princip je velice podobný šifrování jen s tím rozdílem, že nešifrujeme dokument, ale jeho otisk (anglicky hash), což je unikátní číslo, které je dokumentu přiřazeno hašovací funkcí (anglicky hash function) na základě jeho obsahu. Pokud se obsah změní, změní se i číslo, které nám funkce vrací.

Abychom nějaký dokument podepsali, vezmeme tento otisk dokumentu a zašifrujeme jej s pomocí našeho soukromého klíče – náš podpis je výsledkem šifry. Následně dokument odešleme i s podpisem. Druhá strana pak dokument s podpisem ověří tak, že si sama spočítá otisk dokumentu. Následně s pomocí našeho veřejného klíče dešifruje náš podpis a porovná, zda se výsledek shoduje se spočítaným otiskem. Pokud ano, druhá strana ví, že dokument dorazil nezměnen a že jsme jej podepsali my (použili jsme soukromý klíč).

Shrnutí

V této kapitole jsme si vysvětlili rozdíl mezi kódováním a šifrováním včetně jejich několika aplikací. Šifry jsme si rozdělili na symetrické a asymetrické, řekli jsme si, čím se liší a opět jsme zmínili několik možností využití.

Na konci této kapitoly bys měl být schopen:

  • vysvětlit rozdíl mezi kódováním a šifrováním
  • popsat úlohu klíče v šifrování
  • vysvětlit v čem se liší symetrické šifrování od asymetrického
  • říct k čemu slouží digitální podpis