Nume:Cipariu Tudor Horea

Nume:Danciu Ioan
Gr:223 Gr:221


Algoritmul lui RIJNDAEL


1.Introducere:

Dupa parerea expertilor in domeniu AES:Rijndael este cel mai bun algoritm de criptare.Algoritmul dezvoltat de catre Daemen si Vincent Rijmen a castigat concursul "Advanced Encryption Standard". Este un "block cipher" pe 128 de biti cu o cheie de maxim 256 de biti.In aceasta documentatie sunt prezentate bazele matematice ale algoritmului, necesare intelegerii sale. Acestea sunt urmate de designul rational si de descriere insasi. De asemenea sunt prezentate aspectele de implementare ale cifrului si ale inversului sunt urmarite.

2.Idei matematice:

Unele operatii din Rijndael sunt definite la nivel de byte, cu bytes reprezentand elemente in campul finit GF(2^8). Alte operatii sunt definite pe cuvinte reprezentate pe 4 bytes.
Campul finit GF poate fi reprezentat in mai multe modalitati insa in cazul de fata s-a ales modul polinomial de reprezentare.Un byte b scris b7,b6,b5,b4,b3,b2,b1,b0 sub forma de biti este considerat ca polinom cu coeficienti in {0,1} astfel:
b7 x7 + b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x + b0
Exemplu:
Byte-ului cu valoarea hexazecimala '47' (binar 01000111) corespunde polynomul x6 + x2 + x + 1 .
- in reprezentarea polinomiala suma a doua elemente este polinomul cu coeficienti care sunt dati de suma modulo 2 a coeficientilor celor 2 termeni;
- in reprezentarea polinomiala produsul a doua elemente corespunde produsului polinoamelor modulo un polinom binar ireductibil de grad 8 (pentru Rijndael m(x)=x^8+ x^4+ x^3+ x+1);

3.Designul rational

Cele trei criterii avute in vedere la elaborarea algoritmului Rijndael sunt:
- resistenta la toate atacurile cunoscute;
-viteza si modul compact de implementare pe foarte multe platforme
- simplicitatea designului
In marea majoritate a cazurilor de programe de criptografie transformarea de baza are Structura Feistel. In cazul acestei structuri partea principala a bitilor ale starii intermediare sunt pur si simplu transpusi neschimbati in alta pozitie. Transformarea de baza a lui Rijndael nu are Structura Feistel. Astfel transformarea de baza este compusa din trei transformari uniforme numite layers. Prin "uniform" se intelege ca fiecare bit din stare este tratat intr-un mod similar.
Diferitele alegeri pentru layers sunt pentru o mare parte bazate pe aplicabilitatea Strategiei Wide Trail o metoda de design care asigura rezistenta pentru criptanaliza liniara si diferentiala. In cazul Strategiei Wide Trail,fiecare layer are propria sa functie:
- layerul combinativ liniar : garanteaza un grad mare de difuzie in mai multe cazuri;
- layerul non-liniar : aplicatiile paralele de S-boxes care au proprietati de nonliniaritate optime
- layerul de adaugare chei : un simplu EXOR al cheii in starea intermediara Inainte de prima etapa un layer de adaugere chei este aplicat. Motivatia acestei actiuni este urmatoarea : orice layer dupa ultima adaugare de cheie in cifru (sau inainte de prima in contextul atacurilor cunoscute) poate fi simplu eliminat fara a se cunoaste cheia iar acest lucru nu este util pentru securitatea cifrului. Pentru a face cifrul si inversarea sa mai similare in structura,layerul combinativ liniar al ultimei etape este diferit fata de cazul celorlaltor etape. se poate demonstra ca acest lucru nu sporeste si nici nu reduce securitatea cifrului in nici un mod. Aceast lucru este similar cu cel de absenta a operatiei de swap in ultima etapa a DES.

4.Specificatii:

Rijndael este un algoritm de criptare bloc-iterativ cu bloc si lungime a cheii variabile. Lungimea blocului si a cheii pot fi specificate independent la 128,192 sau 256 biti.
Rezultatele intermediare ale cifrului poarta numele de stare. Aceasta poate fi desenata ca o matrice patratica de bytes. Aceasta matrice are 4 linii iar numarul de coloane este egal cu lungimea blocului impartita la 32.

a) O etapa de transformare este impartita in 4 transformari. In pseudo C avem:
Round(State,RoundKey)
{
ByteSub(State);
ShiftRow(State);
MixColumn(State);
AddRoundKey(State,RoundKey);
}

