AES (de la Advanced Encryption Standard în traducere literală din engleză, Standard Avansat de Criptare), bazat pe algoritmul Rijndael, este un algoritm de criptare simetrică pe blocuri, standardizat de NIST, utilizat pe scară largă pentru protejarea datelor electronice și adoptat ca standard de organizația guvernamentală americană NIST.

AES este o variantă a cifrului pe blocuri Rijndael, dezvoltat de doi criptografi belgieni, Joan Daemen și Vincent Rijmen, care au depus la NIST o propunere în cadrul . Rijndael este o familie de cifruri cu diferite și .

AES este un (adică aceeași cheie este folosită și pentru criptarea datelor, și pentru decriptarea lor) de substituție–permutare, bazat pe o rețea de transformări repetate asupra blocurilor de date. Fiecare rundă aplică o succesiune de operații matematice asupra stării interne, iar cheia inițială este extinsă printr-un algoritm de programare a cheilor (key schedule). NIST a selectat trei membri ai familiei Rijndael: AES operează asupra unor blocuri de date de 128 de biți și utilizează chei criptografice cu lungimi de 128, 192 sau 256 de biți. Numărul de runde ale algoritmului depinde de lungimea cheii: 10 pentru chei de 128 de biți, 12 pentru chei de 192 de biți și 14 pentru chei de 256 de biți.

AES a fost adoptat de guvernul SUA, fiind publicat de NIST ca FIPS PUB 197 (FIPS 197) pe . El a înlocuit Data Encryption Standard (DES), care fusese publicat în 1977. Publicarea standardului a fost precedată de un proces de selecție și standardizare desfășurat pe parcursul a cinci ani, în cadrul căruia au fost prezentați și evaluați cincisprezece algoritmi candidați, înainte ca cifrul Rijndael să fie selectat drept cel mai adecvat. AES a devenit efectiv standard al guvernului american pe , după ce a fost aprobat de . La nivel internațional, AES este inclus în standardul ISO/IEC .

De la standardizarea sa, AES a devenit algoritmul de criptare pe blocuri preferat pentru produsele noi ale guvernului SUA, fiind utilizat pentru protejarea confidențialității datelor electronice și adoptat, printre altele, în protocolul IPsec pentru rețele private virtuale (VPN). AES este disponibil în multe pachete diferite de criptare și este primul (și singurul) accesibil public și aprobat de National Security Agency (NSA) pentru informații clasificate la nivel când se folosește într-un modul criptografic aprobat de NSA.

În prezent nu este cunoscut niciun atac criptanalitic practic asupra versiunilor complete ale AES atunci când algoritmul este utilizat cu dimensiunile standard ale cheii și într-un mod de operare corespunzător. Au fost descrise însă atacuri asupra unor implementări specifice ale AES, precum atacurile pe canale laterale (side-channel attacks), care exploatează caracteristicile implementării și nu slăbiciuni ale algoritmului în sine.

Origine thumb|right|200px|Vincent Rijmen, coautor al algoritmului Rijndael Deoarece DES devenise vulnerabil din cauza lungimii prea mici a cheii, NIST a recomandat utilizarea 3DES, un algoritm care constă în esență în aplicarea de trei ori a DES. Deși 3DES s-a dovedit a fi un algoritm puternic, el este relativ lent în implementările software,Stallings, p. 137 motiv pentru care NIST a lansat în 1997 o cerere de propuneri pentru un algoritm care să-l înlocuiască. S-a pornit de la 21 de propuneri acceptate inițial, apoi prin eliminări numărul lor a fost redus la 15, și apoi la 5, din care a fost ales în cele din urmă algoritmul propus de doi criptografi belgieni, Joan Daemen și Vincent Rijmen. La votarea finală, algoritmul, denumit de autorii săi Rijndael, a învins la vot patru alte propuneri, printre care și algoritmul , propus de o echipă de criptografi în care se afla și reputatul informatician Ron Rivest.

