AES

25 let po schválení šifry DES oznámil americký Národní úřad pro standardizaci (NIST) schválení šifry AES jako federální standard USA s platností od 26.5.2002. Rijndael je původní název algoritmu, který byl přijat jako standard pro šifrování v rámci amerických vládních úřadů. Jako většina šifrovacích algoritmů, i Rijndael odvozuje svůj název od jmen svých autorů: Joan Daemen a Vincent Rijmen. V praxi tedy názvy "Rijdael" a "AES" odkazují na totéž.

AES od tohoto dne oficiálně začala nahrazovat starý standard DES. AES znamená Advenced Encryption standard (Pokročilý šifrovací standard). U AES se očekává životnost minimálně 20 let, podle některých odhadů až 30 let. Šifře AES nehrozí útok hrubou silou (brute force) = vyzkoušení všech možných klíčů, jako třeba u DES pomocí DES Crackeru (viz časopis Chip 11/98). Momentálně se zdá, že je AES neprolomitelná. Výběr nového šifrovacího standardu trval více než čtyři roky, a tak se dá předpokládat, že v dohledné době by neměla být šifra prolomena.

AES vychází z 25 let starých principů, které byly použity i pro DES. Velký pokrok oproti DES je délka klíčů. AES podporuje délky klíčů 128, 192 a 256 bitů. V současné době není možný útok hrubou silou ani na 128bitový klíč. Jediná možná reálná hrozba útoku hrubou silou na AES je ze strany kvantových počítačů a počítačů založených na bázi DNA. Ty se však v dohledné době určitě na trh nedostanou. Pokud by došlo k výraznému pokroku ve vývoji těchto technologií, určitě se to dozvíme minimálně 10 let před využitím v praxi. Bohužel ani AES není nerozluštitelná a určitě se dříve nebo později objeví něco jako DES Cracker v podání pro AES.

Pokud se rozhodnete používat AES v praxi ve svých programech, pak se nemusíte bát žádného složitého bádání. Na internetu je možné stáhnout zdrojové kódy pro šifrovací / dešifrovací algoritmus. Na stránkách http://www.esat.kuleuven.ac.be/~rijmen/rijndael/ najdete zdrojové kódy ve velké spoustě programovacích jazyků a následná implementace je velmi jednoduchá. Zdrojové kódy jsou k dispozici například v Javě, C++, assembleru pro 80186, Visual Basicu, Delphi 5.0, Perlu a jako modul pro MATLAB. Dá se očekávat přísun dalších zdrojáků například pro PHP, ASP. Použitelnost na internetu momentálně zajišťuje pouze verze pro Perl a Javu (i jako Servlet).

Symetrické a asymetrické algoritmy

V případě Rijndael/AES jde o symetrický algoritmus, což znamená, že používá sdílený klíč: tentýž klíč slouží k zašifrování i dešifrování dat. Délka klíče je 128, 196 nebo 256 bitů.

Hlavní výhodou symetrického šifrování je, že je obecně velmi rychlé a dá se použít pro šifrování velkého objemu dat. Zásadní nevýhodou (pro řadu aplikací) je ale samotné použití sdíleného klíče: ten kdo data zašifroval je umí i dešifrovat a komunikují-li spolu dvě strany, je nutné, aby si klíč bezpečně předaly důvěrnou cestou. Bezpečnost šifry také závisí na kvalitě použitého klíče, musí být dostatečně komplexní a dostatečně náhodný, jinak je šifra snadno prolomitelná.

Oproti tomu asymetrické šifrování (jako např. RSA) využívá dvou klíčů: veřejného (ten se použije pro zašifrování dat) a soukromého (používá se pro dešifrování), přičemž tyto klíče mohou být od sebe odděleny. Asymetrické algoritmy jsou ale velmi pomalé a prakticky nepoužitelné pro šifrování velkého objemu dat.

V praxi se často obě metody kombinují: vlastní data se zašifrují pomocí symetrického algoritmu (AES) a použitý jednorázový klíč (který je dosti malý) se zašifruje pomocí asymetrického algoritmu (RSA). Na toto použití se podíváme v samostatném článku, v tomto se zaměříme na vlastní použití symetrického algoritmu.