Etapa finala a cifrului este diferita :
FinalRound(State,RoundKey)
{
ByteSub(State) ;
ShiftRow(State) ;
AddRoundKey(State,RoundKey);
}

In aceasta notatie, "functiile" (Round, ByteSub, ShiftRow, …) opereaza pe tablouri (arrays) spre care pointeri (State,RoundKey) sunt prevazuti.

b)Cheile din fiecare etapa sunt derivate din cheile cifrului cu ajutorul schemelor de chei. Aceasta consta in 2 componente :
- expansiunea cheilor
- etapa de selectare a cheilor

Principiul de baza este urmatorul:
- numarul total de biti al etapei de selectare a cheilor este egal cu lungimea blocului inmultita cu numarul de etape plus 1
- cheia cifrului este transformata intr-o cheie expandata
- cheile etapelor sunt preluate din aceasta cheie expandata astfel : cheia din prima etapa consta in primele Nb cuvinte, a doua consta din urmatoarele Nb cuvinte etc. unde Nb este egal cu lungimea blocului impartita la 32.

c)Cifrul Rijndael transpus in pseudo C arata astfel :
Rijndael(State,CipherKey)
{
KeyExpansion(CipherKey,ExpandedKey) ;
AddRoundKey(State,ExpandedKey);
For( i=1 ; i<Nr ; i++ ) Round(State,ExpandedKey + Nb*i) ;
FinalRound(State,ExpandedKey + Nb*Nr);
}

Expansiunea cheii poate fi facuta dinainte iar Rijndael poate fi specificat in termenii Cheii Extinse :
Rijndael(State,ExpandedKey)
{
AddRoundKey(State,ExpandedKey);
For( i=1 ; i<Nr ; i++ ) Round(State,ExpandedKey + Nb*i) ;
FinalRound(State,ExpandedKey + Nb*Nr);
}

5.Aspecte ale implementarii:

Algoritmul Rijndael este proiectat pentru a putea fi implementat eficient pe o gama variata de procesoare si configuratii hard. Noi ne vom concentra insa asupra procesoarelor pe 8 biti tipice actualelor Smart Cards si asupra celor pe 32 biti tipice PC-urilor.

a) procesoare pe 8 biti
Pe un procesor pe 8 biti Rijndael poate fi programat prin simpla implementare a diferitelor transformari de componente. Acest lucru este deschis pentru RowShift si Round Key addition. Implementarea functiei ByteSub necesita o tabela de 256 bytes.

b) procesoare pe 32 biti
Diferitii pasi ai etapei de transformare pot fi combinati intr-un singur set de tabele permitand o implementare foarte rapida pe procesoare cu lungimea cuvantului de 32 sau mai mult. Cele mai multe operatii din expansiunea cheilor pot fi implementate prin EXOR-uri pe 32 biti. Transformarile aditionale sunt aplicatiile S-box si un shift ciclic peste 8 biti. Acesta poate fi implmentat foarte eficient.

6.Tabele de performanta:

1.1. procesoare pe 8 biti

Algoritmul Rinjdael a fost implementat in limbajul de asamblare pentru doua tipuri de microprocesoare, care sunt reprezentative pentru Smart Cards folosite in zilele noastre.
In aceste implementari, Cheile Rotunde sunt calculate intre cercurile cifrului si de aceea , cheia de program se repeta pentru fiecare executie a cifrului. Acest fapt inseamna ca nu este nevoie de timp in plus pentru a seta cheia sau pentru a schimba cheia. De asemenea, nu este nevoie de timp in plus pentru setarea algoritmului. Sunt implementate doar primele operatii ale cifrului. Eforturile depuse in implementare se alte persoane au indicat faptul ca cifrul invers se roteste cu 30% mai incet. Datorita acestui fapt este explicata in implementare.

1.1.1 Intel 8051

Rijndael a fost implementat pe procesorul Intel 8051 folosind uneltele dezvoltate de Keil Elektronik. Urmatorul tabel prezinta timpuri de executie pentru anumite lungimi de cod(1 ciclu=12 perioade de oscilare):

--------------------------------------------------------------------------------------------------
Lungimea cheii Numarul de cicluri Lungimea codului
(128,128)a) 4065 cicluri 768 byti
(128,128)b) 3744 cicluri 826 byti
(128,128)c) 3168 cicluri 1016 byti
(192,128) 4512 cicluri 1125 byti
(256,128) 5221 cicluri 1041 byti
--------------------------------------------------------------------------------------------------


1.1.2 Motorola 68HC08

