Criptarea i securitatea Informaiei AES Advanced Encryption Standard

  • Slides: 28
Download presentation
Criptarea şi securitatea Informaţiei AES (Advanced Encryption Standard)

Criptarea şi securitatea Informaţiei AES (Advanced Encryption Standard)

1. Motivaţia unui nou standard • Standardul actual: DES (Data Encryption Standard) Avantaje DES:

1. Motivaţia unui nou standard • Standardul actual: DES (Data Encryption Standard) Avantaje DES: –este algoritmul folosit în majoritatea aplicaţiilor de criptografie actuale: –comunicaţii guvernamentale –comunicaţii ale sateliţilor civili –sistemul de parole ale calculatoarelor, etc. –există implementări pentru aproape toate sistemele software/hardware: pentru orice microcontroler ce are şi un compilator C/C++, pentru PC (indiferent de sistemul de operare), pentru circuite digitale (FPGA / ASIC)

1. Motivaţia unui nou standard Dezavantaje DES: – implementările software sunt relativ lente deoarece

1. Motivaţia unui nou standard Dezavantaje DES: – implementările software sunt relativ lente deoarece a fost proiectat în special pentru implementări digitale (FPGA, ASIC, Smart Card) – lungimea cheii este inadecvată aplicaţiilor software (56 de biţi) –suspiciunile existenţei unei chei universale de decriptare rezultate din modul de publicare al algoritmului, fără nici un fel de explicaţii matematice, au fost aproape confirmate de NBS (National Bureau of Standards ) –Există cel puţin 3 tentative reuşite de “spargere”: • una dintre ele foloseşte o reţea de 100. 000 de calculatoare legate în reţea, decriptarea durează 24 de ore • dispozitivul de 250. 000$ special construită de EFF (Electronic Frontier Foundation ) care poate decripta orice mesaj în maximum 56 de ore

2. AES, Cerinţe iniţiale Pentru a putea fi un înlocuitor de succes al DES-ului,

2. AES, Cerinţe iniţiale Pentru a putea fi un înlocuitor de succes al DES-ului, noul AES trebuie să îndeplinească o serie de condiţii: • securitate sporită • un design cât mai simplu, care, contrar părerii generale, trebuie să fie uşor de criptanalizat pentru a putea găsi şi remedia cât mai rapid eventualele “găuri” de securitate • performanţă sporită (atât software cât şi hardware) În 1998, NIST (National Institute of Standards and Technology ) a definitivat cerinţete pentru algoritmii candidaţi: - să fie un algoritm cu cheie privată - să fie un algoritm ce criptează blocuri de date (block chiper) - blocurile de date să fie de 128 biţi - lungimea cheilor folosite să fie variabilă (128, 192 şi 256 biţi) - să nu fie patentat !!!

3. AES, Candidaţii Imediat după publicarea specificaţiilor, NIST a primit 21 de cereri din

3. AES, Candidaţii Imediat după publicarea specificaţiilor, NIST a primit 21 de cereri din partea diverselor organizaţii din care au fost selectate 15. Timp de un an au fost aşteptate şi studiate reacţiile comunităţii criptanaliştilor referitoare la cele 15 propuneri selectate. În august 1999, NIST a anunţat algoritmii finalişti: Algoritmul MARS Organizaţia/ Compania IBM Avantajul principal Securitate sporită RC 6 RSA Laboratories Foarte simplu Rijndael Joan Daemen, Vincent Rijmen, Ross Anderson, Eli Biham Design simplu Bruce Schneier Performanţă rezonabilă Serpent Twofish Foarte sigur Dezavantajul principal Implementare complexă Securitate slabă Număr de runde insuficient Design complex, performanţă scăzută Design complex

4. AES, Evaluarea finală a avut loc la o conferinţă organizată de NIST în

4. AES, Evaluarea finală a avut loc la o conferinţă organizată de NIST în New York ce a avut următoarele secţiuni: 1. 2. 3. 4. 5. 6. 7. 8. Evaluări FPGA Evaluări din punctul de vedere al platformei utilizate Comparaţii (ale implementărilor în limbaj de asamblare, C/C++ şi Java) Criptanaliză II Discuţii despre combinarea algoritmilor candidaţi în cel final Evaluări ASIC (testări individuale) Prezentările autorilor (pentru fiecare algoritm candidat)

4. AES, Evaluarea finală Alegerea finală algoritmului a luat în considerare următorul tabel: MARS

4. AES, Evaluarea finală Alegerea finală algoritmului a luat în considerare următorul tabel: MARS RC 6 Rijndael Serpent Twofish Securitate generală Implementare 3 2 2 3 3 1 1 3 3 2 Performanţă software 2 2 3 1 1 Performanţă pentru Smart. Card-uri Performanţă hardware (FPGA/ ASIC) 1 1 3 3 2 1 2 3 3 2 Caracteristici de design 2 1 3 Total 10 9 16 14 13

5. AES, Consideraţii ale evaluării finale Luând în considerare tabelul precedent, se pot face

