рад

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