Rijndael a fost implementat pe microprocesorul lui Motorola 68HC08 folosind uneltele dezvoltate de P&E Microcomputer Systems. Timpul de executie, lungimea codului si ramii necesari pentru un numar de implementari sunt date in tabelul urmator. Nu a fost asteptata nici o imbunatatire a lungimii de cod.

--------------------------------------------------------------------------------------------------
Lungimea cheii Numarul de cicluri Lungimea codului Ramii necesari
(128,128)a) 8390 cicluri 919 byti 36 byti
(192,128) 10780 cicluri 1170 byti 44 byti
(256,128) 12490 cicluri 1135 byti 52 byti
--------------------------------------------------------------------------------------------------



1.2 procesoare pe 32 biti


1.1.2 Optimizarea ANSI C

Nu este acces la calculatoarele Pentium Pro. Viteza estimata pentru aceasta platforma, la inceput, a fost generata compiland codul cu EGCS si executandu-l pe un Pentium 200 MHz, utilizand linux. Oricum, de cand acel raport a fost publicat pentru prima oara, mai multe date suplimentare au devenit disponibile si cele publicate de Brian Gladman sunt date mai jos.
Figurile AES Cd sunt pentru ANSI C folosind NIST API. Figurile raportate de Brian Gladman sunt pentru procesoarele familiei Pentium Pro si Pentium || folosind o interfata mult mai eficienta. Aceste rezultate au fost obtinute cu ajutorul compilatorului Microsoft Visual C++, care furnizeaza instructiuni de rotatie mult mai rapide. Posibilitatea de a folosi aceste instructiuni cu codul in C furnizeaza performante substantiale castigate fara a aparea probleme importante de portabilitate, din moment ce multe compilatoare C ofera in zilele noastre facilitati echivalente. Figurile de viteza date in tabele prelucrate astfel incat sa fie similare cu cele care ar aparea pe o platforma de referinta Pentium Pro 200 MHg.
Setarea algoritmului nu necesita timp. Setarea cheii si schimbarea ei necesita exact acelasi timp: timpul pentru a genera cheia extinsa din cheia cifrului. Setarea cheii pentru cifrul invers necesita mai mult timp decat setarea cheii cifrului propriu zis.
Urmatorul tabel prezinta numarul de cicluri necesare pentru cheia extinsa:

--------------------------------------------------------------------------------------------------
cicluri AES CD (ANSI C) Brian Gladman(C++)
(lg cheii) Rijndael Rijndael -1 Rijndael Rijndael -1

(128,128) 2100 2900 305 1389
(192,128) 2600 3600 277 1595
(256,128) 2800 3800 374 1960
--------------------------------------------------------------------------------------------------

Cifrul si inversul necesita exact acelasi timp. Diferenta de performanta discutata in implementare este cauzata doar de diferenta in setarea cheii. Urmatorul tabel reda figurile pentru performantele cifrului si inversului, fara a tine cont de AES API:

--------------------------------------------------------------------------------------------------
lg cheii AES CD(ANSI C) Brian Galdman(C++)
viteza(Mbiti/sec) cicluri viteza(Mbiti/sec) cicluri
(128,128) 27.0 590 70.5 363
(192,128) 22.8 1125 59.3 432
(256,128) 19.8 1295 51.2 500
--------------------------------------------------------------------------------------------------

A fost acceptata cu recunostinta generoasa oferta din partea Cryptix de a produce implementarea in Java. Oricum, Cryptix nu ofera nici o figura de performanta. Estimarile noastre sunt bazate pe timpul de executie al codului KAT si MCT pe un Pentium 200 MHg, ruland sub Linux. A fost folosit compilatorul JDK1.1.1 Java. Tabelul urmator reda performantele implementarii in Java(nu se pot da estimari pentru setarea cheii sau a algoritmului):

--------------------------------------------------------------------------------------------------
lungime cheie viteza cicluri pt Rijndael
(128,128) 1100 Kbit/s 23.0 Kcicluri
(192,128) 930 Kbit/s 27.6 Kcicluri
(256,128) 790 Kbit/s 32.3 Kcicluri
--------------------------------------------------------------------------------------------------


7.Motivatia alegerii designului:

1.polinomul de inmultire m(x)
Polinomul m(x) (‘11B’) pentru inmultire in GF(2^8) este primul din lista polinoamelor ireductibile de gradul 8

