AES, Rijndael-AES, Rijndael | |
---|---|
Tvůrce |
Vincent Rayman Yoan Dymen |
Vytvořeno | 1998 _ |
Velikost klíče | 128/192/256 bitů |
Velikost bloku | 128 bit |
Počet kol | 10/12/14 (závisí na velikosti klíče) |
Typ | Substitučně-permutační síť |
Mediální soubory na Wikimedia Commons |
AES ( Advanced Encryption Standard ; také Rijndael , [rɛindaːl] - reindal ) je symetrický algoritmus blokové šifry (velikost bloku 128 bitů, klíč 128/192/256 bitů), přijatý jako šifrovací standard vládou USA v důsledku Soutěž AES . Tento algoritmus byl dobře analyzován a nyní je široce používán, jako tomu bylo u jeho předchůdce DES . Americký Národní institut pro standardy a technologie (NIST) zveřejnil specifikaci AES 26. listopadu 2001 po pětiletém období, během kterého bylo vytvořeno a vyhodnoceno 15 nominací. 26. května 2002 byl AES oznámen jako šifrovací standard. Od roku 2009 je AES jedním z nejpoužívanějších symetrických šifrovacích algoritmů [1] [2] . Podporu pro akceleraci AES zavedl Intel do rodiny procesorů x86 počínaje Arrandale v roce 2010 a později u procesorů Sandy Bridge ; AMD je u Bulldozeru od roku 2011.
2. ledna 1997 NIST oznamuje [3] svůj záměr vybrat nástupce DES , který je od roku 1977 americkým standardem . 2. října 2000 bylo oznámeno, že vítězem soutěže se stal Rijndaelův algoritmus [4] a byla zahájena procedura standardizace. 28. února 2001 byl návrh zveřejněn a 26. listopadu 2001 byl AES přijat jako FIPS 197. Historickou retrospektivu soutěže lze nalézt na webu NIST [5] .
blok | sekvence bitů, které tvoří vstup, výstup, stav a kulatý klíč. Blok lze také chápat jako sekvenci bajtů |
---|---|
Šifrovací klíč | tajný kryptografický klíč, který je používán procedurou Key Expansion k vytvoření sady kulatých klíčů; může být reprezentováno jako obdélníkové bajtové pole se čtyřmi řádky a Nk sloupci |
Šifrovaný text | výstup šifrovacího algoritmu |
rozšíření klíče | postup pro generování kulatých klíčů ze šifrovacího klíče |
Kulatý klíč | Kulaté klíče se získávají ze šifrovacího klíče pomocí procedury Key Expansion. Jsou aplikovány na stát při šifrování a dešifrování |
Stát | výsledek středního šifrování, který může být reprezentován jako obdélníkové bajtové pole se 4 řádky a Nb sloupci |
S box | nelineární substituční tabulka používaná v několika bajtových substitučních transformacích a v proceduře Key Expansion pro substituci hodnoty bajtu jedna ku jedné. Předem vypočítaný S-box je vidět níže |
Nb | počet sloupců (32bitová slova), které tvoří stav . Pro AES Nb = 4 |
Nk | počet 32bitových slov, která tvoří šifrovací klíč. Pro AES Nk = 4, 6 nebo 8 |
Ne. | počet nábojů, který je funkcí Nk a Nb . Pro AES č . = 10, 12, 14 |
Rcon[] | pole, které se skládá z bitů 32bitového slova a je konstantní pro dané kolo. Předběžně vypočítané Rcon[] lze vidět níže |
S box
sbox = pole{ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };Reverzní S-box pro proceduru InvSubBytes
InvSbox = pole{ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };Rcon[]
Rcon = pole{ pole{0x00, 0x00, 0x00, 0x00}, pole{0x01, 0x00, 0x00, 0x00}, pole{0x02, 0x00, 0x00, 0x00}, pole{0x04, 0x00, 0x00, 0x00}, pole{0x08, 0x00, 0x00, 0x00}, pole{0x10, 0x00, 0x00, 0x00}, pole{0x20, 0x00, 0x00, 0x00}, pole{0x40, 0x00, 0x00, 0x00}, pole{0x80, 0x00, 0x00, 0x00}, pole{0x1b, 0x00, 0x00, 0x00}, pole{0x36, 0x00, 0x00, 0x00} };AddRoundKey() | transformace během šifrování a zpětného šifrování, ve kterém Round Key XOR je stav c. Délka RoundKey je rovna velikosti State (tj. pokud Nb = 4, pak je délka RoundKey 128 bitů nebo 16 bajtů) |
---|---|
InvMixColumns() | transformace při dešifrování, což je opak MixColumns() |
InvShiftRows() | transformace při dešifrování, což je opak ShiftRows() |
InvSubBytes() | transformace při dešifrování, což je inverze k SubBytes() |
MixColumns() | transformace šifrování, která vezme všechny sloupce State a smíchá jejich data (nezávisle na sobě), aby získala nové sloupce |
RotWord() | funkce používaná v proceduře Key Expansion, která bere 4bajtové slovo a cyklicky jej prochází |
ShiftRows() | šifrovací transformace, které zpracovávají Stav, cyklicky posouvají poslední tři řádky Stavu o různé hodnoty |
SubBytes() | šifrovací transformace, které zpracovávají stav pomocí nelineární bajtové substituční tabulky (S-box), aplikují ji nezávisle na každý bajt stavu |
Podslovo() | funkce používaná v proceduře Key Expansion, která přijímá čtyřbajtové slovo jako vstup a použitím S-boxu na každý ze čtyř bajtů vytvoří výstupní slovo |
AES je standard založený na Rijndaelově algoritmu. Pro AES je délka vstupu (blok vstupních dat) a Stav (stav) konstantní a rovná se 128 bitům a délka šifrovacího klíče K je 128, 192 nebo 256 bitů. Původní Rijndaelův algoritmus zároveň umožňuje délku klíče a velikost bloku od 128 do 256 bitů s krokem 32 bitů. Pro označení zvolených délek vstupu, stavu a šifrovacího klíče ve 32bitových slovech, se pro různé délky klíče používá označení Nb = 4 pro vstup a stav, Nk = 4, 6, 8 pro šifrovací klíč.
Na začátku šifrování se vstup zkopíruje do pole State s pravidlem , for a . Poté se na stav aplikuje procedura AddRoundKey() a poté stav prochází transformační procedurou (kolem) 10, 12 nebo 14krát (v závislosti na délce klíče), přičemž se bere v úvahu, že poslední kolo je mírně odlišné od předchozích. Výsledkem je, že po dokončení posledního kola transformace je State zkopírován na výstup podle pravidla , for a .
Samostatné transformace SubBytes(), ShiftRows(), MixColumns() a AddRoundKey() zpracovávají stav. Pole w[] - obsahuje plán klíče.
Šifra(byte in[4*Nb], byte out[4*Nb], slovo w[Nb*(Nr+1)]) začít stav bytu[4,Nb] stav = v AddRoundKey(stav, w[0, Nb-1]) pro kolo = 1 krok 1 až Nr-1 SubBytes (stav) ShiftRows(stav) MixColumns (stav) AddRoundKey(stav, w[kolo*Nb, (kolo+1)*Nb-1]) konec pro SubBytes (stav) ShiftRows(stav) AddRoundKey(stav, w[Nr*Nb, (Nr+1)*Nb-1]) ven = stát konecObr. 1. Pseudokód pro šifru
SubBytes()Procedura SubBytes() zpracovává každý stavový bajt nezávisle provedením nelineární substituce bajtů pomocí substituční tabulky (S-box). Tato operace zajišťuje nelinearitu šifrovacího algoritmu. Stavba S-boxu se skládá ze dvou kroků. Nejprve se vezme reciproká hodnota pole Galois . Pro všechny operace v tomto poli se používá ireducibilní polynom . Za druhé, pro každý bajt b, který tvoří S-box, se použije následující operace:
kde a kde je i-tý bit b a je i-tý bit konstanty . To poskytuje ochranu proti útokům na základě jednoduchých algebraických vlastností.
ShiftRows()ShiftRowspracuje se stavovými řetězci. Při této transformaci se stavové řádky cyklicky horizontálně posouvají o r bajtů v závislosti na čísle řádku. Pro nulový řádek je r = 0, pro první řádek r = 1 B atd. Každý sloupec výstupního stavu po aplikaci procedury se tedy ShiftRowsskládá z bajtů z každého sloupce výchozího stavu. Pro algoritmus Rijndael je vzor posunu řetězce pro 128bitové a 192bitové řetězce stejný. U 256bitového bloku se však od předchozích liší tím, že 2., 3. a 4. řádek jsou posunuty o 1, 3 a 4 bajty. Tato poznámka se netýká AES, protože používá pouze Rijndaelův algoritmus se 128bitovými bloky, bez ohledu na velikost klíče.
MixColumns()Postup MixColumnsmíchá čtyři bajty každého sloupce Stav pomocí reverzibilní lineární transformace. MixColumnszpracovává stavy po sloupcích, přičemž každý z nich považuje za polynom třetího stupně. Tyto polynomy se násobí [6] in modulo pevným polynomem . Spolu s zavádí difúzi do šifry. ShiftRows MixColumns
AddRoundKey()AddRoundKey RoundKeyKombinuje se se stavem v každém kole postupu . Pro každé kolo Roundkey se získá z CipherKeyc pomocí postupu KeyExpansion; každý RoundKey má stejnou velikost jako State. Procedura provádí bitové XOR každého bajtu States každým bajtem RoundKey.
Algoritmus zpracování klíče se skládá ze dvou procedur:
Algoritmus AES, který používá proceduru KeyExpansion() a dodává ji šifrovací klíč, K, získává klíče pro všechna kola. Celkem je Nb*(Nr + 1) slov: zpočátku algoritmus potřebuje sadu Nb slov a každé z Nr kol potřebuje Nb klíčové datové sady. Výsledné pole klíčů pro kola je označeno jako , . Algoritmus KeyExpansion() je zobrazen v pseudokódu níže.
Funkce SubWord() trvá čtyřbajtové vstupní slovo a aplikuje S-box na každý ze čtyř bajtů. Co se stalo, je přivedeno na výstup. RotWord() bere slovo jako vstup , kterým prochází a vrací . Pole slov, které je pro toto kolo konstantní , obsahuje hodnoty , kde x = {02} a je mocninou ( začíná od 1) .
Z obrázku můžete vidět, že první slova rozšířeného klíče jsou vyplněna šifrovacím klíčem. Do každého následujícího slova se vloží hodnota získaná během operace XOR a ty XOR z předchozích a Nk pozic před slova. Pro slova, jejichž pozice je násobkem Nk, se použije transformace na w[i-1] před XOR, po které následuje XOR s kulatou konstantou Rcon[i]. Výše uvedená transformace sestává z kruhového posunu bajtů ve slově (RotWord()) následovaného procedurou SubWord() - stejně jako SubBytes(), pouze vstupní a výstupní data budou mít velikost slova.
Je důležité si uvědomit, že postup KeyExpansion() pro 256bitový šifrovací klíč se mírně liší od postupu pro 128bitové a 192bitové šifrovací klíče. Jestliže a je násobkem , pak se SubWord() použije před XOR'a.
KeyExpansion(byte key[4 * Nk], word w[Nb * (Nr+1)], Nk) začít teplota slova i = 0; while(i < Nk) w[i] = slovo(klávesa[4*i], klávesa[4*i+1], klávesa[4*i+2], klávesa[4*i+3]) i = i + 1 konec chvíle i = Nk while(i < Nb * (Nr+1)) teplota = w[i - 1] if (i mod Nk = 0) temp = SubWord(RotWord(temp)) xor Rcon[i / Nk] jinak if (Nk > 6 a i mod Nk = 4) temp = Podslovo (temp) konec pokud w[i] = w[i - Nk] xor tepl i = i + 1 konec chvíle konecPseudokód pro rozšíření klíče
Pseudokód pro inverzní šifru
Při každé iteraci se z pole vybere kulatý klíč pro operaci AddRoundKey , počínaje prvkem až .
Na základě Rijndaelova algoritmu, který je základem AES, jsou implementovány alternativní kryptoalgoritmy. Mezi nejznámější patří účastníci soutěže Nessie : Anubis o involucích, jejímž autorem je Vincent Rayman, a vylepšená verze šifry - Grand Cru od Johana Borsta.
V červnu 2003 americká Národní bezpečnostní agentura zjistila, že AES je dostatečně silný na to, aby mohl být použit k ochraně utajovaných informací . Do úrovně SECRET bylo povoleno používat klíče 128 bitů, pro úroveň TOP SECRET byly vyžadovány klíče 192 a 256 bitů [7] .
Na rozdíl od většiny ostatních šifer má AES jednoduchý matematický popis. To znepokojilo mimo jiné Nielse Fergusona , který ve své práci poznamenal, že bezpečnost šifry je založena na novém nevyzkoušeném předpokladu o složitosti řešení určitých typů rovnic ( anglicky „The security of Rijndael závisí na novém a nevyzkoušeném předpokladu tvrdosti : je výpočetně nemožné řešit rovnice tohoto typu" ) [8] [9] , stejně jako Bruce Schneier, který ve společné knize s Nilsem napsal:
K AES máme jednu kritiku: moc nedůvěřujeme jeho bezpečnosti. Co nás na AES nejvíce znepokojuje, je jeho jednoduchá algebraická struktura… Žádná jiná bloková šifra nemá tak jednoduché algebraické vyjádření. Nemáme ponětí, zda to vede k útoku nebo ne, ale nevědomost je dostatečným důvodem k tomu, abychom byli k používání AES skeptičtí.
Původní text (anglicky)[ zobrazitskrýt] K AES máme jednu kritiku: nedůvěřujeme zcela zabezpečení... Co nás na AES nejvíce znepokojuje, je jeho jednoduchá algebraická struktura... Žádná jiná bloková šifra, o které víme, nemá tak jednoduché algebraické vyjádření. Nemáme ponětí, zda to vede k útoku nebo ne, ale nevědomost je dostatečným důvodem k tomu, abychom byli skeptičtí ohledně použití AES - Niels Ferguson , Bruce Schneier Praktická kryptografie - 2003 - str. 56-57Nicolas Courtois a Josef Pieprzyk publikovaliv roce 2002 článek , ve kterém popsali teoretický útok, který nazvali XSL útok ( eXtended Sparse Linearization ), který by mohl umožnit prolomení AES šifer a Hada [10] [11] . Ne všichni však výsledky práce přijali optimisticky:
Domnívám se, že v práci Courtoise-Pepshika je chyba. Nadhodnotili počet lineárně nezávislých rovnic. V důsledku toho nemají dostatek lineárních rovnic k řešení systému a [specifikovaná] metoda nemůže Rijndaela rozlousknout. Má nějakou zásluhu a stojí za prozkoumání, ale Rijndael ve své současné podobě nehackuje.
Původní text (anglicky)[ zobrazitskrýt] Domnívám se, že práce Courtoise-Pieprzyka je chybná. Přepočítávají počet lineárně nezávislých rovnic. Výsledkem je, že ve skutečnosti nemají dostatek lineárních rovnic k vyřešení systému a metoda Rijndaela nerozbije… Metoda má určitou hodnotu a stojí za to ji prozkoumat, ale Rijndaela tak, jak stojí, nerozbije. — Don Coppersmith , komentář k blogovému příspěvku od Bruce SchneieraNa stránce věnované diskusi o soutěži NESSIE , koncem roku 2002 jeden z autorů šifry Vincent Rayman uvedl, že XSL útok je jen sen ( anglicky The XSL attack is not an attack. It is a dream ) (tento pohled byl později zopakován v roce 2004 na 4. konferenci AES v Bonnu ). Na to Courtois odpověděl, že tento sen by se pro autora AES mohl stát noční můrou ( anglicky It may also be a very bad dream and turn into a nightmare ) [12] (hra se slovy: sen se překládá jak jako sen , tak jako sen . Nightmare se překládá jako noční můra, noční můra ).
V roce 2003 Sean Murphy a Matt Robshaw publikovali článek , ve kterém ( za předpokladu, že výsledky Courtoise a Pepshika jsou správné) odůvodnili možnost útoku na algoritmus AES, čímž se počet operací pro cracknutí snížil z 2128 na 2100 . Na 4. konferenci AES však Ilia Toli a Alberto Zanoni ukázali, že práce Murphyho a Robshawa byla nesprávná [ 13] . Později, v roce 2007, Chu-Wee Lim a Khoongming Khoo také ukázali, že tento útok nemůže fungovat tak, jak je popsáno [14 ] .
Útoky postranním kanálem nesouvisí s matematickými rysy šifry, ale využívají určité implementační vlastnosti systémů využívajících tyto šifry za účelem odhalení částečně nebo zcela tajných dat, včetně klíče. Existuje několik podobných útoků na systémy využívající algoritmus AES.
V dubnu 2005 publikoval Daniel J. Bernstein článek popisující útok, který využívá informace o době provádění každé šifrovací operace k prasknutí [15] . Tento útok vyžadoval k nalezení klíče přes 200 milionů vybraných šifrových textů [16] .
V říjnu 2005 představili Doug Arne Osvik, Adi Shamir a Eran Trumer článek popisující několik útoků, které využívají čas k nalezení klíče. Jeden z prezentovaných útoků získal klíč po 800 šifrovacích operacích. Útok vyžadoval, aby kryptoanalytik mohl spouštět programy na stejném systému, kde bylo šifrování provedeno [17] .
V prosinci 2009 byl publikován článek, ve kterém použití diferenciální analýzy chyb ( angl. Differential Fault Analysis ), uměle vytvořené ve stavové matici v 8. kole šifrování, umožnilo obnovit klíč ve 2 32 operacích [18 ] .
Slovníky a encyklopedie |
---|
Symetrické kryptosystémy | |
---|---|
Streamové šifry | |
Síť Feistel | |
Síť SP | |
jiný |