Criteriile pe baza cărora au fost evaluate propunerile pentru AES au fost securitatea (rezistența la atacuri criptanalitice), costurile (eficiența computațională, complexitatea spațială, precum și licențierea liberă și gratuită) și particularitățile algoritmului (flexibilitatea, simplitatea, și ușurința de realizare a implementărilor atât software cât și hardware).Stallings, p. 138

Algoritm În propunerea avansată NIST, cei doi autori ai algoritmului Rijndael au definit un algoritm de criptare pe blocuri în care lungimea blocului și a cheii puteau fi independente, de 128 de biți, 192 de biți, sau 256 de biți. Specificația AES standardizează toate cele trei dimensiuni posibile pentru lungimea cheii, dar restricționează lungimea blocului la 128 de biți.Stallings, p. 140 Astfel, intrarea și ieșirea algoritmilor de criptare și decriptare este un bloc de 128 de biți. În publicația FIPS numărul 197, operațiile AES sunt definite sub formă de operații pe matrice, unde atât cheia, cât și blocul sunt scrise sub formă de matrice.FIPS PUB 197, cap. 3.2, p. 9 La începutul rulării cifrului, blocul este copiat într-un tablou denumit stare (în ), primii patru octeți pe prima coloană, apoi următorii patru pe a doua coloană, și tot așa până la completarea tabloului.

Algoritmul modifică la fiecare pas acest tablou de numere denumit , și îl furnizează apoi ca ieșire. Funcționarea sa este descrisă de următorul pseudocod:FIPS PUB 197, cap. 5.1, p. 15

Aici, Nb este numărul de coloane al stării, în varianta standardizată acesta fiind întotdeauna 4. Se observă din descrierea algoritmului că o anumită secvență este realizată iterativ, de un număr de Nr ori. Acest Nr depinde de lungimea cheii și este 10, 12 sau 14, pentru chei pe 128, 192, respectiv 256 biți.FIPS PUB 197, cap. 5, p. 14 Descriere generală a pașilor

se calculează cheile de iterație din cheia de cifru folosind . AES necesită cât un bloc de 128 de biți, cheia de iterație, pentru fiecare iterație, plus încă unul. Integrarea inițială a cheii de iterație: fiecare octet al stării este combinat cu un octet al cheii de iterație folosind . 9, 11 sau 13 iterații: un pas de substituție neliniar în care fiecare octet este înlocuit cu un altul conform unei . un pas de transpoziție în care ultimele trei rânduri ale stării sunt deplasate ciclic de un anumit număr de ori. o operațiune liniară de amestec care operează pe coloanele stării, combinând cei patru octeți din fiecare coloană.

Iterația finală (aducând numărul total la 10, 12 sau 14):

Pasul SubBytes thumb|right|upright=1.3|La pasul SubBytes, fiecare octet din blocul este înlocuit cu un altul, conform unui cifru cu substituție Pasul SubBytes este un cifru cu substituție, fără punct fix, denumit Rijndael S-box, care rulează independent pe fiecare octet din . Această transformare este neliniară și face astfel întreg cifrul să fie neliniar, ceea ce îi conferă un nivel sporit de securitate.

Fiecare octet este calculat astfel:

unde bi este bitul corespunzător poziției i din cadrul octetului, iar ci este bitul corespunzător poziției i din octetul ce reprezintă valoarea hexazecimală 63, sau, pe biți, 01100011.FIPS PUB 197, cap. 5.1.1, p. 15 Maparea octeților se poate reține într-un tabel, explicitat în FIPS PUB 197, în care este specificat rezultatul operației de mai sus efectuată pe fiecare din cele 256 de valori posibile reprezentabile pe un octet.FIPS PUB 197, cap. 5.1.1, p. 16