2.S-box pentru ByteSub
Criteriul designului pentru S-box este inspirat de criptanaliza liniara si diferentiala pe de o parte si atacurile care folosesc manipulari algebrice pe de alta parte :
- inversabilitate
- minimizarea marii corelari intre combinatiile liniare de input si de output
- minimizarea marii valori in tabela EXOR
- complexitatea expresiei sale algebrice in GF
- simplicitatea descrierii

3.transformarea MixColumn
MixColumn a fost aleasa din spatiul transformarilor de 4 pe 4 bytes in conformitate cu urmatoarele criterii:
- inversabilitate
- liniaritate in GF
- putere mare de difuzie
- viteza pe procesoarele pe 8 biti
- simetrie
- simplicitate a descrierii

4.offseturile ShiftRow
Alegerea din toate combinatiile posibile a fost facuta dupa urmatoarele criterii:
- cele 4 offseturi sunt diferite si C0=0
- rezistenta impotriva atacurilor care folosesc diferentiale trunchiate
- rezistenta impotriva atacurilor patratice
- simplicitate

5.expansiunea cheilor
Expansiunea cheilor specifica derivarea din Round Keys in termenii Cipher Key. Functia sa este aceea de a asigura resistenta impotriva urmatoarelor atacuri:
- atacul in partea lui Cipher Key cunoscuta criptanalistului
- atacul in care Cipher Key este cunoscuta sau poate fi aleasa
- atacurile referitoare la chei (nu trebuie sa existe 2 Cipher Keys care sa aiba in comun o mare parte de Round Keys)

8.Securitatea:

In aceasta parte, prezentam scopurile de securitate setate pentru Rijndael. Un atac criptanalitic va fi considerat cu succes de designeri daca se demonstreaza ca un astfel de scop de securitate descrisa mai jos nu rezista.

2.1 Definitia conceptului de securitate

Pentru a formula scopurile noastre, este nevoie sa definim mai intai cateva concepte relative la securitate.

2.1.1 Setul posibil de cifruri pentru o lungime de cheie data

Daca lungimea blocului este v, atunci cifrul va genera V=2k intrari. Daca lungimea cheii este u, atunci ea defineste un set de U=2k permutari peste (0,1).

2.1.2 K-Securitate

Definitie: Un bloc de cifru este K-sigur daca toate strategiile posibile de atac pentru acesta au acelasi factor asteptat de munca si aceleasi necesitati de stocare ca pentru majoritatea blocurilor de cifr cu aceeasi dimensiune. Acesta trebuie sa fie cazul pentru toate posibilele modele de acces pentru adversari si pentru orice cheie prioritara de distributie. K-securitate este o foarte importanta notiune de securitate. Se poate observa foarte usor ca, daca una dintre urmatoarele slabiciuni apar la un cifru, nu se mai poate numi k-sigur :
- existenta atacurilor cheilor recuperate mai rapid decat o cautare minutioasa;
- proprietati sigure de simetrie in circuite(ex. proprietatea de complementaritate);
- neglijarea claselor ne-neglijabile ale cheilor slabe(ca si in IDEA);
- atacurile cheilor relative;
K-securitatea este in esenta o masura relativa. Este foarte posibil sa se poata construi un bloc cifru k-sigur cu blocuri si lungimi de chei de 5 biti. Lipsa de securitate oferita de o asemenea schema este datorita dimensiunii sale mici, nu datorita faptului ca schema esueaza sa prinda cerintele impuse de aceste dimensiuni. Este foarte clar faptul cu cat este mai lunga cheia, cu atat securitatea cere conditii mai inalte.


2.1.3 Cifruri ermetice

Este posibil de imaginat cifruri care sigur au anumite slabiciuni si totusi sa fie k-sigure. Un exemplu de o asemenea slabiciune ar putea fi un bloc cifru cu o lungime de bloc mai mare decat lungimea de cheie si o singura cheie slaba, pentru care circuitul cifrului este liniar. Detectarea folosirii cheii ar lua cel putin cateva criptari, iar daca s-ar verifica folosirea cheii ar lua doar o singura criptare.
Daca acest cifru ar fi folosit pentru el insusi, aceasta singura cheie slaba nu ar pune nici o problema. Pe de alta parte, daca ar fi folosit ca si o componenta intr-o schema mai larga, de exemplu functia de compresie in functia hash, aceasta proprietate ar putea introduce poarta, cale care sa genereze coliziuni puternice. Pentru acest motiv, vom introduce un nou concept de securitate, denumit sub termenul ermetic.
Definitie: Un bloc cifru este ermetic daca nu are slabiciuni care sa nu fie prezente pentru majoritatea blocurilor cifru cu acelasi bloc sau aceeasi lungime a cheii.Informal, un bloc cifru este ermetic daca structura sa interna nu poate fi exploatata in orice alta aplicatie.
Pentru toate lungimile de chei si de blocuri definite, intrebarile legate de securitate sunt daca cifrul Rijndael este:
- k-sigur;
- ermetic;
Daca Rijndael supravietuieste dupa intrebarile proprii, forta impotriva oricarui atac, cunoscut sau necunoscut, este la fel de asteptat ca de la un bloc cifru cu dimensiunile date.

