Natječaj je zaključen 15.6.1998. Od 21 pristigle prijave, 15 ih je zadovoljilo NIST-ove kriterije. U kolovozu 1999. NIST je objavio 5 finalista: MARS, RC6, RIJNDAEL, SERPENT i TWOFISH. Recimo nekoliko riječi o ovih 5 finalista.
MARS (IBM), RC6 (RSA Security Inc.) i TWOFISH (Counterpane Systems) spadaju u Feistelove šifre. Podsjetimo se da je Feistelova šifra blokovna šifra u kojoj u i-toj rundi koristi formule Li = Ri -1, Ri = Li -1 ⊕ f (Ri -1, Ki) (dakle, isto kao kod DES-a). MARS spada u nebalansirane Feistelove šifre jer se blokovi ne dijele na 2, već na 4 dijela. MARS ima 32 runde, RC6 ima 20 rundi, dok TWOFISH ima 16 rundi. Specifičnost kriptosustava RC6 (koji je dosta sličan RC5) jesu korištenje funkcije f(x) = x(2x+1), koja daje difuziju, te rotacija koje ovise o podacima, koje daju otpornost na diferencijalnu i linearnu kriptoanalizu. Specifičnost TWOFISH-a je da se S-kutije dinamički mijenjaju u ovisnosti o ključu, što komplicira diferencijalnu i linearnu kriptoanalizu.
SERPENT su konstruirali kriptografi iz Engleske, Izraela i Danske. Spada u supstitucijsko-permutacijske šifre. Ima 32 runde i, što je za njega specifično, u svakoj rundi paralelno koristi 32 identične S-kutije.
RIJNDAEL su razvili belgijski kriptografi. Razlikuje se od ostalih finalista po tome što se u konstrukciji S-kutija koriste operacije u konačnom polju GF(28).
Konačno, 2000. godine objavljeno je da je pobjednik natječaja za AES
RIJNDAEL (čitaj: rejn dol).
Standard AES objavljen je kao FIPS 197
2001. godine. Godine 2023. FIPS 197 je ažuriran, ali bez tehničkih promjena u samom
AES algoritmu.
Rijndael je u izvornoj specifikaciji dopuštao i druge duljine blokova,
dok standard AES koristi isključivo blokove duljine 128 bitova i ključeve
duljine 128, 192 ili 256 bitova.
RIJNDAEL su razvili belgijski kriptografi
Joan Daemen i Vincent
Rijmen s Katoličkog sveučilišta Leuven, po kojima je i dobio ime.
Kako smo već napomenuli, jedna od njegovih specifičnosti je korištenje konačnog polja GF(28) (alternativna oznaka je F28). Preciznije, elementi od GF(28) su polinomi oblika a7x7 + a6x6 + ... + a1x + a0, ai ∈ {0, 1}, a operacije su zbrajanje i množenje polinoma iz Z2[X] modulo fiksni ireducibilni polinom g(x) = x8 + x4 + x3 + x + 1. Dakle, uzimamo da je GF(28) = Z2[X] / (g(x)). Elemente od GF(28) možemo prikazati i kao bajtove (nizove od 8 bitova). Npr. polinomu x6 + x4 + x2 + x + 1 odgovara bajt 01010111 ili 57 u heksadecimalnom zapisu.
Primjer 2.6: Pomnožiti polinome x6 + x4 + x2 + x + 1 i x7 + x + 1 iz polja GF(28).
Najprije pomnožimo ova dva polinoma u prstenu Z2[X]:
(x6 + x4 + x2 + x + 1) · (x7 + x + 1) = x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1.
Potom izračunamo ostatak pri dijeljenju ovog polinoma s g(x). Tako dobijemo rezultat x7 + x6 + 1. Heksadecimalno to možemo zapisati kao: 57 · 83 = C1.
U RIJNDAEL-u se također koriste i operacije na polinomima s
koeficijentima iz GF(28) stupnja manjeg od 4.
Svaki takav polinom možemo reprezentirati kao 4-bajtni vektor.
Zbrajanje takvih polinoma se svodi na zbrajanje koeficijenata uz
iste potencije (zbrajanje u GF(28) smo već definirali).
Da bi kod množenja dobili kao rezultat polinom stupnja manjeg
od 4, moramo produkt reducirati modulo neki polinom četvrtog
stupnja. U RIJNDAEL-u je za to izabran polinom
X4 + 1.
Polinom
|
= |
|
|
Ovdje je polinom d(X) = d3X3 + d2X2 + d1X+ d0 rezultat množenja polinoma a(X) = a3X3 + a2X2 + a1X+ a0 i b(X) = b3X3 + b2X2 + b1X+ b0, u oznaci d(X) = a(X) ⊗ b(X).
Primjer 2.7: Izračunati:
(03 X3 + 01 X2 + 01 X + 02) ⊗ (0B X3 + 0D X2 + 09 X + 0E).
Označimo rezultat s d(X) = d3X3 + d2X2 + d1X+ d0. Najprije imamo:d3 = 03 · 0E + 01 · 09 + 01 · 0D + 02 · 0B.
Računamo:
03 · 0E =
(x + 1)
·
(x3 + x2 + x) =
x4 + x = 12,
01 · 09 = 09,
01 · 0D = 0D,
02 · 0B =
x ·
(x3 + x + 1) =
x4 + x2 + x = 16.
d3 = 12 + 09 + 0D + 16 = (x4 + x) + (x3 + 1) + (x3 + x2 + 1) + (x4 + x2 + x) = 00.
Na isti način se izračuna d2 = 00, d1 = 00, d0 = 01. Stoga je d(X) = 01, tj. polinom b(X) je inverz polinoma a(X) s obzirom na operaciju ⊗.Ovaj račun objašnjava zašto se u inverznoj transformaciji MixColumns pojavljuju konstante 0E, 0B, 0D i 09.
RIJNDAEL šifrira blokove od 128 bitova = 16 bajtova. Svaki takav
blok se može shvatiti kao 16 elemenata
polja, koji se reprezentiraju pomoću 4 × 4 matrice s elementima
iz GF(28). Tu matricu ćemo zvati aes-blok.
Ključ također ima 128 bitova (postoje i
varijante sa 192 i 256 bitova). RIJNDAEL ima 10 rundi (uz 128-bitni
ključ). Za ključeve duljine 192 i 256 bitova AES ima 12, odnosno 14 rundi.
Svaka runda se sastoji od 4 operacije:
SubBytes
ShiftRows
MixColumns
AddRoundKey
Prije prve runde provodi se inicijalno dodavanje ključa (AddRoundKey), a u posljednjoj rundi se izostavlja transformacija MixColumns. Jedna runda AES-a ilustrirana je na slici (prema [Savard: A Cryptographic Compendium]).
b'i = bi ⊕ b(i+4) mod 8 ⊕ b(i+5) mod 8 ⊕ b(i+6) mod 8 ⊕ b(i+7) mod 8 ⊕ ci,
gdje je c = 01100011.ShiftRows - ciklički pomiče elemente i-tog retka aes-bloka za i mjesta ulijevo (i = 0,1,2,3).
MixColumns - Stupci matrice se shvate kao polinomi nad GF(28). Dakle, stupac Ai = (a0i, a1i, a2i, a3i) se shvati kao polinom a3iX3 + a2iX2 + a1iX + a0i. Sada se ti polinomi pomnože s polinomom 03 X3 + 01 X2 + 01 X + 02 (u skladu s ranije definiranim operacijama nad polinomima, rezultat se računa modulo X4 + 1).
AddRoundKey je XOR aes-bloka s međuključem koji odgovara trenutnoj rundi.
S-kutije (operacija SubBytes) su dizajnirane tako da bi kriptosustav bio što otporniji na diferencijalnu i linearnu kriptoanalizu, dok su ShiftRows i MixColumns zaslužni za difuziju.
U konstrukciji međuključeva se najprije ključ proširi korištenjem XOR-a i cikličkog pomaka. Prošireni ključ se sastoji od 44 riječi (4-bajtnih vektora). Međuključevi se dobivaju iz proširenog ključa tako da se prvi međuključ sastoji od prve četiri riječi, drugi od sljedeće četiri, itd.
Preostalo je još opisati malo detaljnije postupak proširivanja ključa. Prve 4 riječi proširenog ključa predstavlja zadani ključ. Svaku sljedeću riječ ri dobijemo iz prethodne riječi ri -1 tako da primijenimo XOR s ri -4. Ako je i višekratnik od 4, onda prije operacije XOR izvršimo operacije RotWord (rotira riječ jedno mjesto ulijevo, tj. [r0r1r2r3] promijeni u [r1r2r3r0]), SubWord (uzima jedan po jedan bajt iz riječi i na svakog od njih primijeni S-kutiju), te XOR s riječi [02(i -4)/4,00,00,00], gdje se potenciranje računa u GF(28).
Dešifriranje se odvija po istom algoritmu kao i šifriranje,
osim što se umjesto transformacija
SubBytes, ShiftRows i MixColumns koriste njihovi inverzi.
Primijetimo da smo u Primjeru 2.7 dokazali da polinom
AES je i danas osnovni široko prihvaćeni standard za simetrično blokovno
šifriranje. U suvremenim primjenama sigurnost ne ovisi samo o samoj
blokovnoj šifri, nego i o pravilnom izboru načina djelovanja i zaštiti
integriteta poruke.
| Web stranica kolegija Kriptografija | Andrej Dujella - osobna stranica |