5. AES, Consideraţii ale evaluării finale Luând în considerare tabelul precedent, se pot face următoarele observaţii: 1. 2. 3. 4. 5. După punctaj, au existat 3 finalişti apropiati: Rijndael, Serpent, Twofish Rijndael a avut punctaj maxim la 4 din 6 criterii Serpent a avut punctaj maxim la 4 din 6 criterii Twofish a avut punctaj maxim la 2 din 6 criterii La secţiunea performanţă software, ce a departajat câştigătorul, Rijndael a primit 3 puncte, iar Serpent şi Twofish doar câte unul Câştigător a fost algoritmul Rijndael ce va fi referit ulterior ca şi Algoritmul AES.

6. Descrierea algoritmului AES (Rijndael) Generalităţi: • • A fost proiectat de Vincent Rijmen

6. Descrierea algoritmului AES (Rijndael) Generalităţi: • • A fost proiectat de Vincent Rijmen şi Joan Daemen Publicat în 1998 Urmaş al algoritmilor Square şi Shark Dimensiunea blocului: 128 biţi Dimensiunea cheilor: 128, 192 şi 256 biţi Număr de runde: 10, 12 respectiv 16 (funcţie de lungimea cheii) Criptanaliză: – conform studiilor un atac de securitate asupra cheilor de 256 biţi trebuie să ruleze 9 runde – un atac asupra mesajului criptat are nevoie să ruleze 7 runde pentru blocuri de 128 biţi şi 8 runde pentru blocuri de 192 şi 256 biţi

6. Descrierea algoritmului AES (Rijndael) • • AES operează cu matrici de 4 x

6. Descrierea algoritmului AES (Rijndael) • • AES operează cu matrici de 4 x 4 octeţi. Pentru criptare, fiecare rundă AES execută următorii paşi: 1. 2. 3. 4. Sub. Bytes() – substituţie în care fiecare octet este înlocuit cu un altul cu ajutorul unei “look-up table” Shift. Rows() – transpoziţie ciclică cu un anumit număr de paşi Mix. Columns – o operaţie de amestec ce foloseşte o funcţie polinomială Add. Key. Round() – fiecare octet este combinat cu o cheie specifică rundei, ce a fost în prealabil calculată din cheia iniţială

Byte. Sub() Shift. Row() Mix. Column() Add. Round. Key() AES – Diagramă 3 D

Byte. Sub() Shift. Row() Mix. Column() Add. Round. Key() AES – Diagramă 3 D

AES – Diagramă 2 D Byte. Sub() Shift. Row() Mix. Column() Add. Round. Key()

AES – Diagramă 2 D Byte. Sub() Shift. Row() Mix. Column() Add. Round. Key()

Fiecare rundă generică este alcătuită din 4 funcţii: Round(State, Round. Key) Byte. Sub(State) Shift.

Fiecare rundă generică este alcătuită din 4 funcţii: Round(State, Round. Key) Byte. Sub(State) Shift. Row(State) Mix. Column(State) Add. Round. Key(State) Runda finală este alcătuită din: Final. Round(State, Round. Key) Byte. Sub(State) Shift. Row(State) Add. Round. Key(State) AES - Runde

Reprezentare grafică: AES – Sub. Bytes() Exemplu de funcţie: function Sub. Bytes(state, Sbox) {

Reprezentare grafică: AES – Sub. Bytes() Exemplu de funcţie: function Sub. Bytes(state, Sbox) { var i; for( i=0; i<16; i++ ) state[i] = Sbox[ state[i] ]; return state; } Sub. Bytes – fiecare octet al starii este inlocuit cu casuta sa dintr-un tabel fix de 8 -biţi, S-cutia lui Rijndael. Aceasta operatie da neliniaritatea cifrului.

AES – Sub. Bytes() 1. Substituţiile AES folosesc matrici de tip S-Box neliniare. 2.

AES – Sub. Bytes() 1. Substituţiile AES folosesc matrici de tip S-Box neliniare. 2. Se va scrie un număr A ca două numere hexazecimale r şi c şi se va întoarce S(r, c). 3. S-cutia este derivata din inversul multiplicativ peste un corp Galois , cu bune proprietati neliniare. 4. Pentru a evita atacuri bazate pe proprietati algebrice simple, S-cutia este construita combinand functia inversa cu o transformare afina inversabila 5. S-cutia este aleasa sa nu aiba puncte fixe sau opuse fixe. : ) 6. Sub. Bytes() efectuează o transformare afină asupra inversului octetului b şi o sumează cu 0 x. C 6:

AES – Sub. Bytes() Reprezentare grafică:

AES – Sub. Bytes() Reprezentare grafică:

AES – Sub. Bytes() Reprezentare grafică:

AES – Sub. Bytes() Reprezentare grafică:

AES – Sub. Bytes()

AES – Sub. Bytes()

AES – Shift. Rows() Reprezentare grafică: 1. 2. 3. 4. Octetii din fiecare rand

AES – Shift. Rows() Reprezentare grafică: 1. 2. 3. 4. Octetii din fiecare rand al starii sunt siftati ciclic spre stanga cu un anumit offset. Primul rand este intotdeauna neatins la AES. Fiecare octet al celui de-al doilea rand: 1 la stanga. Similar, randurile 3 si 4: offset-uri de 2 si 3. In acest mod fiecare coloana a starii de intrare este compusa din octeti ai fiecarei coloane a starii de intrare