9.Avantaje si limitari:

3.1 Avantaje

Aspecte legate de implementare:
- Rijndael poate fi implementat sa ruleze la viteze mult prea mari pentru un bloc cifru pe un Pentium Pro. Este o corelatie intre tabelele marime / performante;
- Rijndael poate fi implementat pe Smart Card intr-o mica cantitate de cod, folosind o mica cantitate de RAM si luand un mic numar de cicluri. Este o oarecare corelatie ROM / performante;
- transformarea rotunda este paralela prin design, un important avantaj pentru viitoarele procesoare si hard-urile dedicate;
- din moment ce cifrul nu efectueaza operatii aritmetice, arhitectura procesorului nu are inclinatie catre mic-mare indian;
Simplitatea disignului:
- cifrul are suport propriu in totalitate. Nu utilizeaza nici o alta componenta de criptare;
- cifrul nu isi bazeaza propria securitate, sau o parte din ea, pe obscuritate si pe interactiuni intre operatii aritmetice, nu foarte bine intelese;
- designul bine structurat al cifrului nu lasa loc pentru eventuale capcane ascunse;
Lungimea de bloc variabila:
- designul permite specificarea variantei cu lungimea de bloc si de cheie, impreuna, pe o raza de la 128 la 256 biti in pasi de 32 biti;
- desi numarul cercurilor Rijndael este fixat in specificare, poate modificat ca si un parametru in caz de probleme de securitate;

3.2 Limitari

Limitarile cifrului au legatura cu inversul sau:
- cifrul invers este mai putin potrivit sa fie implementat pe Smart Card decat cifrul insusi: necesita mai mult cod si mai multe cicluri (totusi, in comparatie cu alte cifruri, chiar si inversul este foarte rapid);
- in soft, cifrul si inversul sau folosesc coduri si / sau tabele diferite;
- in hard, cifrul invers poate doar partial sa refoloseasca circuitele care implementeaza cifrul;

10.Alte functionalitati:

In aceasta sectiune, vom mentiona cateva functii care pot fi executate cu blocul cifru Rijndael, altele decat criptarea.

4.1 MAC

Rijndael poate fi folosit ca si un algoritm MAC, folosindu-l ca si bloc cifru in algoritmul CBC-MAC.

4.2 Functiile hash

Rijndael poate fi folosit ca si o functie hash repetata, folosindu-l ca si o functie cerc. Aici este o posibila de implementare. Este recomandat sa se foloseasca o lungime de bloc si de cheie ambele egale cu 256 biti. Variabila lant va trece in "input" si mesajul de bloc trece in "cheia cifrului". Noua valoare a variabilei lant este data de vechea valoare EXORed impreuna cu iesirea cifrului.

4.3 Generatorul de numere pseudoaleatoare(PRNG)

Sunt mai multe metode in care Rijndael poate fi folosit sa formeze PRNG care satisface liniileghid, care sunt date pentru designul PRNG. Vom da un exemplu in care este folosit Rijndael cu o lungime de bloc de 256 si o lungime de cheie tot de 256.
Exista trei operatii:
Reset:
- cheia cifrului si starea sunt resetate la 0;
Samantarea:
- "bitii samanta" sunt colectati avand grija ca totalul lor sa aiba un minim de entropie. Ei sunt operati cu zerouri pana cand stringul rezultat are lungime multiplu de 256;
- o noua cheie de cifru este calculata criptand cu Rijndael un bloc de biti samanta folosind cheia cifru curenta. Aceasta este aplicata recursiv pana cand blocurile samanta sunt evacuate;
- starea este actualizata aplicand Rijndael, folosind noua cheie cifru;
Generarea numerelor pseudoaleatoare:
- starea este actualizata aplicand Rijndael, folosind noua cheie cifru. Primii 128 biti ai starii ies ca si numar pseudoaleator. Acest pas poate fi repetat de foarte multe ori.
Prin toate acestea AES:Rijndael este unul dintre cele mai puternic algoritm de cripatre .