Tuto část jsem začlenil až za samotný popis Blowfishe, aby zbytečně neobtěžoval ty čtenáře, které zajímá pouze samotný algoritmus. V této části bych chtěl blíže uvést vlastnosti blokových šifer, způsoby jejich provozu a kritéria jejich návrhu. Cílem tohoto textu má být především seznámení s tímto typem šifer a nikoliv jejich detailní a všezahrnující popis. Pro ty, kteří se chtějí dozvědět více (nejen o blokových šifrách, ale kryptografii celkově) bych doporučil [3].
Konfuse a difuse
Tyto pojmy úzce souvisí s teorií informace, která patří mezi základní matematické kameny kryptologie.
Úkolem konfuse je skrýt vztahy mezi otevřeným a šifrovým textem, případně i klíčem. Nejjednodušší způsob konfuse je substituce. Ta může mít podobu Caesarovy šifry1, nebo může být zajištěna mnohem komplikovanějším způsobem (např. S-boxy).
Difuse pak rozšiřuje vliv jednotlivých bitů otevřeného textu a klíče na tak velkou část šifrového textu, jak je to jen možné. Nejjednodušším způsobem je transpozice (též permutace) – počínaje jednoduchými transpozičními šiframi až po důmyslnější systémy.
Samotná konfuse je pro zabezpečení dostatečná, jak ukazují některé proudové šifry opírající se pouze o konfusi. Naproti tomu samotná difuse je většinou nedostatečná, protože ji lze snadno luštit. Blokové šifry využívají jak konfusi tak difusi. Vezměme si jako příklad již popsaný Blowfish – expanze klíče a aplikace P-boxu představují difusi, S-boxy a funkce F pak zajišťují konfusi.
Iterativní provádění
Iterativní bloková šifra – jejím základem je jednoduchá funkce provádějící šifrování jednoho bloku, která je několikrát po sobě iterativně zopakována (stále v rámci šifrování jediného bloku). Tato myšlenka se odráží též ve většině blokových šifer.
Význam tohoto “opatření” ukážeme na DESu2. DES s dvěma rundami není příliš silnou šifrou; teprve po 5-ti rundách je každý bit výstupu (tj. bloku šifrového textu) závislý na všech bitech vstupu (tj. bloku otevřeného textu) a bitech klíče. DES o 16-ti rundách je již dostatečně silný, o 32-ti rundách ještě silnější.
Většina blokových algoritmů jsou tzv. Feistelovy sítě. Jejich základní myšlenka (pochází z počátku 70. let 20. st.) je taková, že vstupní blok o n bitech rozdělíme na 2 části délky n/2 bitů (samozřejmě uvažujeme n sudé) – označme je L a R. Nyní definujme iterativní blokový algoritmus, kde vstup do i-té rundy je výstupem vždy rundy předcházející, popsaný následovně:
Li = Ri-1
Ri = Li-1 XOR f(Ri-1, Ki),
kde Ki je podklíč použitý v i-té rundě a f je libovolná funkce.
Reverzibilnost tohoto algoritmu je dána reverzibilností funkce XOR, bez ohledu na to jak složitá je funkce f. Neboť paltí:
Li-1 XOR f(Ri-1, Ki) XOR f(Ri-1, Ki) = Li-1.
Každý algoritmus který se bude držet tohoto principu pak může být využit jak pro šifrování tak pro dešifrování, ovšem za předpokladu, že vstupy pro funkci f v každé rundě mohou být obnoveny.
Mezi šiframi, které jsou na tomto principu postaveny, uveďme např. DES, Lucifer, FEAL, GOST, CAST, Blowfish (detailní rozbor této vlastnosti Blowfishe je k dispozici zde),…
Grupová struktura
Jednou z otázek, která se při studiu algoritmu té které šifry řeší, je algebraická struktura algoritmu. Především pak to, zda algoritmus netvoří grupu3 (nebo spíše jak blízko daný algoritmus grupě je). Grupová struktura by v tomto případě znamenala, že operace šifrování by byla na množině všech šifrových textů uzavřená vzhledem k různým hodnotám klíče. Jinak řečeno by to znamenalo, že pro dva různé klíče K1 a K2, by existoval klíč K3 takový, že:
EK2(EK1(P)) = EK3(P) ,
kde EK() je šifrovací algoritmus s klíčem K a P je otevřený text.
To by znamenalo, že pro danou šifru nemá dvojité, nebo i vícenásobné šifrování stejným algoritmem (avšak s různým klíčem) smysl. Navíc je toto zjištění velmi důležité při odhadu velikosti prostoru klíče pro luštění metodou totálních zkoušek (brute-force attack), tj. odhadu počtu klíčů, po jejichž vyzkoušení bude šifra prolomena (grupová vlastnost tento počet výrazně snižuje).
Slabé klíče (weak keys)
Jako slabé klíče se označují takové klíče, které vytváří podklíče s jistými vlastnostmi (v souvislosti s Blowfishem generují takové klíče S-boxy, ve kterých se vyskytují identické položky, tj. podklíče). Text zašifrovaný pomocí slabého klíče je pak snadnější prolomit. Proto existence slabých klíčů může být znepokojující. Ovšem při malém počtu slabých klíčů vzhledem k celkovému počtu všech klíčů to není až tak kritické (např. pro Blowfish je pravděpodobnost, že zvolíte slabý klíč, zhruba 1:214) – navíc většinou lze zkontrolovat (bohužel až po expanzi klíče na podklíče), zda zvolený klíč není slabý.
Návrh blokových šifer
Jak je uvedeno v [3], je návrh blokové šifry jednoduchý – pokud máte dostatek paměti, zvolíte velikost S-boxu 48*32 bitů a algoritmus bude bezpečný; jen těžko navrhnete variantu DESu, která nebude bezpečná, pokud zvolíte počet rund asi tak 128;…
Skutečný trik (a také důvod, proč návrh “opravdové” šifry není tak jednoduchý, jak se může zdát) je navrhnout takovou blokovou šifru, která nebude mít zbytečně dlouhý klíč, zbytečně velké paměťové nároky a bude proveditelná v co nejkratším čase.
Kryptografický mód šifry obvykle kombinuje její základní algoritmus se zpětnou vazbou. Tato kombinace je zajištěna pomocí nějaké jednoduché operace – jednoduché proto, že bezpečnost má být zajištěna samotnou šifrou a nikoliv módem jejího provozu. Přirozeně naopak nesmí platit, že kryptografický mód bude bezpečnost šifry snižovat.
Důvodů pro použití jiného módu, než je základní (tj. originální podoba šifrovacího algoritmu), je několik. Jedním z nich je zvýšení bezpečnosti šifry – takovým příkladem může být snaha o zakrytí charakteristických rysů4 šifrového textu. Dalším důvodem může být to, že vlastnosti blokové šifry zcela neodpovídají požadavkům její aplikace (např. je třeba šifrovat text po menších částech než je velikost bloku potřebného pro šifrování). Důvodem může také být snaha o zabezpečení proti případným bitovým chybám v šifrovém textu (je třeba si uvědomit, že šifrová zpráva je přenášena od odesílatele k příjemci po komunikačním kanálu, který ne vždy je zcela bezporuchový). Jistě by se našla ještě celá řada smysluplných důvodů. Jak ale uvidíme, splňuje každý mód vždy pouze určitou podmnožinu všech těchto požadavků.
Některé módy jsou též standardizovány – konkrétně ECB, CBC, CFB a OFB jsou součástí norem FIPS 81 a ANSI X3.106-1983. Kromě toho zahrnují tyto normy i způsob šifrování kratších bloků, než odpovídá bloku dané šifry (některé tyto způsoby jsou diskutovány v závěru této části).
ECB (Electronic CodeBook mode)
Tento mód se nijak významně neliší od normálního algoritmu šifry. Jedná se vlastně o to, že v případě, kdy se stejný blok otevřeného textu šifruje vždy na jeden a ten samý blok šifrového textu, můžeme šifrovací algoritmus nahradit překladovou tabulkou (coodebook). Indexem do této tabulky bude blok vstupního (otevřeného) textu a každá položka bude obsahovat blok výstupního (šifrového) textu příslušný k danému indexu.
Pokud budeme uvažovat šifru s velikostí bloku 64 bitů, pak by taková tabulka měla 264 položek (každá položka má 64 bitů), což znamená, že by velikost této tabulky byla 267B – a to už je docela dost. A přitom pro každý klíč je třeba vytvořit novou tabulku. Z toho plyne, že využití tohoto módu bude vhodné při šifrování velkého množství dat a to ještě pomocí téhož klíče. I přesto je možné použít tento mód pouze při malých velikostech bloků, pro velké bloky by pak bylo nutné použít nějaké zjednodušení (např. použití tabulky pro určité množství nejpoužívanějších bloků a ostatní bloky šifrovat standardním algoritmem).
Výhodou tohoto módu oproti ostatním módům je nezávislost šifrování každého bloku otevřeného textu na ostatních (ať už předcházejících nebo následujících) blocích. To umožňuje jednak s výhodou paralelizovat proces šifrování celé otevřené zprávy. Navíc šifrování můžeme provádět zcela libovolně (například můžeme začít šifrovat od středu zprávy, pak zašifrovat její začátek a jako poslední zpracovat konec).
Nevýhody již mohly vyplynout z předcházejícího. Především omezená použitelnost vzhledem k délce bloku. Navíc je tento mód stejně bezmocný vzhledem k charakteristickým rysům otevřeného textu, které se do šifrového textu přenáší stejně jako při normálním způsobu šifrování.
CBC (Cipher Block Chaining mode)
Tento mód rozšiřuje standardní algoritmus blokové šifry o zpětnou vazbu, která zavádí do šifrování i-tého bloku otevřeného textu výsledek šifrování bloku (i - 1). Jinak řečeno to znamená, že každý blok je použit pro modifikaci šifrování následujícího bloku. Důsledkem toho je závislost bloku šifrového textu nejen na příslušném bloku otevřeného textu, ale též na všech předchozích blocích.
Konkrétně v CBC módu se popsaná zpětná vazba uplatňuje tak, že blok otevřeného textu je před šifrováním (pomocí standardního algoritmu blokové šifry) XORován se zašifrovaným předchozím blokem. Graficky je to vyjádřeno na obr. 1. Dešifrování je obdobné (viz obr.1). Nejprve se provede dešifrování bloku šifrového textu standardním algoritmem a pak se na tento výsledek provede operace XOR s předchozím blokem šifrového textu.
Obr.1 CBC šiforvání a dešifrování
Matematický zápis uvedených postupů vypadá následovně:
Ci = EK(Pi A Ci-1)
Pi = Ci-1 A DK(Ci)
Aplikováním CBC módu se budou dva identické bloky (např. ve dvou zprávách) šifrovat na různé bloky šifrového textu pouze tehdy, když se posloupnosti bloků otevřeného textu předcházející uvažovaným bloků budou lišit. Pak se ale nabízí otázka, jak zajistit, aby výsledkem šifrování dvou identických zpráv byly dvě různé šifrové zprávy5? Pozorného čtenáře už také napadla další otázka: Jakým způsobem se šifruje první blok otevřeného textu, pro nějž se nemůže uplatnit zpětná vazba (neboť pro něj neexistuje žádný předcházející blok)? Odpovědí na obě tyto otázky je inicializační vektor (IV, někdy též nazývaný inicializační proměnná nebo počáteční hodnota).
IV je vlastně blok náhodných dat, který se pak používá jako “nultý” blok otevřeného textu. Ten se zašifruje standardním šifrovacím mechanismem a jeho výsledek se pak použije ve zpětné vazbě pro první blok otevřeného textu. Jak už bylo řečeno, bývá IV náhodný (často se používá tzv. timestamp6), ale zcela jistě na něj lze nahlížet jen jako na další klíč (jehož délka odpovídá délce bloku). IV bývá součástí zprávy (i když si lze představit, že nebude součástí) – na jejím začátku jako zmiňovaný “nultý” blok a to buď v zašifrované podobě (jak bylo uvedeno na začátku odstavce) nebo v nezašifrované7.
Použitím IV by pak nemělo nastat, že dvě stejné zprávy budou zašifrovány na stejné šifrové zprávy.
CFB (Cipher-FeedBack mode)
V tomto módu se bloková šifra chová jako proudová šifra s vlastní synchronizací (více informací např. v [3]).
Jak již bylo zmíněno v úvodu této části, vyžadují
některé aplikace (především síťové), aby mohla být daná šifra použita na bloky
menší velikosti, než je velikost používaná v algoritmu šifrování. Jako
příklad si můžeme vzít třeba terminál – ten by měl být schopen předat serveru
každý vložený znak (avšak při délce bloku šifry 64 bitů by bylo třeba nejprve
zadat celkem 8 znaků, než by mohly být tyto zašifrovány a odeslány serveru).
V některých případech dokonce nemusí dosahovat šířka komunikační cesty, po
níž se mají zašifrovaná data přenášet, velikosti bloku šifry. Takový způsob
šifrování nesplňuje ani základní/ECB mód šifry, ani mód CBC8.
Obr. 2 Princip šifrování a dešifrování v CFB módu
Právě tento problém řeší CFB. Princip šifrování a dešifrování 8-bitového CFB módu pro 64-bitovou blokovou šifru je ukázán na obr. 2. Na začátku musí být posuvný registr naplněn IV (to trochu připomíná CBC) – velikost registru odpovídá velikosti bloku šifry. Pomocí standardního šifrovacího mechanismu (pro danou šifru) zašifrujeme obsah posuvného registru a z výsledku si vezmeme nejlevějších (tj. nejvíce významných) 8 bitů (v obecném n-bitovém CFB bychom vzali n bitů). Prvních 8 bitů otevřeného textu pak zXORujeme s touto hodnotou a získáme prvních 8 bitů šifrového textu. Obsah posuvného registru posuneme o 8 bitů (v obecném případě o n bitů) doleva. Příslušných 8 bitů šifrového textu pak vložíme na místo nejnižšího bytu v posuvném registru – tj. vlastně jakoby nasuneme tyto bity zprava do posuvného registru (tímto způsobem je zajištěna zmiňovaná zpětná vazba). Obsah posuvného registru opět zašifrujeme a vybereme nejlevější byte, provedeme XOR s dalšími 8 bity otevřeného textu, atd.
Dešifrování je obdobné. Stejným způsobem jako při šifrování získáme z IV první podklíč k (8 nejlevějších bytů zašifrovaného obsahu posuvného registru). Ten pak použijeme pro XOR s prvními 8 bity šifrového textu, čímž získáme původní byte otevřeného textu. Přitom každou jednotku (zde 8 bitů) přijatého šifrového textu nasouváme do posuvného registru stejným způsobem jako při šifrování. Tímto způsobem pak pokračujeme v dešifrování přicházející posloupnosti jednotek šifrového textu.
Obecné n-bitové CFB lze též graficky vyjádřit jako na obr. 3. Tomu odpovídá matematický zápis:
|
|
Důležitým požadavkem je, aby obě strany (odesílatel i příjemce) měly správně inicializovaný posuvný registr (jeden způsob může být takový, že jako prvních m bitů, kde m je délka bloku šifry, se vyšle IV, a pak teprve následuje samotný obsah zprávy; IV také může být sdělen přes jinou komunikační cestu). Stejně jako u CBC nemusí být IV tajný (protože bez znalosti klíče K není samotné IV příliš platné). Přesto je z hlediska bezpečnosti vhodné, aby každá zpráva používající stejný klíč byla zašifrována použitím jiného IV. Zde bych také rád upozornil, že neznalost IV (při znalosti klíče K) způsobí špatné dešifrování pouze prvního bloku šifrového textu, ostatní bloky již budou dešifrovány správně (to si snadno můžete ověřit v ukázkovém appletu). Tím jsem chtěl poukázat, že v tomto případě není možné pohlížet na IV jako na “další” klíč. Tímto však netrpí OFB mód.
Ještě řekněme, že podobně jako u CBC i u CFB závisí výsledek šifrování dané jednotky otevřeného textu závisí na předcházejících částech otevřeného textu.
OFB (Output-FeedBack mode)
Tento mód je téměř stejný jako CFB, ale narozdíl od CFB se na uvolněné místo v posuvném registru vkládají bity podklíče ki. To je patrné i z obr. 4. Jistě vás napadlo, že tento způsob netvoří “skutečnou” zpětnou vazbu mezi šifrovým a otevřeným textem (tak jak tomu bylo u CBC nebo CFB) – tomuto se někdy říká vnitřní zpětná vazba (internal feedback).
Obr. 4 Princip šifrování a dešifrování v OFB módu
Pro úplnost ještě uveďme matematickou podobu n-bitového OFB (a příslušný obrázek obr. 5):
|
|
Si představuje obsah (nebo též stav) posuvného registru.
Poměrně zajímavou vlastností OFB je to, že posloupnost podklíčů ki můžeme při znalosti IV a klíče K počítat takříkajíc offline, tj. aniž bychom znali otevřený (při šifrování), či šifrový (při dešifrování) text. To samozřejmě může výrazně urychlit operace šifrování i dešifrování. Ještě jako poznámku uveďme, že pro OFB i CFB nám postačí znalost šifrovacího algoritmu blokové šifry (dešifrovací algoritmus se nikde nevyužívá).
Pro IV platí stejná pravidla jako u CFB. Ovšem, jak už bylo zmíněno u CFB, neznalost IV způsobí chybné dešifrování všech bloků šifrového textu.
Pro upozornění ještě uveďme, že v tomto módu je podle [3] z hlediska bezpečnosti doporučováno používat blokovou šifru s délkou bloku n bitů pouze v n-bitovém OFB módu.
Counter mode
Tento mód provozu blokové šifry je obdobný OFB. Ovšem namísto posuvného registru se používá čítač (tím se ztrácí jakákoliv zpětná vazba). Po každém zakódování jednoho bloku se hodnota čítače změní o konstantu, zpravidla se zvětší o jedna. Namísto čítače je možné použít i např. generátor náhodných čísel (pro dešifrování je však vždy nutno použít stejnou posloupnost hodnot, která byla použita pro šifrování).
Shrnutí módů provozu blokových šifer
Pokud si zbytečně nechcete přidělávat práci s dodatečnou úpravou algoritmu, pak zcela jistě užijete ECB (uvažujeme že ECB zahrnuje základní algoritmus šifrování). Nicméně tento mód není vhodný pro kódování zpráv (neboť jeho kryptoanlýza je ze všech módů nejjednodušší a ze všech módů je nejzranitelnější).
CBC je obecně nejlepší pro šifrování souborů – když nic jiného, tak zvýšení bezpečnosti může být výrazné.
CFB/OFB je vhodné pro šifrování posloupnosti znaků (zpravidla 8-bitových), kdy je vhodné, aby každý znak byl zpracován nezávisle. OFB má oproti CFB výhodu v rychlosti. Také má jisté výhody v případě chyb vzniklých při přenosu (touto vlastností jednotlivých módů jsme se zde však nezabývali).
Samozřejmě existuje i celá řada dalších módů, které jsou více či méně obdobou výše uvedených, nebo jejich kombinací (některé lze nalézt v [3]). Lze však říci, že použití jednoho z “klasických” módů – ECB, CBC, CFB a OFB – je vhodné téměř pro každou aplikaci. Naproti tomu většina různých komplikovaných módů může přinést oproti zvýšení bezpečnosti spíše pouze zvýšení komplexnosti základního algoritmu.
Možnosti zakončení otevřeného textu
Základní otázkou při volbě způsobu zakončení (v angl. padding) je otázka, zda požadujeme zachování stejné délky šifrového textu jako je délka otevřeného textu. To je důležité např. u šifrování souborů, neboť u zašifrovaného souboru můžeme často požadovat, aby měl stejnou velikost jako původní soubor. Podle toho je pak třeba zvolit vhodný mód šifry (např. u ECB nelze zaručit shodnou délku otevřeného a šifrového textu). Pro následující odstavce uvažujme, že Pn-1 představuje předposlední, celý blok otevřeného textu a Pn pak poslední, avšak neúplný blok. Nyní však již k samotnému zakončení.
Pokud nám nezáleží na délce šifrového textu, pak lze použít doplnění posledního bloku otevřeného textu (pokud tento blok nemá potřebnou délku) nějakým charakteristickým řetězcem. Nejčastěji se používá nulový řetězec (tj. řetězec nulových bitů). Lze ovšem použít i jedničkový řetězec (tj. bitový řetězec 11…1), nebo různé periodické řetězce (např. 1010…10, apod.). Tento způsob zakončení lze použít pro všechny módy. Jediným nedostatkem je fakt, že výsledek dešifrování textu (který byl zašifrován s využitím tohoto zakončení) není identický s původním otevřeným textem, ale je zakončen právě charakteristickým řetězcem.
V případě ECB módu lze tento problém vyřešit tak, že poslední byte charakteristického řetězce bude obsahovat počet bitů (charakteristického řetězce), které byly přidány k otevřenému textu při šifrování. Po dešifrování se pak tento byte přečte a odebere se příslušný počet bitů z konce dešifrovaného textu, čímž získáme původní otevřený text. Bity charakteristického řetězce (samozřejmě až na posledních 8 bitů) mohou být voleny i náhodně. Tento způsob zakončení lze využít i pro CBC mód. Bohužel, charakteristický řetězec musí být v tomto případě doplněn i tehdy, když délka původního otevřeného textu je celistvým násobkem délky bloku šifry
Nicméně pro CBC mód lze dokonce dosáhnout toho, že šifrový text má přesně stejnou délku, jako původní otevřený text. Takové způsoby zakončení jsou dva. Princip prvního zakončení je ukázán na obr. 6. Za nevýhodu tohoto způsobu lze považovat to, že poslední část otevřeného textu Pn není přímo modifikována šifrovacím algoritmem. To je odstraněno druhým způsobem, který vyjadřuje obr. 7. V tomto případě C´ je nevýznamná část, která může být ze zašifrovaného textu odstraněna9. Tento způsob vypadá poněkud záhadně, ale každý se může snadno přesvědčit, že skutečně bude fungovat.
Obr. 6 Způsob zakončení u CBC módu |
Obr. 7 Jiný způsob zakončení u CBC módu |
V případě CFB a OFB (popř. jiných podobných módů) se předpokládá, že otevřený text je tvořen n-bitovými slovy, po nichž probíhá kódování (pak je zřejmé, že šifrový i otevřený text mají stejnou délku). Pokud tomu tak není, lze použít zakončení posledního m-bitového (m < n) slova charakteristický řetězec.
Poznámky
Caesarova šifra je založená na tom, že každé písmeno otevřeného textu nahradíme písmenem, které leží v abecedě o 3 písmena dál (pro poslední písmena abecedy se následující písmena berou cyklicky, tj. ze začátku abecedy).Pak tedy (“® ” značí náhradu): A ® D,…, X ® A, Y ® B, Z ® C. Analogické informace pro Blowfish nebyly k dispozici. Pro méně matematicky fundované čtenáře řekněme, že grupa matematická struktura s jistými vlastnostmi. Pro pochopení významu uvedeného textu není znalost těchto vlastností zcela nutná. Za charakteristický rys můžeme považovat různé standardní části textu, který chceme šifrovat – např. taková e-mailová zpráva obsahuje před samotným textem hlavičku, která vždy obsahuje “Jméno:…”, “Název:…”, apod. Při použití stejného klíče se pak tyto charakteristické rysy zašifrují vždy stejně a promítnou se tak do šifrového textu, což může výrazně šifru oslabit proti případnému útoku (např. modifikaci). Příklad s e-mailem je poměrně neškodný, ale při šifrování zpráv v bankovním styku je tento problém již dostatečně závažný. Toto není ani tak záležitost dvou identických zpráv, ale spíše začátků dvou zpráv, které mohou být identické, přestože zbytek obou zpráv je již jiný. (Vzpomínáte si ještě na charakteristické rysy, které jsme diskutovali dříve?) Timestamp je v překladu časová značka. Typicky to může být okamžik odesílání zprávy. Vezměte v úvahu, že šifrový text je posloupnost bloků B1, B2,…,Bn. Přitom B1 je zašifrováno pomocí IV, B2 je zašifrováno pomocí B1 použitým jako IV. Bi je zašifrováno pomocí Bi-1 použitým jako IV. Pak lze tedy na šifrový text pohlížet jako na posloupnost n-1 IV a přitom nijak nezašifrovaných. Proto můžeme počáteční IV přidat také klidně nezašifrované jak B0. Samozřejmě by v těch případech, kde je to možné, bylo použitelné doplnit k menším blokům otevřeného textu potřebný počet bitů (např. samých 0 nebo 1) tak, aby byla dosažena velikost potřebná pro šifrování. Pak už by šlo použít i tyto módy. Ale sami asi cítíte, že to není zrovna to pravé řešení. Tento způsob byl také implementován v poskytnutém kódu šifry blowfish.