AES – Mix. Columns() Reprezentare grafică:

AES – Mix. Columns() Reprezentare grafică:

AES – Mix. Columns() Mix. Columns: 1. Cei 4 octeti ai fiecarei coloane a

AES – Mix. Columns() Mix. Columns: 1. Cei 4 octeti ai fiecarei coloane a starii sunt combinaţi folosind o transformare liniara inversabila. 2. Functia ia 4 octeti la intrare si livreaza 4 octeti, fiecare octet de intrare afectand toti cei 4 octeti de iesire. 3. Impreuna cu Shift. Rows, Mix. Columns da difuzie in cifru. 4. Fiecare coloana este tratata ca un polinom peste corpul Galois si apoi multiplicata modulo x 4+1 cu un polinom fix c(x) = 3 x 3 + x 2 + x + 2.

AES – Mix. Columns() Mix. Columns, sub formă matriceală: Sau: b 0 = 0

AES – Mix. Columns() Mix. Columns, sub formă matriceală: Sau: b 0 = 0 x 02*a 0 + 0 x 03*a 1 + a 2 + a 3 (notată a'0) b 1 = a 0 + 0 x 02*a 1 + 0 x 03*a 2 + a 3. etc, Unde + este operaţia XOR

AES – Mix. Columns() - Înmulţirea!!!

AES – Mix. Columns() - Înmulţirea!!!

AES – Mix. Columns() Inv. Mix. Columns, sub formă matriceală:

AES – Mix. Columns() Inv. Mix. Columns, sub formă matriceală:

AES – Add. Round. Key() Reprezentare grafică: In pasul Add. Round. Key, se efectueaza

AES – Add. Round. Key() Reprezentare grafică: In pasul Add. Round. Key, se efectueaza o operatie XOR pe biti intre octetii starii si cei ai cheii de runda. Cheia de runda este o cheie unica pentru fiecare iteratie, calculata pe baza cheii secrete.

Exerciţii Urmaţi paşii Sub. Bytes, Shift. Rows şi Mix. Columns pentru: La pasul Mix.

Exerciţii Urmaţi paşii Sub. Bytes, Shift. Rows şi Mix. Columns pentru: La pasul Mix. Columns se va considera inmultirea ca fiind rotire la stinga cu numărul respectiv de biţi !!! Pentru cei al caror nume de familie incepe cu A, B, C, D, E, F, G sau H: A 7 08 25 57 89 85 30 89 73 25 11 32 87 05 74 B 5 2. Pentru cei al caror nume de familie incepe cu I, J, K, L, M, N, O sau P: C 9 08 59 04 46 08 63 14 99 64 85 22 49 22 61 D 6 3. Pentru cei al caror nume de familie incepe cu Q, R, S, T, U, V, W, X, Y sau Z: E 5 26 42 08 79 07 86 61 50 65 30 59 75 73 85 F 8

 public static string AESEncrypt(string original. String) { if (String. Is. Null. Or. Empty(original.

public static string AESEncrypt(string original. String) { if (String. Is. Null. Or. Empty(original. String)) { throw new Argument. Null. Exception ("The string which needs to be encrypted can not be null. "); } //Crearea unei instante a clasei Rijndael (criptare/decriptare AES) Rijndael Aes. Encryptor = Rijndael. Create(); Exemplu de folosire a algoritmului AES in C# //Alegerea unei parole de lungime 128 biti (16 caractere ASCII) String password = "Cheie. De. Lungime 16"; Aes. Encryptor. Key = System. Text. Encoding. Default. Get. Bytes(password); Aes. Encryptor. IV = System. Text. Encoding. Default. Get. Bytes(password); //Crearea unei instante a clasei Memory. Stream //folosita pentru a trimite datele de criptat Memory. Stream ms = new Memory. Stream(); //Crearea unei instante a clasei Crypto. Stream //folosita pentru criptarea p-zisa Crypto. Stream cs = new Crypto. Stream(ms, Aes. Encryptor. Create. Encryptor(), Crypto. Stream. Mode. Write); //Obtinerea octetilor din sirul de intrare //deoarece se cripteaza la nivel de sir de octeti si nu instante ale clasei String byte[] buffer. De. Criptat = System. Text. Encoding. Default. Get. Bytes(original. String); //Trimiterea octetilor pentru a fi criptati cs. Write(buffer. De. Criptat, 0, buffer. De. Criptat. Length); //Inchiderea criptarii //(efect colateral -> adaugarea de octeti astfel incat numarul lor sa fie multiplu de 16) cs. Close(); //Obtinerea octetilor din Ciphertext byte[] encrypted. Data = ms. To. Array(); //Intoarcerea sub forma de string //S-a folosit To. Base 64 String() deoarece pot exista si caractere ASCII invalide (ce nu pot fi afisate) return Convert. To. Base 64 String(encrypted. Data, 0, encrypted. Data. Length); }