I samostatné použití symetrického šifrovacího algoritmu má samozřejmě svůj význam. V případě že ho dokážete bezpečně uschovat/předat a oddělení šifrovacího a dešifrovacího klíče pro vás nemá význam, protože z hlediska architektury systému by stejně obě části musely být uschovány na tomtéž místě.

Šifrování

Rijndael je blokový šifrovací algoritmus. Je aplikován na data s pevně danou délkou - v tomto konkrétním případě 128 bitů. Pokud jsou šifrovaná data delší, zpracovávají se po jednotlivých blocích. Pokud jsou data kratší (typicky v případě posledního bloku se zbytkem dat), je potřeba je doplnit na odpovídající délku.

Onomu doplnění na odpovídající délku se říká "padding". Existuje pro něj několik algoritmů, od primitivního doplnění nulami po složitější schémata. Nejčastěji se používá mechanismus podle PKCS #7 (podrobnější popis najdete např. v RFC2315, ale nemusí vás příliš zajímat, tento mechanismus je vestavěn v .NET Frameworku).

Naivní implementace blokové šifry by spočívala v tom, že by se šifra aplikovala na jednotlivé bloky tak, jak jdou za sebou. Tomuto postupu se říká ECB (Electronic Codebook) a jeho použití se nedoporučuje. Jeho výsledkem totiž je, že stejné bloky otevřeného textu budou zašifrovány vždy stejně. Vzhledem k poměrně malé velikosti jednotlivých bloků to může znamenat, že ve výsledné zprávě budou patrná stejná schémata jako v původním dokumentu.

V praxi se tedy používají takové algoritmy, které toto nebezpečí odstraňují. Nejjednodušším z nich je CBC - Cipher Block Chaining. Ten funguje tak, že před zašifrováním se odpovídající blok otevřeného textu XORuje předcházejícím blokem zašifrovaného textu. To znamená, že jednotlivé bloky jsou na sobě závislé, abyste dešifrovali konkrétní blok, musíte dešifrovat i všechny předchozí.

V tomto případě ale máte problém - čím XORovat první blok, když ještě nemáte k dispozici blok předchozí? Inu, použijeme osvědčenou metodu socialistických vlád: když informace nemáme, prostě si je vymyslíme. Jeden blok se vygeneruje náhodně a přidá se k zašifrovaným datům jako "nultý blok". Tomuto bloku se pak říká "inicializační vektor" (IV). Tento blok se použije k dešifrování prvního bloku a pak zahodí.

Popis šifrování

Šifrování probíhá ve čtyřech krocích:

  1. SubBytes - jednoduchá substituce, kde každý Byt je nahrazen jiným podle předem daného klíče, the Rijndael-S-Box (8bitů). Tato operace zajišťuje nelineárnost šifry a má zabránit útokům založeným na jednoduchých algebraických vlastnostech.

In the SubBytes step, each byte in the state is replaced with its entry in a fixed 8-bit lookup table, S; bij = S(aij).

In the SubBytes step, each byte in the state is replaced with its entry in a fixed 8-bit lookup table, S; bij = S(aij).

 

  1. ShiftRows — v tomto kroku se jednotlivé byty přehází podle obrázku

In the ShiftRows step, bytes in each row of the state are shifted cyclically to the left. The number of places each byte is shifted differs for each row.

 

  1. MixColumns — při této operaci dochází k proházení sloupců a zároveň je každý sloupec vynásoben stejným polynomem c(x)

In the MixColumns step, each column of the state is multiplied with a fixed polynomial c(x).

  1. AddRoundKey — každý byt je zkombinovaný se subklíčem (subklíč získáme z původního klíče pomocí Rijndaelovy tabulky). Každý byt subklíče zkombinujeme s příslušným bytem naší zprávy a dostaneme výslednou šifru

In the AddRoundKey step, each byte of the state is combined with a byte of the round subkey using the XOR operation (⊕).

Zdroje

http://www.aspnet.cz/Articles/147-symetricke-sifrovani-aes-rijndael-v-net.aspx

http://en.wikipedia.org/wiki/Advanced_Encryption_Standard

http://www.webguru.cz/clanky/view.php?id=66&znamka=8