UNIVERZITET CRNE GORE Prirodno-matematički fakultet Podgorica Dušan Radoičić Napredni standard enkripcije (AES) Specijalistički rad Podgorica, 2013. UNIVERZITET CRNE GORE Prirodno-matematički fakultet Podgorica Napredni standard enkripcije (AES) Specijalistički rad Kriptografija Dušan Radoičić Mentor: Doc. dr Vladimir Božović Podgorica, jul 2013. Računarske nauke Apstrakt Napredni standard enkripcije je algoritam za kriptovanje elektronskih podataka kojeg karakteriše brzina izvršavanja, relativno velika dužina ključa a kao posledica toga i izuzetna sigurnost. Nakon 13 godina od usvajanja standarda još uvijek nije izveden uspješan napad na AES algoritam koji ima bolje rezultate od brute-force algoritma. U ovom radu opisan je karakterističan proces nadmetanja za odabir algoritma i suština rada algoritma u koracima, uz detalje koji će vam nadam se pomoći da ga bolje razumijete pa čak i implementirate. 3 Abstract Advanced encryption standard is an algorithm for encrypting electronic data that is characterized by fast execution, relatively large key length, and as a consequence, exceptional security. Thirteen years after adoption of the standard, not yet executed an attack on AES that has outperformed the brute-force algorithm. This paper describes the characteristical competition process for the algorithm selection and essence of the algorithm in steps, with details that will hopefully help you to better understand and even implement the algorithm. 4 Sadržaj 1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Osnovni pojmovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Nizovi bajtova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3 Stanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 Matematički preduslovi . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1 Sabiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Množenje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3 Invertovanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3 Specifikacija algoritma . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.1 3.2 Enkripcija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.1.1 SubBytes() transformacija . . . . . . . . . . . . . . . . . . . . 13 3.1.2 ShiftRows() transformacija . . . . . . . . . . . . . . . . . . . . 14 3.1.3 MixColumn() transformacija . . . . . . . . . . . . . . . . . . . 14 3.1.4 AddRoundKey() sloj . . . . . . . . . . . . . . . . . . . . . . . 16 3.1.5 Izvođenje etapnih ključeva . . . . . . . . . . . . . . . . . . . . 16 Dekripcija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2.1 InvMixColumn() transformacija . . . . . . . . . . . . . . . . . 18 3.2.2 InvShiftRows() transformacija . . . . . . . . . . . . . . . . . . 19 3.2.3 InvSubBytes() transformacija . . . . . . . . . . . . . . . . . . 20 5 4 Bezbjednost AES-a . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 22 Režim rada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.1.1 ECB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.1.2 CBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5 Zaključak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Bibliografija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 6 Glava 1 Uvod Napredni standard enkripcije (AES) je kriptografski algoritam koji se koristi za zaštitu elektronskih podataka. Po svojoj strukturi, AES je simetrična blok šifra kojom možemo kriptovati i dekriptovati informacije. Kriptovanje se sastoji od konverzije osnovne poruke u nečitljivu kriptovanu poruku uz pomoć ključa. Dekriptovanje je obrnuta operacija u kojoj iz nečitljive-kriptovane poruke uz pomoć istog ključa dobijamo osnovnu poruku. Američki nacionalni institut za standardizaciju i tehnologiju (NIST) je 2-og januara 1997. godine objavio da očekuje predloge za novi napredni standard enkripcije (Advanced Encryption Standard), standard koji će zamijeniti u tom trenutku već dotrajali DES. Tokom rada na formiranju novog standarda, 1999. godine donešena je odluka da se od tog trenutka DES koristi samo za postojeće sisteme, a da njegovo mjesto zauzme 3DES (Triple DES). Iako se 3DES odupire brute-force napadima sa tadašnjom tehnologijom, ipak postoji nekoliko problema sa njim. Prije svega nije previše zahvalan za softversku implementaciju – 3 puta je sporiji od DES-a koji je sam po sebi već bio spor. Takođe, mala veličina bloka od 64 bita je nedostatak ukoliko se želi napraviti heš funkcija od kriptovanog bloka. Zbog mogućnosti napretka na polju kvantnih računara u narednim decenijama, poželjna je dužina ključa od 256 bita. Svi ovi nedostaci su doveli NIST do zaključka da je potpuno nov blok algoritam potreban 1 kao zamjena za DES. Za razliku od načina na koji je 70-ih godina nastao DES, a koji je i danas tajna, nadmetanje za AES algotitam je bio potpuno javan i otvoren proces, pod nadzorom NIST-a[7] . Na njihovu adresu kroz 9 mjeseci pristiglo je 15 različitih predloga. U tri etape ocjenjivanja, NIST i međunarodna naučna zajednica su razmatrali prednosti i mane predloženih algoritama, i smanjivali broj potencijalnih kandidata. 2001. godine od 5 finalista - MARS (IBM korporacija), RC6 (RSA laboratorije), Serpent (Ross Anderson, Eli Biham i Lars Knudsen), Twofish (Bruce Schneier, John Kelsey, Doug Whiting, David Wagner, Chris Hall i Niels Ferguson, Stefan Lucks, Tadayoshi Kohno i Mike Stay) i Rijndael (Joan Daemen i Vincent Rijmen), NIST odabira Rijndael i proglašava ga za standard (FIPS PUB 197). Prilikom objave poziva za ponude za AES, sledeći zahtjevi su postavljeni: 1) Blok šifra sa dužinom bloka od 128 bita; 2) Tri dužine ključa od 128, 192 i 256 bita; 3) Sigurnost na nivou ostalih predloženih algoritama; 4) Efikasnost u softveru i hardveru. Od AES-a se očekivalo (i još se očekuje) bude dominantan simetrični kriptografski algoritam za komercijalne svrhe dugi niz godina. Takođe je vrijedno pomena da je 2003. godine američka nacionalna agencija za bezbjednost (NSA) objavila da dozvoljava da se koristeći AES kriptuju povjerljivi dokumenti do nivoa secret za sve dužine ključa i do nivoa top secret za dužine ključa od 192 ili 256 bita. Do tog datuma su samo tajni algoritmi korišćeni za enkripciju povjerljivih dokumenata. Otprilike svakih 5 godina, zajedno sa ostalim kriptografskim standardima, NIST radi reviziju AES-a. Da bi neka implementacija AES algoritma bila u skladu sa standardom, mora proći proces validacije (AESAVS)[1]. Testove za tu validaciju obezbjeđuje CST laboratorija 2 akreditovana od strane NVLAP-a. Postoje 3 tipa testova, i osmišljeni su da obuhvate bilo koji implementirani režim rada algoritma. 1.1 Osnovni pojmovi Ulaz i izlaz iz AES algoritma se sastoje od sekvenci (blokova) sa po 128 bita. Broj bita se naziva dužina sekvence ili bloka. Ključ za AES algoritam je sekvenca od 128, 192 ili 256 bita. Svi drugi ulazi, izlazi ili ključevi u AES algoritam nisu dozvoljeni. Bite unutar takve sekvence ćemo numerisati od 0 do n-1, gdje je n dužina sekvence, odnosno biće indeksirani indeksom i, koji će biti u opsegu 0≤i<128, 0≤i<192 ili 0≤i<256 zavisno od dužine bloka i dužine ključa. Osnovna jedinica za procesiranje u AES algoritmu je bajt. Poželjno je označavati bajt vrijednosti koristeći heksadecimalnu notaciju tako da obje grupe od 4 bita budu označene kao: Biti Karakter Biti Karakter Biti Karakter Biti Karakter 0000 0 0100 4 1000 8 1100 c 0001 1 0101 5 1001 9 1101 d 0010 2 0110 6 1010 a 1110 e 0011 3 0111 7 1011 b 1111 f Ulaz, izlaz i ključ - bit sekvence su procesirane kao nizovi bajtova formirani dijeljenjem ovih sekvenci u grupe od po 8 bita. Za ulaz, izlaz i ključ označeni sa a, bajte u rezultujućem nizu ćemo referencirati sa an ili sa a[n], gdje će n biti jedan iz sledećih opsega: Dužina ključa =128 bita ⇒ 0 ≤n<16, Dužina ključa =192 bita ⇒ 0 ≤n<24, Dužina ključa =256 bita ⇒ 0 ≤n<32, Dužina bloka =128 bita ⇒ 0 ≤n<16. 3 1.2 Nizovi bajtova Niz bajtova će biti prezentovan u sledećoj formi: a0 a1 a2 ...a15 Biti i redosled bita unutar bajtova će biti izvedeni iz 128 bitne ulazne sekvence ulaz : ulaz0 ulaz1 ulaz2 ...ulaz127 , kao a0 = ulaz0 ulaz1 ulaz2 ...ulaz7 , a1 = ulaz8 ulaz9 ulaz10 ...ulaz15 , .. . a15 = ulaz120 ulaz121 ulaz122 ...ulaz127 . Šablon se može produžiti na dužu sekvencu (tj. za 192 i 256 bitne ključeve), tako da, generalno: an = ulaz8n ulaz8n+1 ulaz8n+2 ...ulaz8n+7 . 1.3 Stanja Operacije unutar algoritma su izvedene nad dvodimenzionalnim nizovima - matricama bajtova koje zovemo stanja. Stanje se sastoji od 4 reda sa po Nb bajtova (Nb je dužina bloka podijeljena sa 32). U stanju označenom sa s, svaki bajt je indeksiran sa 2 vrijednosti tj. sa brojem vrste r u opsegu 0≤ r<4, i brojem kolone c u opsegu 0≤ c<Nb . Ovo omogućava pristupanje individualnom bajtu u stanju sa sr,c ili sa s[r,c]. Za ovaj standard (128 bitni blok i ključ), je Nb =4 tj 0≤ c<4. Na početku enkripcije odnosno dekripcije, ulaz-niz bajtova in0 in1 in2 ...in15 se kopira u matricu stanja na način opisan na slici 1.1. Operacije kod enkripcije/dekripcije se potom primjenjuju na matricu stanja, nakon čega se finalne vrijednosti kopiraju u izlazni niz – niz bajtova out0 out1 out2 ...out15 . 4 Dakle, na početku enkripcije/dekripcije, ulazni niz in, se kopira u stanje po sledećoj šemi: sr,c = inr+4c , za 0 ≤ r <4 i 0 ≤ c<Nb , a na kraju enkripcije/dekripcije, stanje se kopira u izlazni niz out kao: outr+4c = sr,c , za 0 ≤ r <4 i 0 ≤ c<Nb . in0 in1 in2 in3 ulaz in4 in8 in5 in9 in6 in10 in7 in11 in12 in13 =⇒ in14 in15 s0,0 s1,0 s2,0 s3,0 stanje s0,1 s0,2 s1,1 s1,2 s1,2 s2,2 s1,3 s3,2 s0,3 s1,3 s2,3 s3,3 =⇒ out0 out1 out2 out3 izlaz out4 out8 out5 out9 out6 out10 out7 out11 out12 out13 out14 out15 Slika 1.1: Tok ulaz-stanje-izlaz Četiri bajta u svakoj koloni matrice stanja formiraju 32 bitnu riječ, gdje broj vrste r označava indeks za 4 bajta unutar svake riječi. Stanje dakle može biti interpretirano kao jednodimenzionalni niz 32 bitnih riječi (kolona) w0..w3, gdje broj kolone c označava indeks u ovom nizu. Dakle, na primjeru sa slike 1.1 stanje se može posmatrati kao niz od 4 riječi, odnosno: wi = s0,i s1,i s2,i s3,i , 0 ≤ i ≤ 3 . 5 Glava 2 Matematički preduslovi U AES algoritmu bajtovi se predstavljaju kao konkatenacija njihovih individualnih bit vrijednosti između vitičastih zagrada u sledećem redosledu: {b7 b6 b5 b4 b3 b2 b1 b0 } Ovi bajtovi se mogu interpretirati kao elemenati konačnih polja koristeći polinomijalnu reprezentaciju: b7 x7 + b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x + b = Σ7i=0 bi xi . Na primjer, {01100011} identifikuje specifičan element polja x6 + x5 + x + 1. Teorema 1. Polje reda m postoji samo ako je m stepen prostog broja tj m = pn gdje je n prirodan broj, a p prost broj koji nazivamo karakteristikom konačnog polja. Naijintuitivniji primjeri konačnih polja su prosta polja ili polja sa prostim brojem elemenata [6]. Konačna polja drugačije nazivamo i Galoisova polja, i označavamo sa GF (Galois field ). Broj elemenata polja nazivamo red ili kardinalnost polja. Konačno polje sa prostim brojem elemenata p označavamo GF(p), dok polja kardinalnosti stepena prostog broja označavamo sa GF(pn ). AES koristi konkretno polje GF(28 ). Aritmetika u ovim poljima je modularna, po modulu p (karakteristika polja). Dakle sabiranje i množenje se razlikuju od onih koje koristimo u radu sa brojevima. 6 2.1 Sabiranje Sabiranje dva elementa u konačnom polju se postiže sabiranjem koeficijenata odgovarajućih stepena u polinomima dva elementa. Sabiranje se izvodi koristeći XOR operaciju (ekskluzivno ili) ⊕, tako da je 1⊕1=0, 1⊕0=1 i 0⊕0=0. Uslovno, oduzimanje je isto kao sabiranje. Sabiranje elemenata konačnog polja se može opisati kao moduo 2 sabiranje odgovarajućih bita u bajtu. Za 2 bajta {a7 a6 a5 a4 a3 a2 a1 a0 } i {b7 b6 b5 b4 b3 b2 b1 b0 }, suma je {c7 c6 c5 c4 c3 c2 c1 c0 }, gdje je ci = ai ⊕ bi . Na primjer, sledeći izrazi su ekvivalentni: (x6 + x4 + x2 + x + 1) + (x7 + x + 1) = x7 + x6 + x4 + x2 , {01010111} ⊕ {10000011} = {11010100}, {57} ⊕ {83} = {d4}. 2.2 Množenje Množenje u GF (28 ) je glavna operacija za MixColumn transformaciju u AES-u. U prvom koraku, dva elementa (predstavljena njihovim polinomima) konačnog polja GF (2m ) se množe koristeći standardno pravilo množenja polinoma: A(x) · B(x) = (am−1 xm−1 + · · · + a0 ) · (bm−1 xm−1 + · · · + b0 ), 0 0 0 C (x) = c2m−2 x2m−2 + · · · + c0 , Gdje je 0 c0 = a0 b0 (mod 2), .. . 0 c2m−2 = am−1 bm−1 (mod 2). Primijetimo da su svi koeficijenti ai , bi i ci elementi polja GF(2), i da je aritmetika nad koeficijentima sprovedena u GF(2) polju. Generalno proizvod polinom C(x) će imati stepen veći od m-1 i to se mora svesti. 7 Osnovna ideja je pristup sličan množenju u prostim poljima (polje sa prostim brojem elemenata) tj. u GF(p) mi množimo dva cijela broja, podijelimo rezultat sa p, i uzmemo u obzir samo ostatak. U proširenim poljima (polje sa brojem elemenata stepena prostog broja, većeg od 1), proizvod množenja se dijeli sa određenim polinomom, i mi uzimamo u obzir samo ostatak nakon dijeljenja sa tim polinomom. Za to trebamo nesvodljivi polinom (u tom polju) - za operaciju svođenja po modulu. A nesvodljivi polinom je onaj koji je kao i prost broj djeljiv samo sa sobom i jedinicom.[2] Dakle, možemo napraviti definiciju množenja u proširenom polju: i Neka su A(x), B(x)∈ GF(2m ) i neka je P (x) = Σm i=0 pi x , pi ∈ GF(2) nesvodljivi poli- nom. Množenje dva elementa A(x) i B(x) se izvodi kao: C(x) ≡ A(x)B(x) (mod P (x)). Tada svako polje GF (2m ) zahtijeva nesvodljivi polinom P(x) stepena m, sa koeficijentima iz GF(2). Primijetimo da nisu svi polinomi nesvodljivi. Na primjer, polinom x4 + x3 + x + 1 je svodljiv jer: x4 + x3 + x + 1 = (x2 + x + 1)(x2 + 1), i stoga se ne može koristiti za konstruisanje proširenog polja GF (24 ). Za AES se koristi nesvodljivi polinom u GF (28 ): P (x) = x8 + x4 + x3 + x + 1. Primjer množenja u GF (28 ): A(x) = x6 + x4 + x2 + x + 1, B(x) = x7 + x + 1, P (x) = x8 + x4 + x3 + x + 1 C(x) = A(x) · B(x) = x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1 x8 = 1 ∗ P (x) + (x4 + x3 + x + 1) x8 ≡ x4 + x3 + x + 1 (mod P (x)) x9 ≡ x5 + x4 + x2 + x (mod P (x)) x10 ≡ x6 + x5 + x3 + x2 (mod P (x)) x11 ≡ x7 + x6 + x4 + x3 (mod P (x)) 8 x12 ≡ x8 + x7 + x5 + x4 (mod P (x)) x13 ≡ x9 + x8 + x6 + x5 (mod P (x)) .. . x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1 (mod P (x)) = x7 + x6 + 1. 2.3 Invertovanje Invertovanje u GF (28 ) je osnovna operacija za Byte Substitution transformaciju, koja sadrži S-Box. 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 00 74 3A 2C 1D ED 16 79 83 DE FB 0C 0B 7A B1 5B 1 01 B4 6E 45 FE 5C 5E B7 7E 6A 7C E0 28 07 0D 23 2 8D AA 5A 92 37 05 AF 97 7F 32 2E 1F 2F AE D6 38 3 F6 4B F1 6C 67 CA D3 85 80 6D C3 EF A3 63 EB 34 4 CB 99 55 F3 2D 4C 49 10 96 D8 8F 11 DA C5 C6 68 5 52 2B 4D 39 31 24 A6 B5 73 8A B8 75 D4 DB 0E 46 6 7B 60 A8 66 F5 87 36 BA BE 84 65 78 E4 E2 CF 03 7 D1 5F C9 42 69 BF 43 3C 56 72 48 71 0F EA AD 8C 8 E8 58 C1 F2 A7 18 F4 B6 9B 2A 26 A5 A9 94 08 DD 9 4F 3F 0A 35 64 3E 47 70 9E 14 C8 8E 27 8B 4E 9C A 29 FD 98 20 AB 22 91 D0 95 9F 12 76 53 C4 D7 7D B C0 CC 15 6F 13 F0 DF 06 D9 88 4A 3D 04 D5 E3 A0 C B0 FF 30 77 54 51 33 A1 F7 F9 CE BD 1B 9D 5D CD D E1 40 44 BB 25 EC 93 FA 02 DC E7 BC FC F8 50 1A E E5 EE A2 59 E9 61 21 81 B9 89 D2 86 AC 90 1E 41 F C7 B2 C2 19 09 17 3B 82 A4 9A 62 57 E6 6B B3 1C Slika 2.1: Inverzne vrijednosti elemenata u GF (28 ) Za dato konačno polje GF (28 ) i odgovarajući nesvodljivi polinom P(x), inverzni elemenat A−1 nenultog elementa A ∈ GF (28 ) se definiše kao: A−1 (x) · A(x) = 1 (mod P (x)). 9 Za mala polja (u praksi se često misli na polja sa 216 ili manje elemenata) često se koristi lookup tabela sa unaprijed izračunatim inverznim vrijednostima svih elemenata. Tabela na slici 2.1 pokazuje inverzne vrijednosti za elemente iz polja GF (28 ) koje se koristi u AES-u. Ova tabela sadrži sve inverze u GF (28 ) po modulu P(x), P (x) = x8 + x4 + x3 + x + 1 u heksadecimalnoj notaciji. Specijalan slučaj je ulaz za element polja 0, za koje inverz ne postoji. Međutim, za AES S-Box, neophodna je tabela za zamjenu koja definiše sve moguće ulazne vrijednosti. Dakle, dizajneri su definisali S-Box tako da je ulaz 0 mapiran u izlaz 0. Primjer iz tabele: x7 + x6 + x = (11000010)2 = (C2)hex = (xy) za taj element, tabela vraća: (2F )hex = (00101111)2 = x5 + x3 + x2 + x + 1 Ovo se može provjeriti množenjem: (x7 + x6 + x) · (x5 + x3 + x2 + x + 1) ≡ 1modP (x) Vrijednosti u tabeli su dobijene tj. mogu se ručno računati pomoći proširenog Euklidovog algoritma. 10 Glava 3 Specifikacija algoritma Za AES algoritam, dužina ulaznog i izlaznog bloka, i stanja je 128. Ovo je predstavljeno sa Nb = 4, što je zapravo broj 32 bitnih riječi u stanju. Dužina ključa k je 128, 192 ili 256. Dužina ključa je predstavljena sa Nk = 4, 6, 8 tj broj 32 bitnih riječi u ključu.[5] Broj etapa (rundi) koje se vrte tokom izvršenja algoritma zavisi od dužine ključa. Taj broj je predstavljen sa Nr , gdje je Nr =10 za Nk =4, Nr =12 za Nk =6 i Nr =14 za Nk =8. I za kriptovanje i dekriptovanje, AES algoritam koristi kružni blok - strukturu koja se sastoji od 4 različite bajt-orjentisane operacije: 1) Zamjena bajtova koristeći S-BOX-ove, 2) Pomijeranje vrsta u nizu Stanja za različite offset-e, 3) Miješanje podataka svake kolone u stanju, 4) Dodavanje etapnog ključa u stanje. 11 3.1 Enkripcija Na početku enkripcije, ulaz se kopira u stanje koristeći ranije navedeni princip. Nakon inicijalnog dodavanja etapnog ključa, matrica stanja se transformiše implementirajući etapne funkcije 10, 12 ili 14 puta, sa finalnom etapom koja se malo razlikuje od prethodnih n-1. Finalno stanje se kopira na izlaz po ranije opisanoj proceduri. Etapna funkcija je parametrizovana koristeći raspodjelu ključa koja se sastoji od jednodimenzinalnog niza 4-ro bajtnih riječi izvedenih koristeći rutinu za proširenje ključa koju ćemo kasnije pojasniti detaljnije. Kao što je prikazano slici 3.1, svih Nr etapa su identične sa izuzetkom poslednje koja ne uključuje MixColumn() transformaciju. Kriptuj(byte in[4*Nb ], byte out[4*Nb ], word W[Nb ∗ (Nr + 1)]) begin byte stanje[4,Nb ] stanje=in AddRoundKey (stanje, W[0,Nb − 1]) for etapa=1 step 1 to Nr -1 SubBytes(stanje) ShiftRows(stanje) MixColumn(stanje) AddRoundKey (stanje, W[etapa*Nb , (etapa+1)Nb − 1]) end for SubBytes(stanje) ShiftRows(stanje) AddRoundKey (stanje, W[Nr ∗ Nb , (Nr + 1)*Nb − 1]) out=stanje end Slika 3.1: Pseudo kod za enkripciju. 12 3.1.1 SubBytes() transformacija SubBytes() transfomracija je nelinearna zamjena bajtova koja funkcioniše nezavisno za svaki bajt stanja koristeći tabelu izmjene ili S-Box. S-Box je invertibilna, i konstruisana na sledeći način: 1) Za svaki element iz GF (28 ) uzećemo multiplikativni inverz iz tabele 2.1. 2) Primijenićemo sledeću (afinu) 0 b0 1 0 0 0 b01 1 1 0 0 0 b2 1 1 1 0 0 b3 0 = 1 1 1 1 b 1 1 1 1 40 b 0 1 1 1 50 b 0 0 1 1 6 0 0 0 0 1 b7 transformaciju: 1 1 1 1 b0 b1 0 1 1 1 0 0 1 1 b2 0 0 0 1 b3 + 1 0 0 0 b4 1 1 0 0 b5 1 1 1 0 b6 1 1 1 1 b7 1 1 0 0 mod2. 0 1 1 0 Odnosno: 0 bi = bi ⊕ b(i+4)mod8 ⊕ b(i+5)mod8 ⊕ b(i+6)mod8 ⊕ b(i+7)mod8 ⊕ ci , za 0≤ i<8, gdje je bi i -ti bit bajta, a ci i -ti bit bajta c sa vrijednošću {63} ili {01100011}. 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 63 CA B7 04 09 53 D0 51 CD 60 E0 E7 BA 70 E1 8C 1 7C 82 FD C7 83 D1 EF A3 0C 81 32 C8 78 3E F8 A1 2 77 C9 93 23 2C 00 AA 40 13 4F 3A 37 25 B5 98 89 3 7B 7D 26 C3 1A ED FB 8F EC DC 0A 6D 2E 66 11 0D 4 F2 FA 36 18 1B 20 43 92 5F 22 49 8D 1C 48 69 BF 5 6B 59 3F 96 6E FC 4D 9D 97 2A 06 D5 A6 03 D9 E6 6 6F 47 F7 05 5A B1 33 38 44 90 24 4E B4 F6 8E 42 7 C5 F0 CC 9A A0 5B 85 F5 17 88 5C A9 C6 0E 94 68 8 30 AD 34 07 52 6A 45 BC C4 46 C2 6C E8 61 9B 41 9 01 D4 A5 12 3B CB F9 B6 A7 EE D3 56 DD 35 1E 99 Slika 3.2: S-Box 13 A 67 A2 E5 80 D6 BE 02 DA 7E B8 AC F4 74 57 87 2D B 2B AF F1 E2 B3 39 7F 21 3D 14 62 EA 1F B9 E9 0F C FE 9C 71 EB 29 4A 50 10 64 DE 91 65 4B 86 CE B0 D D7 A4 D8 27 E3 4C 3C FF 5D 5E 95 7A BD C1 55 54 E AB 72 31 B2 2F 58 9F F3 19 0B E4 AE 8B 1D 28 BB F 76 C0 15 75 84 CF A8 D2 73 DB 79 08 8A 9E DF 16 S-Box koji koristi SubBytes() transfomracija je prikazan na slici 3.2 u hexadecimalnoj formi. Na primjer s1,1 ={53} mijenjamo sa S-Box[5,3] gdje je 5 broj vrste, 3 broj kolone, i rezultat je: {ED}. 3.1.2 ShiftRows() transformacija U ShiftRows() transformaciji bajtovi u poslednje 3 vrste stanja se ciklično pomjeraju za različit broj bajtova (offset). Prva vrsta r=0 se ne pomjera. Sledeća jednačina opisuje ShiftRows() transformaciju: 0 sr,c = sr,(c+shif t(r,Nb )) (mod Nb ) , za 0<r<4 i 0 ≤ c<Nb . gdje vrijednost pomjeranja shift(r, Nb ) zavisi od broja vrste r kao: shift(1, 4) = 1, shift(2, 4) = 2 i shift(3, 4) = 3. Ovo ima efekat pomjeranja bajtova na ’nižu’ poziciju u vrsti, dok se ’najniži’ provlači do ’najveće’ pozicije u vrsti. S s0,0 s1,0 s2,0 s3,0 s0,1 s1,1 s2,1 s3,1 S’ s0,2 s1,2 s2,2 s3,2 s0,3 s1,3 =⇒ ShiftRows() =⇒ s2,3 s3,3 s0,0 s1,1 s2,2 s3,3 s0,1 s1,2 s2,3 s3,0 s0,2 s1,3 s2,0 s3,1 s0,3 s1,0 s2,1 s3,2 Slika 3.3: ShiftRows() transformacija. 3.1.3 MixColumn() transformacija MixColumn() korak je linearna transformacija koja miješa svaku kolonu u stanju. Kako svaki ulazni bajt utiče na 4 izlazna bajta, MixColumn() korak je glavni difuzioni element u AES-u. Kombinacija ShiftRows() i MixColumn() slojeva čini da nakon samo 3 etape svaki bajt matrice stanja zavisi od svih 16 bajtova teksta[3]. Dalje ćemo 16 ulaznih bajtova označavati sa B, a 16 izlaznih sa C: 14 MixColumn(B)=C gdje je B stanje nakon ShiftRows() koraka. Sada, svaka kolona od 4 bajta se smatra vektorom i množi fiksnom 4x4 matricom. Matrica ima konstantne vrijednosti. Evo kako se računaju prva 4 izlazna bajta: 02 C1 = 01 01 C2 03 C3 C0 03 01 01 02 03 01 01 02 03 01 01 02 B0 B5 B 10 B15 Druga kolona izlaznih bajtova (C4 , C5 , C6 , C7 ) se računa množenjem 4 ulazna bajta (B4 , B7 , B14 , B3 ) sa istom matricom konstanti i tako dalje. Svaki bajt stanja Ci i Bi je 8 bitna vrijednost koja predstavlja element GF (28 ). Za konstante u matrici korišćena je hexadecimalna notacija: ’01’ misleći na polinom u GF (28 ) sa koeficijentima {00000001} tj. element 1 tog polja; ’02’ misleći na polinom u GF (28 ) sa koeficijentima {00000010} tj. polinom x; i ’03’ misleći na polinom u GF (28 ) sa koeficijentima {00000011} tj. polinom x+1. Sabiranja u vektor-matrica množenju su sabiranja u GF (28 ) tj jednostavno XORovanje odgovarajućih bita. Za množenje konstanti moramo razumjeti množenje sa konstantama 01, 02 i 03. One su prilično efikasne, i odabrane tako da softverska implementacija bude jednostavnija. Množenje sa 01 je identitetsko množenje i ne zahtijeva nikakvu operaciju. Množenje sa 02 i 03 se može odraditi koristeći look-up tabelu ranije pomenutu. Kao alternativa tome, množenje sa 02 se može posmatrati kao množenje sa x, sto je zapravo lijevo shift-ovanje za jedan, i modularno svođenje polinomom P (x) = x8 + x4 + x3 + x + 1. Slično, množenje sa 03 – predstavlja x+1 polinom, može biti implementirano kao lijevo shift-ovanje za jedan bit i dodavanje originalne vrijednosti praćeno modularnim 15 svođenjem sa polinomom P(x). Primjer. Neka je ulaz u MixColumn() sloj B=(25,25,25,. . . 25). U ovom specijalnom slučaju samo 2 množenja unutar GF (28 ) se moraju odraditi. To su 02·25 i 03·25, koja se mogu izračunati u polinomijalnoj reprezentaciji kao: 02 · 25 = x · (x5 + x2 + 1) = x6 + x3 + x, 03 · 25 = (x + 1) · (x5 + x2 + 1) = (x6 + x3 + x) + (x5 + x2 + x) = x6 + x5 + x3 + x2 + x + 1. Kako obje međuvrijednosti imaju stepen manji od 8, nije potrebno modularno svođenje sa P(x). Izlazni bajtovi od C se dobijaju iz sledećeg sabiranja: 01 · 25 = x5 + x2 + 1 01 · 25 = x5 + x2 + 1 02 · 25 = x6 + 03 · 25 = x 6 x3 + + x Ci = 5 + x x5 + 3 + x 2 x + 1 + x + 1 x2 + 1, gdje je i=0,. . . ,15. Ovo vodi ka izlaznom stanju C=(25,25,. . . ,25). 3.1.4 AddRoundKey () sloj Dva ulaza u ovaj sloj su stanje, i etapni ključ koji se takođe sastoji od 16 bajtova. Ova dva ulaza se XOR-uju. XOR je ekvivalent sabiranju u Galois-ovom polju. Etapni ključevi su izvedeni iz glavnog ključa po principu koji opisujem ispod. 3.1.5 Izvođenje etapnih ključeva Ovaj sloj uzima originalni ulazni ključ (128, 192 ili 256 bita) i izvodi etapne ključeve za AES. Sa slike 3.1 vidimo da se XOR-ovanje etapnog ključa koristi na ulazu i izlazu iz AES-a. Ovaj proces se ponekad naziva izbjeljivanje ključa. Broj etapnih 16 ključeva je jednak broju etapa + 1, zbog izbjeljivanja u prvom sloju dodavanja ključa. Dalje, za dužinu ključa 128, broj rundi-etapa je Nr =10, i tu nam treba 11 etapnih ključeva, svaki od po 128 bita. Za AES sa dužinom ključa 192, potrebno je 13 a za 256 potrebno je 15 etapnih ključeva. AES etapni ključevi su rekurzivno izračunati tj. da bi dobili etapni ključ ki moramo znati ki−1 . . . Ovo izvodenje ključeva je riječ-orjentisano, gdje je riječ=32 bita. Podključevi su smješteni u niz W koji se sastoji od riječi. Postoje 3 varijante izvođenja za 3 različite dužine ulaznog ključa ali je svaki metod sličan. IzvođenjeKljučeva(byte ključ[4*Nk ], word W[Nb ∗ (Nr + 1)], Nk ) begin word temp i=0 while (i<Nk ) W[i]=word(ključ[4*i], ključ[4*i+1], ključ[4*i+2], ključ[4*i+3]) i=i+1 end while i=Nk while (i<Nb ∗ (Nr + 1)) temp=W[i-1] if (i mod Nk =0) temp=SBOX(ShiftLeft(temp)) XOR RC[i/Nk ] elseif ((Nk >6) and (i mod Nk =4)) temp=SBOX(temp) end if W[i]=W[i-Nk ] XOR temp i=i+1 end while end Slika 3.4: Pseudo kod za izvođenje etapnih ključeva. Procedura je opisana na slici 3.4. U proceduri se koristi ShiftLeft opreacija, koja pomjera svaki od 4 bajta iz argumenta za jedno mjesto ulijevo, tako da npr. ulazni redosled w0 w1 w2 w3 mijenja sa w1 w2 w3 w0 , gdje su wi bajtovi ulazne riječi Wi . Osim nje koristi se i niz etapnih koeficijenata RC, koji se i dobija kao xi−1 gdje je 0<i<11. Dakle 17 prvi element niza RC je {00000001}, drugi je {00000010} i tako redom. Poslednja 2 tj. x9 i x8 se dobijaju svođenjem sa polinomom P(x). Takođe se koristi i funkcija SBOX, koja ulazna 4 bajta iz argumenta provlači kroz S-Box po proceduri opisanoj ranije u SubBytes() sekciji, i vraća 4 bajta dobijena iz S-Box tabele. Nakon završene procedure, u nizu W, zavisno od dužine ključa, nalazi se 44, 52 ili 60 riječi. Počevši od 0 do dužine niza W - 1, uzimamo po 4 riječi u svakoj iteraciji dodavanja etapnog ključa. Dakle svi etapni ključevi, nezavisno od dužine originalnog ključa imaju po 128 bita. 3.2 Dekripcija Kako je AES zasnovan na Feistel-ovoj mreži, svi nivoi moraju da se invertuju. Međutim, ispostavlja se da su inverzne operacije po nivioma veoma slične operacijama za enkripciju. Redosled ključeva je obrnut odnosno treba nam obrnuta raspodjela ključa. Na slici 3.5 dat je pseudo kod za dekripciju. Operacija XOR je sama sebi inverzna, dok se AddRoundKey() samo dodaje obrnutim redosledom, odnosno, nakon što se izvedu ključevi i napuni niz W, dodavanje etapnih ključeva počinjemo od kraja niza. Ostale operacije opisujem ispod. 3.2.1 InvMixColumn() transformacija Nakon dodavanja etapnog ključa, na stanje C se primjenjuje InvMixColumn() transformacija, s tim što se sada koristi inverzna matrica iz originalne MixColumn() transformacije. Tako da sada imamo B=InvMixColumn(C) kao: 18 Dekriptuj(byte in[4*Nb ], byte out[4*Nb ], word W[Nb ∗ (Nr + 1)]) begin byte stanje[4,Nb ] stanje=in AddRoundKey (stanje, W[Nr ∗ Nb , (Nr + 1) ∗ Nb − 1]) for etapa=Nr -1 step -1 downto 1 InvSubBytes(stanje) InvShiftRows(stanje) AddRoundKey (stanje, W[etapa*Nb , (etapa+1)Nb − 1]) InvMixColumn(stanje) end for InvShiftRows(stanje) InvSubBytes(stanje) AddRoundKey (stanje, W[0,Nb − 1]) out=stanje end Slika 3.5: Pseudo kod za dekripciju. B0 B1 = B2 B3 C0 09 0E 0B 0D C1 0D 09 0E 0B C2 C3 0B 0D 09 0E 0E 0B 0D 09 Isti postupak se nastavlja i za ostale kolone. Sabiranje i množenje su odrađeni u GF (28 ). 3.2.2 InvShiftRows() transformacija U ovom koraku radimo suprotnu operaciju u odnosu na originalnu ShiftRows() transformaciju. Donje 3 vrste matrice stanja pomjeramo desno za po jedno, dva odnosno tri mjesta: 19 S s0,0 s1,0 s2,0 s3,0 s0,1 s1,1 s2,1 s3,1 S’ s0,2 s1,2 s2,2 s3,2 s0,3 s1,3 =⇒ InvShiftRows() =⇒ s2,3 s3,3 s0,0 s1,3 s2,2 s3,1 s0,1 s1,0 s2,3 s3,2 s0,2 s1,1 s2,0 s3,3 s0,3 s1,2 s2,1 s3,0 Slika 3.6: InvShiftRows() transformacija. 3.2.3 InvSubBytes() transformacija Kod inverzne SubBytes() transformacije koristimo inverzni S-Box. Inverzni S-Box konstruisemo ovako: 1) Na svaki element iz GF (28 ) primijenjujemo sledeću inverznu afinu transformaciju: 0 b0 0 b1 0 b2 0 b 3 0 = b4 0 b5 0 b 6 0 b7 0 0 1 0 0 1 0 1 b0 1 b1 0 b2 0 b3 + 1 b4 0 b5 1 b6 0 b7 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 mod2. 0 1 0 1 2) Za dobijeni element iz GF (28 ) računamo multiplikativni inverz. Suštinski ra0 dimo inverz inverznog elementa iz GF (28 ), jer je Bi zapravo dobijen invertovanjem nekog elementa. Za ovaj postupak se takođe može napraviti lookup tabela, a može se i ručno računati. Finalni-inverzni S-Box je prikazan na slici 3.7. 20 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 52 7C 54 08 72 6C 90 D0 3A 96 47 FC 1F 60 A0 17 1 09 E3 7B 2E F8 70 D8 2C 91 AC F1 56 DD 51 E0 2B 2 6A 39 94 A1 F6 48 AB 1E 11 74 1A 3E A8 7F 3B 04 3 D5 82 32 66 64 50 00 8F 41 22 71 4B 33 A9 4D 7E 4 30 9B A6 28 86 FD 8C CA 4F E7 1D C6 88 19 AE BA 5 36 2F C2 D9 68 ED BC 3F 67 AD 29 D2 07 B5 2A 77 6 A5 FF 23 24 98 B9 D3 0F DC 35 C5 79 C7 4A F5 D6 7 38 87 3D B2 16 DA 0A 02 EA 85 89 20 31 0D B0 26 8 BF 34 EE 76 D4 5E F7 C1 97 E2 6F 9A B1 2D C8 E1 9 40 8E 4C 5B A4 15 E4 AF F2 F9 B7 DB 12 E5 EB 69 A A3 43 95 A2 5C 46 58 BD CF 37 62 C0 10 7A BB 14 Slika 3.7: Inverzni S-Box 21 B 9E 44 0B 49 CC 57 05 03 CE E8 0E FE 59 9F 3C 63 C 81 C4 42 6D 5D A7 B8 01 F0 1C AA 78 27 93 83 55 D F3 DE FA 8B 65 8D B3 13 B4 75 18 CD 80 C9 53 21 E D7 E9 C3 D1 B6 9D 45 8A E6 DF BE 5A EC 9C 99 0C F FB CB 4E 25 92 84 06 6B 73 6E 1B F4 5F EF 61 7D Glava 4 Bezbjednost AES-a U deceniji nakon objavljivanja standarda, nekoliko pokušaja napada na AES je zabilježeno. Svi ti pokušaji su bili bezopasni, i ni u jednom trenutku bez obzira na dužinu ključa, nije dovedena u pitanje sigurnost algoritma, ukoliko je implementiran sa standardom definisanim brojem etapa-rundi. Dobar dio tih pokušaja je upravo bio usmjeren na određene implementacije sa po 2, 3 ili čak 4 etape manje nego što je standardom propisano. Takođe je zabilježen manji broj pokušaja da koji su bazirani na side-chanel principu, koji ima više varijanti, a suštinski podrazumijeva postojanje informacija o fizičkom načinu implementacije algoritma, okruženju, samom sistemu na kome se izvršava i mnoge druge slične informacije. U tim varijantama rezultati su bili vrlo malo bolji od brute-force metode.[9] 2011. godine je objavljen metod napada na varijantu algoritma sa 128 bitnim ključem, koji je skoro 4 puta brži od brute-force metode. To znači da je moguće sa 2126.1 poređenja probiti 128 bitnu varijantu (brute-force metodi je potrebno 2128 ). Taj metod napada koristi takozvanu key-related tehniku. Key-related tehnika je bilo koji oblik kriptoanalize u kojoj napadač može da nadgleda rad algoritma sa nekoliko različitih ključeva, čije originalne vrijednosti nisu poznate, ali među njima postoje neke matematičke relacije, tipa da im je određeni broj bajtova na istim pozicijama isti, i slično. Rezultati primjene ove metode na varijante sa 192 bitnim ili 256 bitnim 22 ključem su naravno još slabiji i, kao i kod 128 bitne varijante, nisu previše značajni za bezbjednost algoritma. 4.1 Režim rada Režim rada ili mod, je još jedno generalno svojstvo simetričnih blok šifri. Obzirom da se kriptovanje vrši po blokovima, postoji dakle mogućnost, i to ne malo vjerovatna, da se isti blok kriptuje istim ključem. Takva operacija za rezultat ima isti kriptovani blok, što moze biti upotrijebljeno u cilju dobijanja bloka osnovne poruke, koristeći neku od gore pomenutih tehnika napada na AES. Iz tog razloga se došlo do ideje da se naprave dodatni režimi rada, koji bi omogućili da rezultat akcije kriptovanja istog bloka istim ključem na dva razlicita mjesta, bude različit. Postoji više modova, neki od njih su: ECB (Electronic Code Book mode), CBC (Cipher Block Chaining mode), PCBC (Propagating Cipher Block Chaining mode), CFB (Cipher feedback) i tako dalje [4]. Ja ću samo prva dva malo detaljnije pojasniti, jer daju dovoljnu sliku o tome zašto su izmišljeni i kako rade. 4.1.1 ECB ECB je najjednostavniji režim. AES, kao i ostale blok šifre, je u osnovi osmišljen da radi u ovom modu. Dakle svaki blok se zasebno kriptuje istim - osnovnim ključem. Ovo, kako gore rekoh, vodi do toga da će, ukoliko se isti blok pojavi više puta unutar osnovne poruke, rezultat kriptovanja biti isti. Iz tog razloga se ECB mod koristi ukoliko je osnovna poruka kratka, npr. veličine jednog bloka. Naravno i za veće poruke ECB će raditi dobar posao pod uslovom da se ne dešava da dodje isti blok kao ulaz u algoritam više od jednom. Primjer koji najbolje poredi rezultat rada u ovom i CBC modu je na slici 3.8. Tu je korišćen blok algoritam za kriptovanje fotografije. 23 Obzirom da na fotografiji ima malo boja i malo nijansi tih boja, rezultat kriptovanja istih piksela će biti isti, tako će rezultat biti relativno loš u smislu da se kriptovanjem nije uspjela sakriti suština na fotografiji. Slika 4.1: Režim rada 4.1.2 CBC Ovo je najrasprostranjeniji mod. Izmišljen je od strane IBM-a 1976. godine. On radi XOR-ovanje svakog bloka osnovne poruke sa prethodnim kriptovanim blokom. Ovako će svaki kriptovani blok zavisiti od svih kriptovanih prije njega. Obzirom da prvi blok nema svog kriptovanog prethodnika, uvodi se inicijalni vektor IV - random 128 bitna sekvenca, koja mora biti fiksna samo za jedno izvršavanje algoritma. Naravno isti IV mora biti korišćen kod dekripcije. Jedan od nedostataka ovog moda je da je enkripcija sekvencijalna, u smislu da se mora znati ishod kriptovanja jednog bloka da bi se kriptovao sledeći i iz tog razloga se ne može kriptovanje paralelizovati. 24 Glava 5 Zaključak Iako je tehnologija u poslednjoj deceniji puno napredovala, sa tendencijom rasta ulaganja sredstava u poboljšanje performansi računarskih sistema, računajući na relativno veliku dužinu ključa i često kratku vremensku validnost informacija koje se kriptuju, od AES-a se očekuje da još dugo bude standard u kriptografiji. Otpornost na brute-force metodu korektno implementirane 128 bitne varijante AES-a, protiv budžeta od 1000000$, je osigurana na minimum 50 godina[8]. Oktobra 2000-te godine Bruce Schneier, programer Twofish algoritma koji je bio konkurencija Rijndael -u u izboru za AES, iako je u početku mislio da će uspješan akademski napad na Rijdnael biti osmišljen jednog dana, na kraju je ipak rekao: "Ne vjerujem da će iko ikad uspjeti da otkrije napad kojim će uspješno čitati Rijndael -ov saobraćaj". S obzirom na vrijeme u kome živimo, kada različiti subjekti pokušavaju da vrše kontrolu internet saobraćaja, postojanje naprednih, jakih standarda enkripcije je veoma važno u cilju očuvanja privatnosti komunikacije. 25 Bibliografija [1] http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf. [2] http://www.moserware.com/2009/09/stick-figure-guide-to-advanced. html. [3] Mrs. Namita Tiwari Amish Kumar. "EFFECTIVE IMPLEMENTATION AND AVALANCHE EFFECT OF AES", 2012. Department of CSE MANIT-Bhopal. [4] Morris Dworkin. "Recommendation for Block Cipher Modes of Operation", 2001. NIST Special Publication 800-38A. [5] United States National Institute of Standards and Technology (NIST). Announcing the ADVANCED ENCRYPTION STANDARD (AES). http://csrc.nist. gov/publications/fips/fips197/fips-197.pdf, Novembar 26, 2001. Federal Information Processing Standards Publication 197. [6] Christof Paar and Jan Pelzl. "Understanding Cryptography, A Textbook for Students and Practitioners", 2009. Springer. [7] Vincent Rijmen and Joan Daemen. "The Design of Rijndael, AES the Advanced Encryption Standard", Springer. [8] Svante Seleborg. "About AES". http://www.axantum.com/axcrypt/etc/ About-AES.pdf, 2007. Axantum Software AB. 26 [9] Wisam Elmasry Shaaban Sahmoud and Shadi Abudalfa. "Enhancement the Security of AES Against Modern Attacks by Using Variable Key Block Cipher", March 18, 2011. Department of Computer Engineering, Islamic University of Gaza. 27
© Copyright 2024 Paperzz