Pasul ShiftRows thumb|right|upright=1.3|Pasul ShiftRows Pasul ShiftRows operează la nivel de rând al matricii de stare . Pasul constă în simpla deplasare ciclică a octeților de pe rânduri, astfel: primul rând nu se deplasează; al doilea rând se deplasează la stânga cu o poziție; al treilea rând se deplasează la stânga cu două poziții; al patrulea se deplasează la stânga cu trei poziții.FIPS PUB 197, cap. 5.1.2, p. 17 Rezultatul acestui pas este că fiecare coloană din tabloul rezultat este compusă din octeți de pe fiecare coloană a stării inițiale. Acesta este un aspect important, din cauză că tabloul este populat inițial pe coloane, iar pașii ulteriori, inclusiv AddRoundKey în care este folosită cheia de criptare, operațiile se efectuează pe coloane. Se evită astfel criptarea independentă a coloanelor.Stallings, p. 150

Pasul MixColumns thumb|right|upright=1.3|În pasul MixColumns, fiecare coloană este înmulțită cu un polinom, notat în figură cu c(x) În acest pas, fiecare coloană a tabloului de stare este considerată un polinom de gradul 4 peste corpul Galois . Fiecare coloană, tratată ca polinom, este înmulțită, modulo cu polinomul . Operația se poate scrie ca înmulțire de matrice astfel:FIPS PUB 197, cap. 5.1.3, pp. 16-17

unde sunt elementele de pe un vector coloană rezultate în urma înmulțirii, iar sunt elementele de pe același vector înaintea aplicării pasului.

Rezultatul are proprietatea că fiecare element al său depinde de toate elementele de pe coloana stării dinaintea efectuării pasului. Combinat cu pasul ShiftRows, acest pas asigură că după câteva iterații, fiecare octet din stare depinde de fiecare octet din starea inițială (tabloul populat cu octeții mesajului în clar).Stallings, p. 154 Acești doi pași, împreună, sunt principala sursă de în algoritmul Rijndael. Coeficienții polinomului a(x) sunt toți 1, 2 și 3, din motive de performanță, criptarea fiind mai eficientă atunci când coeficienții sunt mici. La decriptare, coeficienții pasului corespunzător acestuia sunt mai mari și deci decriptarea este mai lentă decât criptarea. S-a luat această decizie pentru că unele din aplicațiile în care urma să fie folosit algoritmul implică numai criptări, și nu și decriptări, deci criptarea este folosită mai des.

Pasul AddRoundKey și planificarea cheilor thumb|right|upright=1.3|În pasul AddRoundKey, se efectuează o operație de sau exclusiv pe biți între octeții stării și cei ai cheii de rundă Pasul AddRoundKey este pasul în care este implicată cheia. El constă într-o simplă operație de „sau” exclusiv pe biți între stare și cheia de iterație (o cheie care este unică la fiecare repetare, cheie calculată pe baza cheii secrete). Operația de combinare cu cheia secretă este una extrem de simplă și rapidă, dar algoritmul rămâne complex, din cauza complexității calculului cheilor de iterație (Key Schedule), precum și a celorlalți pași ai algoritmului.Stallings, p. 155

Cheia de iterație este calculată după algoritmul următor:FIPS PUB 197, cap. 5.2, p. 20

KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk) begin word temp i = 0 while (i < Nk) w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[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 = SubWord(RotWord(temp)) xor Rcon[i/Nk] else if (Nk > 6 and i mod Nk = 4) temp = SubWord(temp) end if w[i] = w[i-Nk] xor temp i = i + 1 end while end

Acest algoritm lucrează pe cheia algoritmului, de lungime Nk cuvinte de 4 octeți (4, 6 sau 8, conform standardului), populând un tabel de cuvinte, Nb fiind numărul de cuvinte al blocului (în versiunea standardizată, 4), iar Nr numărul de runde (iterații), dependent de lungimea cheii. Algoritmul de planificare a cheilor folosește transformarea SubWord, care este o substituție a octeților identică cu cea din pasul SubBytes.FIPS PUB 197, cap. 5.2, p. 19 RotWord este o rotație ciclică la stânga cu un octet a octeților dintr-un cuvânt. Cu Rcon[i] se notează în algoritm un cuvânt format din octeții . Operația de ridicare la putere este aici cea valabilă în corpul Galois . Tabloul w conține la finalul prelucrării cuvintele de pe coloanele cheilor de rundă, în ordinea în care urmează să fie aplicate.

Optimizarea cifrului