Sunteți pe pagina 1din 36

Algoritmi moderni de criptare

Criptografia modernă:
- utilizează în principiu aceiași algoritmi ca și criptografia clasică, (bazați pe operații de tip substituții și
transpoziții), combinați cu metode matematice bazate pe curbe eliptice, teoria haosului, mecanica
cuantică, etc.
- accentul cade pe complexitatea crescută a algoritmilor de criptare:
- rezistenți la atacuri criptografice
- implementați pe o structură de calcul foarte puternică
-îndeplinesc obiectivele criptografice: - confidențialitate
- integritatea datelor,
- autentificarea entităților sau a originii datelor

Criptografia simetrică folosește aceeași cheie pentru procesele de criptare și decriptare; această cheie
este denumită „secretă” - este cunoscută numai de expeditor și de destinatar.

Criptosisteme moderne cu chei simetrice: - cu cifruri bloc (block ciphers)


- cu cifruri secvențiale (stream ciphers)

Cifruri secvențiale – criptează fluxuri de date: textul clar este considerat ca o succesiune continuă de
simboluri, iar criptarea operează cu unități mai mici de date, de obicei la nivel de bit, prin operații de tip
SAU exclusiv (XOR).
Algoritmii de criptare secvențiali se împart în două categorii:
- Algoritmi de criptare sincroni: funcția de generare a cheii de criptare (”keystream” – secvența de biți
de criptare) este independentă de textul clar sau de textul criptat;
- Algoritmi de criptare asincroni (cifru secvențial auto-sincronizat): funcția de generare a cheii de
criptare utilizează un număr de biți din textul criptat anterior.

Cifruri bloc: - criptează blocuri de date: textul clar este împărțit în blocuri de biți (lungimi tipice 32-
128), blocurile fiind procesate individual prin operații elementare de tip substituții și transpoziții.
Criptarea unui bit din textul clar este dependentă de biții din textul clar care aparțin aceluiași bloc.

Două tipuri de cifruri bloc: - rețele Feistel (Ex: cifrul DES)


- rețele de substituție-permutare (Ex. cifrul AES)

1
Sistemul de criptare DES (Data Encription Standard)

La sfârșitul anilor 1960, odată cu utilizarea amplă a calculatoarelor în industrie, economie,


transporturi, etc., tot mai mulți utilizatori neguvernamentali au reclamat nevoia unui standard de criptare
rapid și sigur, care să fie implementat la scară largă pe computere, a.î. să permită protecția datelor în
timpul transmiterii acestora sau atunci când sunt stocate digital.
DES a fost selectat de Biroul Național de Standarde ca un standard oficial de prelucrare a
informațiilor (Federal Information Processing Standard - FIPS) pentru Statele Unite în 1976, pentru a
deveni efectiv în iulie 1977. În 1981, American National Standards Institute (ANSI) a adoptat DES ca
standard de criptare în sectorul privat. A devenit cunoscut sub numele de DEA sau ANSI X3.92.
Algoritmul de criptare/decriptare implementat în DES îndeplinea criteriile solicitate de FIPS:
- algoritmul trebuie să ofere un nivel de securitate înalt.
- detaliile algoritmului trebuie descrise într-un limbaj ușor de înțeles.
- securitatea algoritmului trebuie să fie asigurată de cheie, nu de păstrarea secretă a algoritmului.
- detaliile algoritmului trebuie să fie accesibile publicului, astfel încât oricine să-l poată implementa în
implementări software sau hardware.
- algoritmul trebuie să fie adaptabil pentru utilizare în diverse aplicații.
- implementările hardware ale algoritmului trebuie să fie practice (nu prohibitiv de scumpe sau extrem
de lente).
- algoritmul trebuie să fie eficient în utilizare (rapid și cu cerințe rezonabile de memorie).
- algoritmul să poată fi testat și validat în condiții reale.
- algoritmul să poată fi exportabil.
Algoritmul utilizează operațiile de substituție (utilizate în criptările de substituție mono- și
polialfabetice) și transpoziție (utilizate în transpozițiile pe coloane) implementate digital. Astfel,
caracterele textului clar sunt înlocuite prin grupuri de biți, utilizând în acest scop codul ASCII
(”American Standard Code for Information Interchange”), o codificare non-secretă pe 7 biți dezvoltată
în anii '60. Cu o reprezentare pe 7 biți ( ce oferă 27 = 128 posibilități de reprezentare ) prin codul ASCII
se pot reprezenta atât litere mari și mici, cât și cifre, semne de punctuație și alte simboluri.
Obs: de obicei, un bit suplimentar este atașat la începutul unei reprezentări ASCII pentru a obține o
reprezentare pe 8 biți. Uneori, acest bit este utilizat pentru verificarea erorilor, alteori permite
caracterelor să fie afișate într-un mod special, iar alteori este setat la zero.

Proiectarea DES are la bază două concepte generale: - Cifru produs


- Rețea Feistel.

►substituția implementată digital: S-box


Un S-box (casetă de substituție) acceptă un număr de biți la intrare și generează un număr de biți la ieșire
(nu neapărat egal cu numărul de biți de intrare), folosind o funcție de prelucrare simplă sau un tabel de
corespondență.
2
Intrările sunt de obicei numerotate de la 0 la 2b-1, unde b este dimensiunea de intrare (în biți).

De exemplu, o reprezentare a unei casete de substituție cu dimensiunea de 3 biți, cu intrările numerotate


de la 1 la 7 (23 -1):
S[0] = 2 S[3] = 6 S[6] = 1
S[1] = 4 S[4] = 3 S[7] = 0
S[2] = 5 S[5] = 7
De asemenea, reprezentarea casetei se poate face numai prin specificarea ieșirilor. De exemplu, dacă
intrările sunt numerotate implicit de la 0 la 7, se specifică ieșirile în forma:
S = [2, 4, 5, 6, 3, 7, 1, 0]

Funcția de prelucrare poate să descrie o operație simplă, de exemplu fie un S-box cu o dimensiune de
intrare de 4 biți ce descrie pentru un bit x, operația 4-x mod 16. Ieșirile vor fi:
S = [4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5]

►transpoziția implementată digital: P-box


Un P-box (casetă de permutare) oferă o funcționalitate similară transpozițiilor în criptografia clasică.
Scopul este de a permuta biții de intrare, fără a-i schimba; practic, realizează o mapare a fiecărui bit de
intrare la o altă poziție de ieșire.
Există și permutări expansive și selective (în sistemul de criptare DES), unde nu se mai realizează o
mapare 1-la-1: numărul de biți de ieșire este mai mare (unii biți sunt copiați) sau mai mic (unii biți sunt
eliminați).
O reprezentare a unei casete de permutare cu dimensiunea de 8 biți, se poate face:
- prin specificarea ieșirilor:
P = [2, 4, 5, 6, 3, 7, 1, 0], ceea ce înseamnă că: P[0] = 2 P[3] = 6 P[6] = 1
P[1] = 4 P[4] = 3 P[7] = 0
P[2] = 5 P[5] = 7
- grafic:
7 6 5 4 3 2 1 0

7 6 5 4 3 2 1 0

3
Obs:
1) O casetă de permutare P-box pe k biți poate fi reprezentată ca o listă de k numere, dar este nevoie de
2k numere pentru reprezentarea unei casete de substituție S-box pe k biți.
2) Aceste structuri nu sunt utilizate separat, ele intră în componența cifrurilor produs, pentru a genera
structuri complicate.

Definiții:
- Cifrul produs - un tip de criptare care constă din mai multe operații efectuate în secvențe și bucle.
Operațiunile utilizate sunt : substituții, permutări, operații aritmetice, transformări liniare, înmulțire
modulară, etc.
Ideea de bază a unui cifru produs este de a construi o funcție de criptare complexă prin compunerea mai
multor operații simple. Aceste operații nu generează fiecare în parte un nivel de securitate foarte ridicat,
dar, prin combinare, oferă protecție complementară.
- Rețea de substituție-permutare (SP) este o cifru produs compus dintr-un număr de etape (de runde),
fiecare etapă implicând numai substituții și permutări. Practic, o rețea SP leagă ieșirea uneia sau a mai
multor casete S cu una sau mai multe casete P sau invers: deci biții de ieșire dintr-una sau mai multe
casete S-box sunt trecuți printr-o permutare P sau invers.

Rețea de substituție-permutare (SP)

Utilizarea unui cifru produs cu o combinație de casete S și P-box permite obținerea intrărilor din
ieșirile sistemului de criptare, dar este nevoie de un mod de adăugare a unei chei în sistemul de criptare,
astfel încât numai părțile implicate în comunicare să poată cripta și decripta mesajele.
Cel mai simplu mod de integrare a cheii de criptare este o funcție care va genera un set de biți,
printr-un proces de derivare a cheii (”key-schedule”): pornind de la o cheie de intrare (cheie master),
biții derivați din cheia de criptare vor fi integrați în sistem prin operații de tip XOR cu biții intermediari
ai criptării (de exemplu, biții de ieșire din casetele S-box), într-un set de runde de operații identice.

4
Rețea SP cu o singură rundă

Structura rețelei SP cu 4 runde

- Cifru iterativ pe bloc este un cifru bloc care implică repetarea secvențială a unei funcții interne
numită Funcția rundei de criptare.
Parametrii includ numărul de runde/iterații, r, dimensiunea în biți a blocului, n și dimensiunea în biți, k,
a cheii de intrare K.
Cheia de criptare K este un număr pseudo-aleator, obținut cu un generator de numere pseudo-aleatoare.
În plus, pentru fiecare cifru iterativ pe bloc există un algoritm de derivare a cheii de intrare. Prin procesul
de derivare a cheii de intrare K (key schedule) se obține o sub-cheie Ki pentru fiecare iterație.
Procesul de derivare e de obicei simplu și constă în interschimbarea biților sub-cheii curente, a.î. la
fiecare rundă se va obține o cheie de rundă diferită față de cea de la runda anterioară.

5
Expeditorul textului clar și destinatarul textului criptat folosesc aceeași cheie de intrare și același proces
de derivare a cheii, deci vor genera aceleași chei de rundă.
- Cifru (sau rețea) Feistel : este un cifru iterativ pe bloc care mapează un text clar (L0,R0) de 2t
biți, format din blocurile L0 si R0 de câte t biți, într-un text criptat (Rr,Lr), printr-un proces ciclic de r
runde, unde r ≥ 1.

Pentru 1 ≤ i ≤ r, runda i mapează (Li-1,Ri-1) 


Ki
(Li,Ri) astfel: Li = Ri-1, Ri = Li-1  f (Ri-1,Ki),
unde fiecare sub-cheie Ki este derivată din cheia de criptare K.

O rundă în rețeaua Feistel

Algoritmul de criptare Feistel (r runde și funcția de rundă f):


1) Se împarte textul clar P în două jumătăți: partea din stânga (L0) conține biții din stânga (cei mai
semnificativi), iar partea din dreapta (Rr) conține biții din dreapta (cei mai puțin semnificativi).
2) Pentru fiecare rundă i = 1, ..., r:
//se aplică operația XOR între partea din stânga anterior determinată și funcția de rundă , care are ca
parametru de intrare blocul drept anterior determinat şi cheia de rundă curentă
- se calculează Ri = Li-1  f (Ri-1,Ki)
- se calculează Li = Ri-1
3) Algoritmul se termină după un număr r de runde, iar textul criptat C se obține din concatenarea celor
două jumătăți Lr și Rr.

De exemplu, pentru o rețea cu 3 runde, se pleacă de la L0 și R0 și se obțin progresiv:


R1 = L0  f (R0,K1) R2 = L1  f (R1,K2) R3 = L2  f (R2,K3)
L1 = R0 L2 = R1 L3 = R2

La decriptare: în urma procesului de criptare s-a obținut R3 și L3. Dar se cunoaște și R2, deoarece L3 =
R2.
6
Destinatarul va realiza decriptarea, cunoscând cheia de intrare K și sub-cheile Ki obținute prin procesul
de derivare. Deci poate calcula f (R2,K3).
Cf. proprietăților operației :
Fie c = a  b ⟹a= cb
dar c = c  b  b = (c  b)  b
Dar R3 = L2  f (R2,K3) și conform proprietății de mai sus ⟹ L2 = R3  f (R2,K3)
Deci s-a obținut textul criptat (intermediar) de la runda anterioară, L2 și R2.
Se continuă analog și se decriptează succesiv până la obținerea textului clar (R0,L0).

Generalizare: Algoritmul de decriptare Feistel (r runde, sub-cheile K1, K2, ... Kr și funcția de rundă
f):
1) Se împarte textul criptat C în două jumătăți: partea din stânga (Lr) conține biții din stânga (cei mai
semnificativi), iar partea din dreapta (Rr) conține biții din dreapta (cei mai puțin semnificativi).
2) Pentru fiecare rundă i = r-1, ..., 0:
Se calculează : Ri = Li+1
Li = Ri+1  f (Ri,Ki+1)

Obs:
1) Cifrul Feistel este structură de bază, care se regăsește în structura altor algoritmi criptografici (din
domeniul militar, bancar, etc.).
2) Un avantaj al modelului Feistel în comparație cu o rețea SP este că funcția de rundă, f, nu trebuie să
fie inversabilă.
3) Schimbarea celor două jumătăți de secvențe binare garantează că are loc o transpoziție, indiferent de
modul în care este definită funcția de rundă.
4) Diferența între o rețea SP și un cifru Feistel este că în SP, blocul de text clar nu este divizat în jumătate,
ci este operat în ansamblul său.
5) O variantă a rețelei Feistel, cifrul Feistel neechilibrat, folosește o structură modificată, în care L0 și
R0 nu au lungimi egale. De exemplu, L0 ar putea fi de 32 de biți și R0 de 64 biți (creând un bloc de text
pe 96 de biți).

Criptosistemul DES (specificații complete: https://www.nist.gov/)

Este implementat pe o rețea Feistel cu 16 runde, cu următoarele proprietăți:


- folosește o cheie K pe 56 de biți (cheile au lungimea de 64 de biți, din care sunt folosiți însă doar 56)
pentru a transforma blocuri de câte 64 de biți de text clar în blocuri de 64 de biți codați, și invers;

7
Nr. zecimal Nr. binar pe 4 biți Nr. hexazecimal
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F

- criptarea unui bloc de 64 de biți începe cu o permutare inițială IP, urmată de 16 runde de calcule (iterații
ale funcției de rundă), în care datele sunt combinate cu cheia și se încheie cu o permutare finală IP-1 care
este inversa permutării inițiale IP.

Obs: Fiecare grup de 4 biţi reprezintă un număr hexazecimal.


Formatul hexazecimal al unei chei criptografice este: (H1H2 H3H4 ... H15H16)

Exemplu:
- fie cheia: 213AABC79FFCD771 reprezentată în binar ca:
0010 0001 0011 1010 1010 1011 1100 0111 10001 1111 1111 1100 1101 0111 0111 0001
- și fie textul clar ”Aplicatii laborator” reprezentat ca șir de caractere hexazecimale pe 8 biți:
0100 0001 0111 0000 0110 1100 0110 1001 0110 0011 0110 0001 0111 0100 0110 1001 0110 1001
0110 1100 0110 0001 0110 0010 0110 1111 0111 0010 0110 0001 0111 0100 0110 1111 0111 0010
Fiecare secvență de 4 biți este convertită în echivalentul său hexazecimal, deci textul clar este reprezentat
ca: 41706C6963617469696C61626F7261746F72

► Etapele algoritmului:
1. Textul clar este împărțit în blocuri de 64 de biți (x1, x2 , ...), care vor fi procesate în mai multe iterații
și vor genera blocuri de 64 de biți codați (y1, y2 , ...).
2. Fie x un bloc de 64 de biți de text clar, căruia i se aplică permutarea inițială și ulterior este împărțit în
două blocuri egale, L0 ce conține biții din stânga (cei mai semnificativi) și R0 ce conține biții din dreapta
(cei mai puțin semnificativi).
x → IP(x) = x0 = L0R0
3. Cele două blocuri vor intra într-o succesiune de 16 iterații, iar la fiecare iterație i (i = 1, ..., 16) se vor
calcula Li și Ri după formulele:

8
Ri = Li-1  f (Ri-1,Ki)
Li = Ri-1
Deci se aplică operația XOR între două secvențe binare: partea din stânga anterior determinată și funcția
de rundă f, care are ca parametru de intrare blocul drept anterior determinat şi cheia de rundă curentă,
Ki.
Cheile de rundă K1, K2, ..., K16 sunt secvențe binare obținute din derivarea cheii inițiale, K.
4. Ultimelor două blocuri obținute, L16 și R16 li se aplică inversa permutării inițiale pentru a obține textul
criptat:
y = IP-1(L16R16)

► Permutarea inițială IP:


Fie x un bloc de 64 de biți de text clar.
x se scrie ca o secvență de 8 octeți: x = m1 m2 .....m8 , biții fiecărui octet ocupând poziții de la 1 la 8 în
cadrul octetului. Se generează următoarea formă matriceală:
poziția 2

poziția 1
poziția 8

poziția 7
poziția 6
poziția 5
poziția 4

poziția 3

64 63 62 61 60 59 58 57 m1
56 55 54 53 52 51 50 49 m2
48 47 46 45 44 43 42 41
40 39 38 37 36 35 34 33
32 31 30 29 28 27 26 25
24 23 22 21 20 19 18 17
16 15 14 13 12 11 10 9
8 7 6 5 4 3 2 1 m8

Permutarea inițială IP selectează din fiecare acești 8 octeți bitul situat pe pozițiile: (2, 4, 6, 8, 1, 3, 5, 7)
Rezultă următoarea rearanjare a celor 64 de biți:
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
9
► Permutarea finală IP-1
Permutarea finală IP-1 va genera o rearanjare a biților unui bloc de 64 de biți, conform ordinii dată de
inversa permutării π = (2, 4, 6, 8, 1, 3, 5, 7), care este permutarea π-1 = (5, 1, 6, 2, 7, 3, 8, 4), aplicată
coloanelor formei matriceale transpuse:

poziția 2

poziția 1
poziția 8

poziția 7
poziția 6
poziția 5
poziția 4

poziția 3

64 56 48 40 32 24 16 8
63 55 47 39 31 23 15 7
62 54 46 38 30 22 14 6
61 53 45 37 29 21 13 5
60 52 44 36 28 20 12 4
59 51 43 35 27 19 11 3
58 50 42 34 26 18 10 2
57 49 41 33 25 17 9 1

Rezultă următoarea rearanjare a celor 64 de biți:

40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
38 6 46 14 54 22 62 30
37 5 45 13 53 21 61 29
36 4 44 12 52 20 60 28
35 3 43 11 51 19 59 27
34 2 42 10 50 18 58 26
33 1 41 9 49 17 57 25

► Procesul de derivare a cheii

Pornind de la cheia inițială K, care este o secvență de 64 de biți, se generează mulțimea cheilor de rundă
K1, K2, ..., K16 astfel:
1. Cheia K de 64 de biți este compusă din 8 octeți, iar ultimul bit al fiecăruia dintre acești octeți este bit
de paritate pentru detecția erorilor. După verificarea celor 8 biți de paritate, aceștia sunt eliminați.
Obs: În transmisia unui mesaj, pentru fiecare succesiune de cifre binare a1,…,an se adaugă un bit de
paritate an+1 care face ca numărul de biți cu valoarea 1 din mesajul transmis să fie par sau impar, în
funcție de convenția de paritate stabilită. În momentul în care un bit se modifică, acesta va schimba
paritatea: de la pară la impară sau invers.

2. Cei 56 de biți rămași sunt permutați și divizați în două jumătăți de câte 28 de biți: C0 (biții din stânga)
și D0 (biții din dreapta).

10
K → PC1(K) = C0D0

C0 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36
D0 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4
3. Pentru fiecare rundă i = 1, ..., 16 se calculează cheia Ki astfel:

3.1 Se realizează o deplasare circulară la stânga (”Left Shift” –LS) cu una sau două poziții (una pentru
rundele 1, 2, 9 şi 16, respectiv două pentru celelalte runde):

Ci = LSi(Ci-1)
Di = LSi(Di-1)

3.2 Se concatenează secvențele Ci și Di

3.3 Secvenței rezultate i se aplică o nouă permutare, PC2 - permutare selectivă, care va reduce numărul
biților la 48:
Ki = PC2(CiDi), unde permutarea PC2 este:

(14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2
41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32)

Obs: Permutarea PC2 stabilește care vor fi cei 48 de biți selectați din cei 56 și care va fi ordinea acestora
în secvența cheii Ki

Procesul de derivare a cheii [Salomon, D. „Coding for Data and Computer Communications”]

► Funcția de rundă f: f(A,B)= A ⨁ B


Are ca parametru de intrare blocul drept şi cheia de rundă: f (Ri-1,Ki).

11
Dar blocul drept Ri-1 are 32 de biţi. Pentru a-l aduce la dimensiunea de 48 de biți, a.î. să poată fi aplicată
operația XOR cu cheia de rundă Ki, blocul Ri-1 este trecut printr-o permutare de expansiune E.
Permutarea E rearanjează biții blocului Ri-1 într-o altă ordine, anumiți biți fiind dublați.
Rezultatul f (Ri-1,Ki) este folosit ca intrare pentru 8 casete de substituţie S-box. Fiecare casetă are la ieşire
4 biţi de unde rezultă un total de 32 de biţi care sunt din nou trecuţi printr-o permutare P. Funcţia de
expansiune E şi blocul de permutare P sunt definite mai jos:
E = [32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20,
21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1]

P = [16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22,
11, 4, 25]

Funcția de rundă f

Algoritmul DES cu 16 runde [Salomon, D. „Coding for Data and Computer Communications”]
12
Obs:
1) Pentru a obține o securitate adecvată sunt necesare un minim 16 runde
2) Cu cât dimensiunea blocului, a cheii şi numărul de runde creşte, creşte şi securitatea, respectiv scade
viteza de criptare/decriptare.
3) Funcția rundei de criptare, f, poate fi oricât de complexă şi nu trebuie să fie o funcție reversibilă;
deoarece DES este construit pe principiul rețelei Feistel atât algoritmul de criptare, cât și cel de decriptare
utilizează funcția f. Funcția f este de obicei un cifru produs ce conține substituții, transpoziții și alte
funcții matematice.
4) Criptarea şi decriptarea se fac parcurgând aceeași rețea în sens invers în r runde, dar cu sub-cheile în
ordine inversă, de la Kr la K1.
5) Cifrul DES poate fi aplicat de mai multe ori pentru creșterea securității, un exemplu fiind Triple DES.
În acest caz, DES este utilizat de trei ori, cu trei chei diferite, cu o lungime efectivă a cheii de 3*56 =
168 biți. Acest lucru îl face mult mai sigur decât algoritmul DES simplu, cu cheia de 56 de biți. Au fost
dezvoltate și alte variante de DES, cum ar fi DESX, GDES și RDEX.

Aspecte legate de cheia de criptare inițială



Protocoale și standarde pentru distribuirea cheilor secrete

Metode și protocoale criptografice

Avantajul major al criptării simetrice - rapiditatea, aspect important în transmisia unui volum
mare de date.
Dezavantajul major - managementul cheilor de criptare: în condițiile în care doi utilizatori
agreează asupra unei chei comune, aceasta este greu de transmis între cei doi, în condiții de securitate
sporită. Practic, dacă o persoană află cheia, atunci poate decripta mesajul transmis. O soluție ar fi
partajarea cheii printr-un canal securizat, dar existența unui astfel de canal nu mai justifică necesitatea
criptării.
O altă problemă a criptării simetrice este legată de volumul mare al cheilor care ar trebui atribuite
în cazul sistemelor cu mii de utilizatori cu drept de acces la informațiile criptate. În acest caz este nevoie
de soluții speciale: partajare printr-un hardware specializat implementat în echipamentele de
comunicație sau utilizarea unor soluții software flexibile și portabile, care se pot încorpora în aplicații
complexe, cum ar fi cele de comunicații.
O tehnologie tipică folosită în multe corporații este ”secure card”, oferit fiecărui angajat. Cardul are un
cip care generează un număr aleatoriu R la fiecare minut, numărul generat fiind unic pentru angajat.
Pentru a avea acces la sistem, angajatul introduce ID-ului de angajat plus R - aceasta devine cheia K. La
recepția mesajului, o rutină similară generează R pentru angajat. Mesajele trimise sunt criptate folosind
cheia K pe care o introduce utilizatorul și sunt decriptate folosind cheia K generată de sistem. Dacă
aceste chei nu se potrivesc, mesajul nu poate fi decriptat.
În general, managementul modern al cheilor de criptare impune ca:

13
- gestionarea cheilor de criptare trebuie să fie un proces complet automatizat, nefiind permise operații
manuale;
- pentru securizarea cheilor, acestea nu pot apărea în clar în afara unui dispozitiv criptografic;
- cheile trebuie alese aleator din spațiul cheilor, în condițiile unei distribuții uniforme, care să permită
aceeași probabilitate de alegere pentru toate cheile;
- cheile utilizate în criptarea altor chei nu trebuie utilizate pentru criptarea datelor, și reciproc;
- trebuie evitată utilizarea unor chei cu durată lungă de viață: cu cât e folosită mai mult o cheie, cu atât
este mai probabil succesul unui atac și compromiterea cheii.

Utilizare DES- moduri de operare în cazul cifrării bloc

Un mod de operare specifică modul în care o secvență de blocuri de text clar trebuie criptată,
algoritmul DES fiind aplicabil pentru transformarea unui singur bloc de text clar într-un bloc criptat și
invers.
Standardul DES definește patru moduri de operare pentru acest algoritm, aplicabile de fapt
tuturor cifrurilor bloc:
► Modul ECB (Electronic Codebook Mode): blocurile de text clar sunt împărțite în blocuri de
64 biți, care vor fi transformate succesiv în blocurile criptate corespunzătoare.
Fie un text clar x = x1x2...xn , unde xi este un bloc component de 64 biți. Dacă ultimul bloc, xn
este mai scurt de 64 biți, se completează cu biți (”padding”) pentru completarea blocului. O posibilă
metodă de umplere este de a adăuga un singur bit „1” la textul clar și apoi atâția biți „0” cât este necesar
pentru a atinge un multiplu al lungimii blocului. O altă posibilitate este de a completa cu o alternanță de
biți „0” și „1”.
Algoritmul DES se aplică independent fiecărui bloc xi, utilizând aceeași cheie K, pentru a obține
la ieșire blocul criptat yi:
Criptarea: yi = ek(xi), i =1, ..., n
Decriptarea: xi = dk(yi) = ek-1(yi) = ek-1(ek(xi)) , i =1, ..., n

Avantaje:
- erorile de transmisie (transmisia poate fi afectată de zgomote) afectează numai blocul corespunzător,
nu și blocurile ulterioare;
- criptarea poate fi paralelizată, de exemplu, o unitate de criptare criptează (sau decriptează) blocul 1,
următoarea blocul 2, etc., ceea ce permite implementări de mare viteză.

Dezavantaje:
- blocuri de text clar identice vor fi criptate la fel, atâta timp cât cheia nu se schimbă. Acest lucru
reprezintă o vulnerabilitate, deoarece este un punct de plecare în analiza cifrului pentru încercarea de a
obține cheia.

14
► Modul CBC (Cipher Block Chaining Mode): criptarea este legată printr-un mecanism de
feedback, criptarea unui boc nu mai depinde doar de cheie (ca în cazul modului ECB), ci și de blocurile
anterioare:
- înainte de criptare, blocul de text clar, xi este combinat prin operația XOR cu blocul criptat anterior,
yi-1. Astfel, criptarea blocului xi depinde de toate celelalte i-1 blocuri anterioare:
Criptarea: yi = ek(xi ⨁ yi-1), i =2, ..., n
- la primul pas al criptării, pentru criptarea blocului x1 nu există un bloc criptat anterior, cu care să poată
fi combinat. În acest scop se definește un vector de iniţializare (IV – ”Initialization Vector”) care este
un bloc cu 64 de valori alese aleator, ce joacă rol de bloc criptat anterior primului bloc:

y1 = ek(x1 ⨁ IV)
Astfel:
- primul bloc criptat, y1, depinde de blocul de text clar x1 și de blocul de inițializare IV
- al doilea bloc criptat, y2, depinde de blocul de text clar x2, de blocul x1 și de blocul IV
- al treilea bloc criptat, y3, depinde de x3, de x2, de x1 și de IV
-----------------
- ultimul bloc criptat, yn, depinde de toate blocurile de text clar și de blocul IV

Decriptarea unui bloc criptat, yi, în modul CBC presupune inversarea celor două operații de criptare.

x1 = dk(y1) ⨁ IV = ek-1(y1) ⨁ IV
xi = dk(yi) ⨁ yi-1 = ek-1(yi) ⨁ yi-1, i =2, ..., n

Modul de operare CBC

Obs:
1) înainte de criptare, dacă este necesar, se aplică operația de (”padding”) pentru completarea ultimului
bloc de text clar, la fel ca în cazul modului de operare ECB.
2) blocul de inițializare nu trebuie păstrat secret, acesta poate fi transmis împreună cu mesajul.

Avantaje:
- dacă textul clar este criptat de fiecare dată cu un alt bloc de inițializare, rezultă două criptograme
diferite, fără legătură între ele și în consecință fără importanță pentru un atacator.
15
- fiecare bloc criptat depinde de toate blocurile de text clar anterioare, rezultă că nu există o periodicitate
datorată repetării intrării.

Dezavantaje:
- cei doi utilizatori, trebuie să cunoască amândoi blocul de inițializare.
- o eroare în blocul textului criptat yi face imposibilă decriptarea blocurilor următoare, xi și xi+1, chiar
dacă acestea sunt corect recepționate.

► Modul CFB (Cipher Feedback Mode): blocul de text criptat anterior este recriptat, apoi
rezultatul obținut va fi combinat prin operația XOR cu blocul de text clar pentru a genera blocul criptat
curent.
Analog modului CBC, se definește un vector de iniţializare IV - un bloc cu 64 de valori alese
aleator, ce joacă rol în criptarea primului bloc.
Recurența corespunzătoare criptării este:

y1 = x1 ⨁ ek(IV)
yi = xi ⨁ ek(yi-1), i =2, ..., n

Decriptarea:

x1 = y1 ⨁ ek(IV)
xi = yi ⨁ ek(yi-1), i =2, ..., n
Obs:
1) analog modului CBC, blocul de inițializare ar trebui să fie diferit, pentru fiecare mesaj
2) prin prisma mecanismului de feedback, modul CFB operează asemănător modului CBC
3) secvența ek(yi-1) imită rolul cheii aleatoare întâlnită în cifrul Vernam, unde atât funcția de criptare, cât
și funcția de decriptare aplică operatorul XOR între biții textului clar și biții cheii; astfel, modul CFB
este construit conform sistemelor de criptare cu chei secvențiale: se generează întâi cheia de criptare,
care apoi se combină cu textul clar.

CFB poate fi rescris ca un cifru secvențial asincron, în care funcția de generare a cheii de criptare depinde
de textul criptat anterior. Astfel, dacă se notează secvența cheilor generate: k1, k2, ..., kn, acestea se obțin
astfel:
- se criptează blocul de inițializare IV și rezultatul reprezintă prima cheie de criptare;
- următoarele chei se generează prin recriptarea blocului criptat anterior

16
CFB CFB rescris ca cifru secvențial asincron

Recurența corespunzătoare criptării este: Recurența corespunzătoare criptării este:

y1 = x1 ⨁ ek(IV) k1 = ek(IV) ; y1 = x1 ⨁ k1
yi = xi ⨁ ek(yi-1), i =2, ..., n ki = ek(yi-1) ; yi = xi ⨁ ki , i =2, ..., n

Decriptarea: Decriptarea:

x1 = y1 ⨁ ek(IV) k1 = ek(IV) ; x1 = y1 ⨁ k1
xi = yi ⨁ ek(yi-1), i =2, ..., n ki = ek(yi-1) ; xi = yi ⨁ ki , i =2, ..., n

Avantaje:
- criptarea CFB este, de asemenea, nondeterministă - criptarea aceluiași text de două ori are ca rezultat
criptograme diferite.
- funcția de criptare ek este folosită atât la criptare, cât și la decriptare.

► Modul OFB (Output Feedback Mode): este asemănător cu modul CFB, dar diferă prin faptul
că rezultatul funcției de criptare, ek, servește ca feedback.

OFB poate fi descris ca un cifru secvențial sincron, în care funcția de generare a cheii de criptare nu
depinde de textul criptat anterior și nici de textul clar. Astfel, dacă se notează secvența cheilor generate:
k1, k2, ..., kn, acestea se obțin astfel:
- se criptează blocul de inițializare IV și rezultatul reprezintă prima cheie de criptare;
- următoarele chei se generează prin recriptarea cheii obținute anterior

Recurența corespunzătoare criptării este:

k1 = ek(IV) ; y1 = x1 ⨁ k1
ki = ek(ki-1) ; yi = xi ⨁ ki , i =2, ..., n

Decriptarea:

k1 = ek(IV) ; x1 = y1 ⨁ k1
ki = ek(ki-1) ; xi = yi ⨁ ki , i =2, ..., n

17
Combinarea cifrurilor bloc în scheme de criptare multiplă și criptare în cascadă

Criptarea multiplă = criptarea unui text de mai multe ori, cu chei diferite: este de fapt principiul
constructiv al cifrurilor bloc, funcția de rundă fiind aplicată succesiv în etapele algoritmului de criptare.
Criptarea în cascadă: spre deosebire de criptarea multiplă, utilizează algoritmi de criptare diferiți.

Scheme de criptare multiplă:

► Criptarea dublă – presupune criptarea unui bloc de text clar de două ori, cu chei diferite:
Criptarea: y = ek2(ek1(x)) k1 k2
Decriptarea: x = dk1(dk2(y)) x e z e y
Schema de criptare

Ambele chei au o lungime de n biți ⟹ lungimea totală a cheii este 2n biți.


Un atac de tip ”forță brută” – căutarea exhaustivă a cheilor: necesită testarea tuturor combinațiilor
posibile de chei: 2n⋅2n = 22n criptări.
Un atac de tip ”meet in the middle” dezvoltat de Merkle & Hellman (presupune criptarea unui text clar
cu fiecare cheie posibilă și compararea cu ce se obține la decriptarea textului criptat aferent)
demonstrează că, în cazul utilizării criptării DES, această schemă de criptare dublă poate fi spartă cu
calculul a 2n+1 criptări, nu cu 22n criptări.
Un rezultat de ordinul O(2n+1) arată un calcul puțin mai complex decât în cazul căutării exhaustive pentru
o singură criptare, O(2n), dar mult mai puțin complex decât în cazul în care trebuie efectuate 22n operații
de căutare. De aceea dubla criptare nu aduce un beneficiu de siguranță major.
Obs: rezultatul poate fi generalizat pentru orice cifru bloc.

Schema atacului ”meet in the middle”:


Fie (x, y) o pereche (text clar, text criptat) obținută conform schemei de mai sus a criptării duble
1. Pentru fiecare din cele 2n chei posibile se calculează zi = eki(x)
2. Se rețin într-un tabel (zi,ki)
3. Pentru fiecare din cele 2n chei posibile:
a) Se calculează zj = dKj(y);
b) Se caută în tabel o pereche (zi, ki) cu zi = zj; //avem ceea ce se cheamă ”coliziunea” celor două valori
4. O pereche de chei posibile este (ki, kj) deoarece zi = zj ⟹ eki(x) = dKj(y) ⟹ ekj(eki(x)) = ekj(dKj(y)) =
y, deci ekj(eki(x)) = y, deci blocul x a fost criptat în blocul y cu perechea de chei (ki, kj).
Algoritmul se reia cu alte perechi (x,y) până când se va identifica perechea de chei folosită.
S-a demonstrat că numărul maxim de încercări necesare este de 2⋅2n = 2n+1
18
► Criptarea triplă: în două variante:
a) ”e-e-e”: y = ek3(ek2(ek1(x))) toate cele trei operațiuni efectuate cu cheile sunt criptări
În acest caz, lungimea cheii este 3⋅n, dar atacul de tip ”meet in the middle” necesită un timp de O(22n)

b) ”e-d-e”: criptarea: y = ek1(dk2(ek1(x))) operațiunile sunt criptare, decriptare, criptare


decriptarea: x = dk1(ek2(dk1(y)))
În acest caz, lungimea cheii este 2⋅n, dar cel mai bun atac cunoscut necesită un timp de O(22n)

► ”Albirea” cheilor: în plus, față de cheia K, se utilizează două alte chei diferite, K1 și K2 (chei
”de albire”) , care au rolul de a rearanja biții blocurilor de date într-un anumit mod, prin combinarea cu
operații XOR cu textul clar și cu textul criptat.
criptarea: y = ek,k1,k2(x) = ek(x ⨁ k1) ⨁ k2
decriptarea: x = e-1k,k1,k2(y) = e-1k (y ⨁ k2) ⨁ k1

În cazul cifrului DES, varianta cu chei ”de albire” este DESX.

Securitatea criptosistemului DES


DES s-a menținut ca standard criptografic mai mult de 20 de ani (până în anul 2000), înainte de
a fi definitiv considerat nesigur. Cu puterea de calcul în continuă creștere, DES putea fi fi relativ ușor
atacat cu o căutare exhaustivă a cheilor și, prin urmare, DES simplu nu mai era potrivit pentru
majoritatea aplicațiilor.
RSA Laboratories Inc. a sponsorizat trei provocări publice pentru a sparge DES, derulate din
1997 până în 1999, care au devenit din ce în ce mai dificile, solicitând participanților să găsească cheia
de criptare în mai puțin timp decât s-a obținut în provocarea anterioară. Toate cele trei provocări au fost
rezolvate cu succes, iar a treia a fost realizată într-un timp record de 22 de ore și 15 minute, de o rețea
mondială de aproape 100.000 de computere personale. Drept urmare, NIST (National Institute of
Standards and Technology) a recomandat ca DES să fie retras și înlocuit cu un algoritm criptografic mai
puternic: Advanced Encryption Standard (AES).
La 19 mai 2005, DES a fost retras oficial, însă NIST a aprobat Triple DES (TDEA) până în anul
2030 pentru informații guvernamentale sensibile.

Criptosistemul AES (specificații complete: https://www.nist.gov/)

Ca urmare a problemelor inerente ale TripleDES (spațiul cheilor relativ mic, performanță lentă,
dimensiunea blocului fixă), în 1997 Institutul Național de Standarde și Tehnologie (NIST) a solicitat
crearea unui nou standard avansat de criptare. Cerințele de bază ale acestui AES au fost:
• Să fie un sistem de criptare simetric, pe blocuri de 128 biți.

19
• Să ofere posibilitatea de a folosi chei de lungime 128, 192 și 256 biți;
• Să nu aibă chei slabe;
• Să funcționeze pe platforme hardware diferite, de exemplu procesoare pe 8 biți (utilizate în cardurile
inteligente smart-carduri) și pe arhitectura de 32 de biți, frecvent utilizată în computerele personale
• Să fie cât mai simplu, să fie mai rapid decât DES și să ofere o securitate mai mare decât 3DES.
Algoritmii care îndeplineau cerințele de mai urmau să fie evaluați pe baza următorilor factori:
securitate (rezistență la analize criptografice), eficiența calculului, cerințe de memorie, adecvare
hardware și software, simplitate și flexibilitate, cerințe de autorizare.

La 2 ianuarie 1997, Institutul Național de Standarde și Tehnologie (NIST) a anunțat un concurs


pentru proiectarea AES. Dintre cele 15 criptosisteme prezentate, au fost aleși cinci finaliști: MARS
(IBM), RC6 (RSA Laboratories), Rijndael (Joan Daemen și Vincent Rijmen), Serpent (Ross Anderson,
Eli Biham și Lards Knudson) și Twofish (Bruce Schneier, John Kelsey, Doug Whiting, David Wagner,
Chris Hall și Niels Ferguson).
În anul 2001 Rijndael a fost ales de guvernul Statelor Unite ca algoritm pentru AES. Este o
variantă a conceptului de rețea SP, cu variante mai sofisticate și mai elegante de operații S-box și P-box.

Caracteristicile algoritmului AES Rijndael (versiunea cu blocuri de text de 128 biți):

► Este proiectat să funcționeze cu blocuri de text clar și dimensiuni ale cheii ca multiplu de 32 de biți,
cu un minim de 128 biți și un maxim de 256 biți; în versiunea cea mai utilizată, are o dimensiune a
blocului fixă, de 128 biți.

► Are un număr variabil de runde (iteraţii); o rundă începe cu o intrare de 128 biți și produce o ieșire
de 128 biți și fiecare rundă constă în aplicarea a 4 tipuri de transformări (etape):
1. Transformarea ByteSub: substituirea octeților: fiecare octet al textului clar este substituit cu
un octet extras dintr-o cutie de tip S
2. Transformarea ShiftRow: deplasarea liniilor
3. Transformarea MixColumn: amestecarea coloanelor
4. Transformarea AddRoundKey: adăugarea sub-cheii specifice rundei curente

► Blocurile de text clar, x, de lungime de 128, 192 sau 256 biți sunt gândite ca fiind împărțite într-un
pătrat 4 × Nb grupuri de 8 biți, unde Nb = B/32 (B fiind lungimea blocului); Nb ∈ {4, 6, 8} corespunzător
pentru 128, 192 și respectiv 256 biți;
x0,0 x0,1 x0,2 ......... x0,Nb-1
x = x1,0 x1,1 x1,2 ......... x1,Nb-1 , unde
x2,0 x2,1 x2,2 ......... x2,Nb-1
x3,0 x3,1 x3,2 ......... x3,Nb-1

20
un element xi,j este un byte (8 biți), deci un element din mulțimea Z28, dar și reprezentarea sa echivalentă:
un întreg din Z256 (deoarece pe 8 biți se pot reprezenta numere din mulțimea {0, ..., 255}.
Blocul de text clar x va fi citit coloană cu coloană, de la stânga la dreapta, în următoarea structură liniară:
x = (x0,0 , x1,0 , x2,0 , x3,0 , x0,1 , x1,1 ......... x0,Nb-1 , x1,Nb-1 , x2,Nb-1 , x3,Nb-1)

► Analog, cheia de criptare k se va reprezenta printr-un tablou 4×Nk, unde Nk = K/32 (K fiind lungimea
cheii); Nk ∈ {4, 6, 8} corespunzător pentru 128, 192 și respectiv 256 biți

k0,0 k0,1 k0,2 ......... k0,Nk-1


k = k1,0 k1,1 k1,2 ......... k1,Nk-1 , unde
k2,0 k2,1 k2,2 ......... k2,Nk-1
k3,0 k3,1 k3,2 ......... k3,Nk-1

un element ki,j este un byte (8 biți), deci un element din mulțimea Z28, dar și reprezentarea sa echivalentă:
un întreg din Z256 (deoarece pe 8 biți se pot reprezenta numere din mulțimea {0, ..., 255}.

Cheia k va fi coloană cu coloană, de la stânga la dreapta, în următoarea structură liniară:


k = (k0,0 , k1,0 , k2,0 , k3,0 , k0,1 , k1,1 ......... k0,Nk-1 , k1,Nk-1 , k2,Nk-1 , k3,Nk-1)

Obs: forma matriceală de reprezentare este denumită stare și se va schimba pe măsură ce algoritmul
continuă prin etapele sale.
► Înainte de prima rundă, octeții blocului de text clar sunt reprezentați în formă matriceală. Fiecare
rundă schimbă pe rând conținutul unei matrice, iar după ultima rundă, matricea va conține octeții
blocului criptat, care vor fi citiți pe coloane, de la stânga la dreapta. Deci, prin liniarizarea pe coloane a
stării finale rezultate după criptare, se va obține blocul criptat.
► Algoritmul are un număr variabil de runde (iteraţii), în funcție de dimensiunea cheii de criptare și
dimensiunea blocului de text clar (valorile Nk și Nb):

Nb = 4 Nb = 6 Nb = 8
Nk = 4 10 12 14
Nk = 6 12 12 14
Nk = 8 14 14 14

► În continuare, algoritmul Rijndael parcurge transformările corespunzătoare fiecărei runde.


De exemplu, pentru o implementare pe 128 de biți blocul de text clar (Nb =4) și 128 de biți cheia de
criptare (Nk = 4):
1. AddRoundKey (ARK) utilizând cheia inițială, K
2. Nouă runde cu transformările: ByteSub (BS), ShiftRow (SR), MixColumn (MC), AddRoundKey
(ARK), utilizând cheile de rundă K1, K2, ..., K9
21
3. Runda finală, cu transformările: ByteSub (BS), ShiftRow (SR), AddRoundKey (ARK), utilizând
cheia de rundă K10.

Figura : Structura algoritmului AES

Transformarea ByteSub (BS): o substituție neliniară, prin care fiecare octet al matricei x este înlocuit
cu un alt octet, cu ajutorul casetei de substituție, S-box:
x =(xij) S-box a = (aij)

S-box
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 63 7C 77 7B F2 6B 6F C5 30 1 67 2B FE D7 AB 76
1 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0
2 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15
3 4 C7 23 C3 18 96 5 9A 7 12 80 E2 EB 27 B2 75
4 9 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84
5 53 D1 0 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF
6 D0 EF AA FB 43 4D 33 85 45 F9 2 7F 50 3C 9F A8
7 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2
8 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73
9 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB
A E0 32 3A 0A 49 6 24 5C C2 D3 AC 62 91 95 E4 79
B E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 8
C BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A
D 70 3E B5 66 48 3 F6 0E 61 35 57 B9 86 C1 1D 9E
E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF
F 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16

Pentru un octet xij scris sub forma b7b6b5b4b3b2b1b0, se determină acel element din caseta S-box situat
pe linia b7b6b5b4 și coloana b3b2b1b0 (liniile și coloanele casetei fiind numerotate de la 0 la F). Elementul
respectiv, convertit în binar reprezintă ieșirea: octetul aij
De exemplu, fie octetul de intrare 10011111. Se determină elementul din casetă situat pe linia (1001)2 =
9 și coloana (1111)2 = F. Elementul este {DB} = (11011011)2

22
Transformarea ByteSub se aplică în mod similar tuturor octeților stării de intrare în rundă, rezultatul
fiind o altă stare de ieșire din rundă. Prin transformarea aplicată fiecărui octet, această etapă garantează
un grad ridicat de neliniaritate.
Pentru o implementare pe 128 de biți blocul de text clar (Nb =4) și 128 de biți cheia de criptare (Nk = 4):

x0,0 x0,1 x0,2 x0,3 a0,0 a0,1 a0,2 a0,3


x = x1,0 x1,1 x1,2 x1,3 S-box a= a1,0 a1,1 a1,2 a1,3
x2,0 x2,1 x2,2 x2,3 aij = S(xij) a2,0 a2,1 a2,2 a2,3
x3,0 x3,1 x3,2 x3,3 a3,0 a3,1 a3,2 a3,3

Transformarea ShiftRow (SR): permută ciclic octeții din fiecare linie a stării cu un anumit număr de
poziții, respectiv 0, 1, 2 și 3. Deci prima este lăsată neschimbată. Fiecare octet al celei de-a doua linii
este deplasat cu o poziție spre stânga. La fel, a treia și a patra linie sunt deplasate cu două și, respectiv,
trei poziții spre stânga. Se obține astfel starea:
b0,0 b0,1 b0,2 b0,3 a0,0 a0,1 a0,2 a0,3
b1,0 b1,1 b1,2 b1,3 = a1,1 a1,2 a1,3 a1,0
b2,0 b2,1 b2,2 b2,3 a2,2 a2,3 a2,0 a2,1
b3,0 b3,1 b3,2 b3,3 a3,3 a3,0 a3,1 a3,2

Practic, un set de casete de permutare P-box rotesc fiecare rând cu un număr diferit de grupuri de 8 biți.
Prin acest procedeu se generează dispersia: mutarea biților alăturați în poziții care sunt îndepărtate.

Transformarea MixColumn (MC): realizează o înmulțire matriceală, care transformă fiecare coloană
a stării:
c0 2 3 1 1 b0,0 b0,1 b0,2 b0,3
c1 = 1 2 3 1 ⋅ b1,0 b1,1 b1,2 b1,3 ⟺
c2 1 1 2 3 b2,0 b2,1 b2,2 b2,3
c3 3 1 1 2 b3,0 b3,1 b3,2 b3,3

c0,0 c0,1 c0,2 c0,3 00000010 00000011 00000001 00000001 b0,0 b0,1 b0,2 b0,3
c1,0 c1,1 c1,2 c1,3 = 00000001 00000010 00000011 00000001 ⋅ b1,0 b1,1 b1,2 b1,3
c2,0 c2,1 c2,2 c2,3 00000001 00000001 00000010 00000011 b2,0 b2,1 b2,2 b2,3
c3,0 c3,1 c3,2 c3,3 00000011 00000001 00000001 00000010 b3,0 b3,1 b3,2 b3,3

Obs:
1) Practic, se realizează o criptare Hill pe fiecare coloană. Avantajul utilizării unui cifru Hill, în care
fiecare bit are șansa de a influența fiecare alt bit, este rezistența crescută la atacuri criptografice.

23
2) Matricea 2 3 1 1 se numește matrice circulantă de ordin 4
1 2 3 1
1 1 2 3
3 1 1 2 𝛼j,0 𝛼j,3 𝛼j,2 𝛼j,1
O matrice circulantă de ordin 4 este o matrice 𝛼4x4 = 𝛼j,1 𝛼j,0 𝛼j,3 𝛼j,2
𝛼j,2 𝛼j,1 𝛼j,0 𝛼j,3
𝛼j,3 𝛼j,2 𝛼j,1 𝛼j,0

Transformarea AddRoundKey (ARK): sub-cheia specifică rundei curente este combinată prin
operația XOR cu fiecare octet al stării curente. Sub-cheia este derivată din cheia principală prin procesul
de derivare a cheii, fiecare sub-cheie având aceeași dimensiune cu matricea de stare.
d0,0 d0,1 d0,2 d0,3 c0,0 c0,1 c0,2 c0,3 k0,0 k0,1 k0,2 k0,3
d1,0 d1,1 d1,2 d1,3 = c1,0 c1,1 c1,2 c1,3 ⨁ k1,0 k1,1 k1,2 k1,3
d2,0 d2,1 d2,2 d2,3 c2,0 c2,1 c2,2 c2,3 k2,0 k2,1 k2,2 k2,3
d3,0 d3,1 d3,2 d3,3 c3,0 c3,1 c3,2 c3,3 k3,0 k3,1 k3,2 k3,3

Obs:
1) Practic, transformarea AddRoundKey este un cifru Vernam.
2) Toate operațiunile din AES se execută la nivel de octeți, ceea ce face posibilă implementarea eficientă
atât hardware cât și software a algoritmului.

Algoritmul de expandare a cheii de criptare


1. Cheia de rundă 0, K0 este cheia de criptare inițială, K, reprezentată sub forma unui tablou 4 x Nk, unde
Nk = K/32 (K fiind dimensiunea cheii). Aceste coloane reprezintă setul de Nk coloane de la pasul 0,
corespunzătoare cheii K0:

Expandarea cheii: obținerea cheii de rundă K0 [Kaufman et al.[5]]

24
2. Următoarele seturi de câte Nk coloane, corespunzătoare cheilor de rundă Ki, i =1, ....Nr. runde, vor fi
generate iterativ:
Pentru a genera cheia de rundă Ki, deci al i-lea set de Nk coloane, este nevoie se cheia de rundă Ki-1, deci
de setul (i-1):
- coloana j = 0 a setului i este obținută astfel:
- se deplasează în sus cu o poziție octeții ultimei coloane din setul (i-1);
- fiecare octet astfel obținut este înlocuit cu un alt octet, rezultat dintr-o substituție S-box;
- primul octet rezultat (octetul 0) se combină prin operația XOR cu o constantă Ci
- coloana 0 din set i = coloana 0 din set (i-1) ⨁ coloana rezultată din prelucrarea anterioară
- restul coloanelor din setul i (j=1, 2, 3) sunt generate pe rând, combinând prin XOR coloana precedentă
obținută în setul i cu coloana corespunzătoare din setul (i-1):
coloana j din set i = coloana (j-1) din set i ⨁ coloana j din set (i-1)

Expandarea cheii: obținerea cheii de rundă Ki, [Kaufman et al.[5]]

Constantele Ci au următoarele valori:

i = 1 , 2, ..., 10: 1 2 4 8 10 20 40 80 1b 36
i = 11, 12, .., 20: 6c d8 ab 4d 9a 2f 5e bc 63 c6
i = 21, 22, ...,30: 97 35 6a d4 b3 7d fa ef c5 (91)

Obs: Algoritmul de expansiune a cheilor este conceput a.î. schimbarea unui bit din cheia de criptare va
afecta cheile de rundă pentru rundele consecutive.

25
Decriptarea

Implică efectuarea operațiunilor în sens invers (cheile derivate fiind considerate în ordine
inversă) și folosirea operațiilor inverse pentru transformările directe ByteSub (BS), ShiftRow (SR),
MixColumn (MC), AddRoundKey (ARK):
► Transformarea inversă ByteSub (Inverse ByteSub - IBS) utilizează caseta de substituție
Inverse S-box, inversa casetei S-box:
IS-box
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 52 9 6A D5 30 36 A5 38 BF 40 A3 9E 81 F3 D7 FB
1 7C E3 39 82 9B 2F FF 87 34 8E 43 44 C4 DE E9 CB
2 54 7B 94 32 A6 C2 23 3D EE 4C 95 0B 42 FA C3 4E
3 8 2E A1 66 28 D9 24 B2 76 5B A2 49 6D 8B D1 25
4 72 F8 F6 64 86 68 98 16 D4 A4 5C CC 5D 65 B6 92
5 6C 70 48 50 FD ED B9 DA 5E 15 46 57 A7 8D 9D 84
6 90 D8 AB 0 8C BC D3 0A F7 E4 58 5 B8 B3 45 6
7 D0 2C 1E 8F CA 3F 0F 2 C1 AF BD 3 1 13 8A 6B
8 3A 91 11 41 4F 67 DC EA 97 F2 CF CE F0 B4 E6 73
9 96 AC 74 22 E7 AD 35 85 E2 F9 37 E8 1C 75 DF 6E
A 47 F1 1A 71 1D 29 C5 89 6F B7 62 0E AA 18 BE 1B
B FC 56 3E 4B C6 D2 79 20 9A DB C0 FE 78 CD 5A F4
C 1F DD A8 33 88 7 C7 31 B1 12 10 59 27 80 EC 5F
D 60 51 7F A9 19 B5 4A 0D 2D E5 7A 9F 93 C9 9C EF
E A0 E0 3B 4D AE 2A F5 B0 C8 EB BB 3C 83 53 99 61
F 17 2B 4 7E BA 77 D6 26 E1 69 14 63 55 21 0C 7D

Se poate verifica faptul că IS-box[S-box(a)] = a.


De exemplu, intrarea {5C} în caseta IS-box generează la ieșire {A7}, iar intrarea {A7} în caseta S-box
generează la ieșire {5C}.

► Transformarea inversă ShiftRow (Inverse ShiftRow - ISR): realizează permutarea ciclică a


octeților din fiecare linie a stării, dar nu spre stânga, ca în cazul transformării directe, ci spre dreapta, cu
același număr de poziții ca în transformarea directă.

► Transformarea inversă MixColumn (Inverse MixColumn - IMC): realizează înmulțirea


matriceală, folosind inversa matricei circulante utilizată în transformarea directă:
0E 0B 0D 09 Se verifică faptul că : 0E 0B 0D 09 2 3 1 1 1 0 0 0
09 0E 0B 0D 09 0E 0B 0D ⋅ 1 2 3 1 = 0 1 0 0
0D 09 0E 0B 0D 09 0E 0B 1 1 2 3 0 0 1 0
0B 0D 09 0E 0B 0D 09 0E 3 1 1 2 0 0 0 1

► Transformarea inversă AddRoundKey (Inverse AddRoundKey - IARK): este identică cu


transformarea directă, deoarece operația XOR este propria sa inversă.
26
Fundamente algebrice: calcule în câmpuri Galois

Majoritatea calculelor AES sunt definite în cadrul unei structuri algebrice importantă în domeniul
criptografiei: câmpul Galois (Galois Field -GF). Este un câmp numeric finit, cu operații interne de
adunare și înmulțire.
► Fie p un număr prim. Elementele câmpului finit GF(p) pot fi reprezentate prin întregii {0, 1, …,
p-1}, iar cele două operații definite sunt adunarea modulo p și înmulțirea modulo p.
Câmpul finit GF(pn) , n >1, poate fi reprezentat în mai multe moduri. În AES este utilizată
reprezentarea prin polinoame cu coeficienți în GF(p).

► Un polinom în GF(2n) este reprezentat :


- prin coeficienții polinomiali (an-1, an-2, ..., a1, a0) care definesc polinomul:
an-1xn-1 + an-2xn-2 + ... + a2x2 + a1x + a0, unde ai ∈ {0,1}, i =0, …, n-1

- printr-un număr pe n biți: an1an2 ...a2 a1a0

► AES utilizează calcule în GF(28), în care un element poate fi reprezentat:


- în formă binară: un byte (octet) format din biții {b7, b6, b5, b4, b3, b2, b1, b0}
- în formă hexazecimală echivalentă, scriind octetul ca două caractere hexazecimale (un caracter
hexazecimal fiind scris ca un grup de patru biţi): {b7, b6, b5, b4}{b3, b2, b1, b0}
- în formă polinomială: biții {b7, b6, b5, b4, b3, b2, b1, b0} sunt coeficienții polinomului de gradul 7:
b7 x7 + b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x + b0

De exemplu, octetul {11000101}identifică polinomul: x7 + x6 + x2 + 1 sau, în notație


hexazecimală, octetul {11000101} reprezintă {1100}{0101} = {63}.

Elementele câmpurilor finite pot fi adunate sau înmulțite:

► Adunarea în câmpul GF(28), (notată cu ⨁): Operația de adunare este definită ca suma a două
polinoame în care coeficienții se adună modulo 2 și care corespunde combinării prin operația XOR a
celor doi octeți corespondenți.
De exemplu:
polinomial: (x6 + x5 + x2 + 1) + (x7 + x6 + x4 + x) = x7 + x5 + x4 + x2 + x + 1
binar: {01100101}  {11010010} = {10110111}
Hexa: {65} + {D2} = {B7}

Obs: Operația de scădere în GF(28) conduce la același rezultat ca operația de adunare în GF(28) deoarece
implementarea în binar a operației x + x este: {00000010} ⨁{00000010} = {00000000}
Deci x + x = 0 ⟹ -x = x

27
► Înmulțirea în câmpul GF(28), (notată cu •): Operația de înmulțire este definită ca înmulțirea
polinoamelor modulo un polinom ireductibil de grad 8. Pentru algoritmul AES acest polinom ireductibil
este:
m(x) = x8 + x4 + x3 + x + 1

Obs: Operaţia modulo m(x) face ca rezultatul să fie un polinom binar cu gradul mai mic ca 8 (polinom
care este în forma redusă în GF(28)), care poate fi reprezentat pe un octet.

Proprietăți:
- elementul {01} este element neutru la înmulțire
- înmulțirea este asociativă: pentru orice polinoame binare a(x), b(x) si c(x) din câmpul finit, rezultă
că:
a(x) • (b(x) + c(x)) = a(x) • b(x) + a(x) • c(x).

AES implementează în GF(28) operația de înmulțire cu:


a) cu 1:

Fie A = (a7 a6 ... a1 a0) un element în GF(28): {00000001}• A = {01}• A = A

b) cu 2 care se reduce la următoarea regulă:

Fie A = (a7 a6 ... a1 a0) un element în GF(28):

(a6 ... a1 a00), dacă a7 = 0


{00000010}• A = {02}• A =
(a6 ... a1 a00)⨁(00011011), dacă a7 = 1

Explicație:

x8 = x8 + x4 + x3 + x + 1 – (x4 + x3 + x + 1) ⟹ x8 = m(x) + (- x4 - x3 +- x - 1) = m(x) + (x4 + x3 + x + 1)


Deci x8 = m(x) + (x4 + x3 + x + 1) ⟹
x8 mod m(x) = x4 + x3 + x + 1 (*)

Fie A = (a7 a6 ... a1 a0) un element în GF(28). Biții {a7, a6, a5, a4, a3, a2, a1, a0} sunt coeficienții
polinomului de gradul 7:
f(x) = a7 x7 + a6 x6 + a5 x5 + a4 x4 + a3 x3 + a2 x2 + a1 x + a0
{02}• A = {00000010}• A, care se scrie în formă polinomială:
x × f(x) = (a7 x8 + a6 x7 + a5 x6 + a4 x5 + a3 x4 + a2 x3 + a1 x2 + a0 x) mod m(x)

Caz 1: dacă a7 = 0 ⟹ rezultatul este un polinom de gradul 7, deci un polinom în formă redusă:
a6 x7 + a5 x6 + a4 x5 + a3 x4 + a2 x3 + a1 x2 + a0 x + 0, iar echivalentul binar este: (a6 ... a1 a00), ceea
ce reprezintă o deplasare la stânga cu un bit.

28
Caz 2: dacă a7 = 1 , conform ecuației (*):
(x8 + a6 x7 + a5 x6 + a4 x5 + a3 x4 + a2 x3 + a1 x2 + a0 x) mod m(x) =
x8 mod m(x) + (a6 x7 + a5 x6 + a4 x5 + a3 x4 + a2 x3 + a1 x2 + a0 x) =
(x4 + x3 + x + 1) + (a6 x7 + a5 x6 + a4 x5 + a3 x4 + a2 x3 + a1 x2 + a0 x)
iar echivalentul binar este: (00011011) ⨁ (a6 ... a1 a00),
ceea ce reprezintă o deplasare la stânga cu un bit, urmată de o combinare prin operația XOR cu
(00011011)

Obs: Această operație de înmulțire se regăsește în construcția tabelului constantei Ci. Constanta Ci este
diferită la fiecare rundă și este definită ca:
Ci = (C[i] , 0 , 0 , 0), unde: C[1] = 1
C[i] = 2• C[i-1], înmulțirea fiind definită în câmpul GF(28)
sau, echivalent în hexazecimal:
Ci = ({02}i , {00} , {00} , {00})

De exemplu, în constanta C8 : C[8] = {80}, iar C[9] se va calcula conform formulei de mai sus:
C[9] = {02}•{80} = {00000010}•{1000}{0000} = {00000010}•{10000000} =
{00000000}⨁{00011011} = {00011011} = {0001}{1011} = 1B
C[10] = {02}• C[9] = {02}•{1B} = {02}•{00011011} = {00110110} = {0011}{0110} = {36}

c) cu 3:
Fie A = (a7 a6 ... a1 a0) un element în GF(28):
{03}• A = {00000011}• A, care se scrie în formă polinomială:
(x+1) × f(x) = x × f(x) + f(x) = {02}• A ⨁ {01}• A = {02}• A ⨁ A

Obs: Toate cele trei operații de înmulțire se regăsesc în Transformarea MixColumn (MC):
c0,0 c0,1 c0,2 c0,3 2 3 1 1 b0,0 b0,1 b0,2 b0,3
c1,0 c1,1 c1,2 c1,3 = 1 2 3 1 ⋅ b1,0 b1,1 b1,2 b1,3 ⟺
c2,0 c2,1 c2,2 c2,3 1 1 2 3 b2,0 b2,1 b2,2 b2,3
c3,0 c3,1 c3,2 c3,3 3 1 1 2 b3,0 b3,1 b3,2 b3,3

c0, j= (2 ⋅ b0, j) ⊕(3 ⋅ b1, j) ⊕b2, j⊕b3, j , j = 0, ..., 3


c1, j= b0, j⊕(2 ⋅ b1, j) ⊕(3 ⋅ b2, j) ⊕b3, j , j = 0, ..., 3
c2, j= b0, j⊕b1, j⊕(2 ⋅ b2, j) ⊕(3 ⋅ b3, j) , j = 0, ..., 3
c3, j= (3 ⋅ b0, j) ⊕b1, j⊕b2, j⊕(2 ⋅ b3, j) , j = 0, ..., 3

29
Exemplu de calcul în transformarea MixColumn (MC):
c0,0 c0,1 c0,2 c0,3 2 3 1 1 87 58 D2 BC
c1,0 c1,1 c1,2 c1,3 = 1 2 3 1 ⋅ 6E 76 CE AD ⟺
c2,0 c2,1 c2,2 c2,3 1 1 2 3 46 21 75 B5
c3,0 c3,1 c3,2 c3,3 3 1 1 2 A6 41 95 F2

c0,0 = ({02} • {87}) ⊕ ({03} • {6E}) ⊕ {46} ⊕ {A6} = {47}


{02}•{87} = (00000010)•(10000111) = (00001110)⨁(00011011) = (0001 0101)
{03}•{6E} = {6E}⊕({02} • {6E}) = (0110 1110) ⊕(1101 1100) = (1011 0010)
{46} = (01000110)
{A6} = (10100110)
(01000111) = {47}

30
Funcții Hash în criptografie

O funcție hash criptografică este o funcție H care primește ca intrare mesaje de dimensiune
variabilă și returnează un șir biți de lungime fixă ca ieșire. În funcție de funcția folosită, ieșirea poate
avea 128, 160, 256 sau 512 biți. Ieșirea funcției hash se numește valoare hash (”hash value”) și poate fi
considerată un fel de „amprentă digitală” sau identificator al mesajului.

(preimagine) (imaginea intrării)

y = H(x) |H(x)| = 128....256


-- -- -- x-- -- --- H

Funcțiile hash se mai numesc funcții de compresie sau de rezumat al mesajului (iar valoarea hash
se mai numește rezumat al mesajului, ”message digest”), deoarece practic comprimă secvențe de
caractere cu diferite lungimi (foarte mari), în secvențe de lungime fixă (exprimate în binar au același
număr de biți). Deci un număr infinit de mesaje posibile sunt comprimate într-un număr finit de valori
de hash ⟹ funcția nu poate fi injectivă ⟹ situații în care pentru două valori de intrare x și x’ cu x≠ x’
să se obțină H(x) = H(x’), caz în care apare o coliziune. Pentru o funcție hash criptografică se impune
ca determinarea unei coliziuni să fie nefezabilă computațional.

► Proprietățile funcțiilor hash criptografice:


- eficiența: Pentru a fi utilă, funcția trebuie să fie eficientă computațional și cât mai simplu de
implementat. De asemenea, funcția trebuie să îndeplinească următoarele cerințe de securitate:
- cerințe de securitate:
1) Rezistența la preimagine: pentru orice valoare hash y, nu se poate găsi preimaginea acesteia, mai
exact, determinarea unui mesaj x pentru care H(x) = y ar trebui să fie nefezabilă computațional. Se spune
că funcția este neinversabilă sau unidirecțională (”one way function”).
2) Rezistența la a doua preimagine: date fiind x si H(x), atunci nu este posibil din punct de vedere
computațional determinarea unei valoari x’ ≠ x a.î. H(x) = H(x’) (rezistență la coliziuni în sens slab)
3) Rezistența la coliziune: Ar trebui să fie imposibil din punct de vedere computațional determinarea
oricăror două valori x ≠ x’ a.î. H(x) = H(x’) (rezistență la coliziuni în sens puternic)
Obs:
- O funcție hash rezistentă la coliziuni în sens puternic este rezistentă la coliziuni în sens slab.
- S-a demonstrat matematic faptul că dacă o funcție hash este rezistentă la coliziuni în sens puternic,
atunci ea este de tip ”one-way”.
- cerințe de aleatorism: funcțiile hash criptografice pot fi utilizate pentru derivarea cheilor și generarea
de numere de pseudo-aleatoare, și în acest sens se să verifică faptul că o funcție hash dată generează
valori pseudo-aleatoare.

31
► Utilizarea funcțiilor hash criptografice:
- autentificarea mesajelor: destinatarul unui mesaj (fișier) vrea să se asigure că mesajul primit de la
expeditor nu a fost alterat. Astfel, la primirea mesajului, destinatarul poate recalcula valoarea hash a
mesajului și poate compara rezultatul cu hash-ul atașat mesajului. Dacă cele două nu se potrivesc exact,
acest lucru indică faptul că s-a produs o modificare a mesajului.
Obs: valoarea hash ar trebui protejată, astfel încât dacă un adversar alterează sau înlocuiește mesajul, să
nu poată modifica și valoarea hash pentru a păcăli destinatarul.
Astfel, criptarea și decriptarea valorii de hash poate fi făcută:
- prin utilizarea unui criptosistem cu cheie publică;
- printr- un criptosistem simetric, cu cheia k, cunoscută de ambii:

Expeditor Destinatar
(trimite mesaj x) (recepționează mesaj x’)

Expeditor: - generează y = H(x) Destinatar: - recepționează x’ + z


- criptează y cu cheia k: z = ek(y) - decriptează z: y = dk(z)
- trimite x + z - generează y’= H(x’)

y = y’ ⟹ mesajul nu a fost alterat (x = x’)


Obs: O altă variantă de autentificare a mesajelor ar fi ca mesajul plus codul hash concatenat să fie criptat
înainte de transmitere, folosind criptarea simetrică.
- stocarea parolelor: cea mai întâlnită metodă de autentificare a unui utilizator la sisteme și aplicații este
prin ”nume utilizator” și ”parolă”.
Parolele nu sunt stocate sub formă de text clar, ci sub formă de valori hash. La fiecare autentificare în
sistem, utilizatorul introduce cele două valori. Dacă ”nume utilizator” se regăsește stocat în baza de date
a serverului și valoarea hash a parolei introduse coincide cu valoarea hash stocată într-un tabel de pe
server, utilizatorul este autentificat și i se acordă permisiunea de a utiliza sitemul. Având în vedere că
baza de date stochează doar un hash al parolei, iar hash-urile nu sunt reversibile (fiind funcții de tip ”one-
way”), parola nu poate fi preluată din baza de date.
Windows stochează conturile userilor locali (”nume utilizator” și ”parolă”) sub formă de valori hash în
fișierul Security Accounts Manager (SAM) din directorul Windows System
( c:\windows\system32\config\SAM). Accesul la baza de date este blocat de către SO, baza neputând fi
copiată cât timp sistemul este pornit.
Windows folosește două metode de hashing pentru convertirea parolelor:
- LM- (LAN Manager) hash (Windows 95, 98): bazat pe criptarea DES; nu mai este actual: metodă
vulnerabilă la atacuri de tip forță-brută, fiind ușor de spart pentru parole scurte
- NTLM hash v1 și v2: bazat pe seria de algoritmi de hashing MD.
Exemplu de valoare hash NTLM pentru o parolă: 28163E8B2EB5856172BE5731635309B5.

- semnături digitale.
32
Atacuri de tip forță-brută asupra funcțiilor hash

În cazul unei funcții hash, un atac de tip forță-brută depinde doar de lungimea în biți a valorii
hash. Datorită faptului că dacă o funcție hash este rezistentă la coliziuni în sens puternic, atunci ea este
de tip ”one-way” și este rezistentă la coliziuni în sens slab, trebuie analizată rezistența funcției la
coliziuni în sens puternic: identificarea a două valori x și x’ a.î. valorile lor hash să fie egale, adică
H(x)=H(x’).
În acest sens trebuie calculat numărul minim de biți pe care trebuie să-l aibă o amprentă digitală
pentru a împiedica pe cineva să poată găsi două mesaje cu aceeași valoare hash. S-a demonstrat
matematic faptul că dacă valoarea hash are n biți, ar fi nevoie de 2n/2 mesaje alese aleator pentru a
identifica două mesaje cu aceeași valoare hash. Astfel, dacă se utilizează un cod hash pe 64 de biți,
nivelul de efort necesar este numai de ordinul 232. Iar pentru o valoare de 160 biți, ar fi nevoie de 280 ≃
1.2E24 mesaje aleatoare, ceea ce este considerat nefezabil computațional.
Acest calcul se bazează pe un paradox matematic, numit ”paradoxul zilei de naștere” (”the
birthday paradox”): Care este dimensiunea minimă a unui grup de oameni pentru ca 2 dintre ei să aibă
aceeași zi de naștere (din cele 365 de zile ale anului), cu probabilitate 1/2 ?
Se poate demonstra că este nevoie de 23 de oameni:
Fie P (A) = probabilitatea ca cel puțin două persoane din grup să aibă aceeași zi de naștere.
P (A’) = probabilitatea evenimentului contrar: probabilitatea ca oricare două persoane din grup să nu
aibă aceeași zi de naștere, deci probabilitatea să nu existe coliziuni
P (A) = 1 - P (A’) și se va calcula P (A’):
Pentru un grup de 23 persoane: P (A’) = evenimentul: toate cele 23 de persoane au zile de naștere diferite
- evenimentul E1: persoana 1 are o zi de naștere, care are loc cu probabilitatea 1. P(E1) = 1
- evenimentul E2: persoana 2 nu are aceeași zi de naștere ca persoana 1. P(E2) = 364/365, fiind numărul
de zile permis, împărțit la numărul de zile din care se poate alege
- evenimentul E3: persoana 3 nu are aceeași zi de naștere ca persoana 1 și persoana 2. P(E3) = 363/365,
fiind numărul de zile permis, împărțit la numărul de zile din care se poate alege
-----------------
- evenimentul E22: persoana 23 nu are aceeași zi de naștere ca persoanele de la 1 la 22. P(E23) = 343/365,
fiind numărul de zile permis, împărțit la numărul de zile din care se poate alege.
Probabilitatea producerii simultane a evenimentelor E1, E2, ..., E23 = P(E1)⋅ P(E2)⋅.....⋅ P(E23) = P(A’)
365 364 363 343
P(A’) = P(E1)⋅ P(E2)⋅ P(E3)⋅ .....⋅ P(E23) =    .........  ≃ 0.4927 ⟹
365 365 365 365
P(A) = 0.5073 (50.73%)
Pornind de la acest rezultat și generalizând, s-a demonstrat matematic că dacă se aleg aleator
valori dintr-o mulțime de elemente numerotate de la 1 la n, probabilitatea de a realege un element
depășește 0.5 (50%) după n alegeri. Atunci, pentru o amprentă digitală de n biți, există 2n posibile
valori diferite și ar fi nevoie de 2 n mesaje alese aleator pentru a identifica două mesaje cu aceeași
valoare hash.

33
Construcția unei funcții hash criptografice

Multe funcții hash moderne (exemplu: familia de funcții Message Digest și Secure Hash
Algorithm) funcționează pe un principiu iterativ dezvoltat de Ralph Merkle și Ivan Damgard:
- mesajul de intrare m este segmentat într-o serie de k blocuri de dimensiune egală cu q; ultimul bloc va
fi completat prin operația de ”padding” cu zerouri și reprezentarea binară a lungimii mesajului m.
- blocurile sunt procesate secvențial printr-o funcție auxiliară: funcție de compresie f care ia ca intrare
două blocuri, unul de q biți și altul de n biți (valoare de legătură - ieșirea de la pasul anterior - ”chaining
value” - CV) și produce ca ieșire un bloc de n biți.
Obs: n < q , funcția f realizează o compresie
- se definește un vector de inițializare (IV – ”Initialization Vector”) : bloc cu n biți aleși aleator.
- valoarea hash a mesajului de intrare este ieșirea ultimei iterații a funcției de compresie.

Structura unei funcții hash criptografice: construcția Merkle-Damgard

Iterațiile algoritmului de construcție a funcției:


CV1 = IV
CVi = f (CVi-1, mi-1) i = 2, ..., k+1
CVk+1 = H(m)
Problema care rămâne de rezolvat: proiectarea funcției de compresie f, rezistente la coliziuni,
care funcționează pe intrări de o anumită dimensiune fixă.
Construcția se bazează pe scheme derivate din ecuația: CVi = f (CVi-1, mi-1), care se
implementează printr-un cifru bloc, E:

CVi = f (CVi-1, mi-1) CVi = E (x, y) ⨁ z


cifru cheie text
bloc clar
Cele mai utilizate scheme sunt:
CVi = E (CVi-1, mi-1) ⨁ CVi-1 schema Matyas–Meyer–Oseas
CVi = E (mi-1, CVi-1) ⨁ mi-1 schema Davies–Meyer
CVi = E(CVi-1, mi-1) ⨁ CVi-1 ⨁ mi-1 schema Miyaguchi–Preneel
34
schema Matyas–Meyer–Oseas schema Davies–Meyer schema Miyaguchi–Preneel

Funcția hash criptografică MD5 (”Message Digest 5”)

► Proiectată în baza schemei Merkle-Damgard în 1992 de Ronald Rivest, pentru a fi utilizată în


semnătura digitală
► calculele sunt efectuate pe cuvinte de 32 de biți;
► operează cu blocuri de mesaj de 512 biţi:
mesajul de intrare M este completat prin ”padding” cu un bit de 1 și apoi cu numărul necesar de 0-uri,
a.î. astfel încât lungimea sa să fie egală cu 448 modulo 512 (o lungime de 448 + 512 × n biți); apoi un
număr de 64 de biți (care reprezintă lungimea mesajului de intrare) este adăugat la sfârșitul mesajului.
► vectorul de inițializare (IV ) din schema Merkle-Damgard: un buffer de 4 cuvinte de 32 de biți
(A, B , C , D), care va prelua valori intermediare după fiecare transformare a unui bloc; acestea vor fi
valorile de legătură CVi în cadrul schemei Merkle-Damgard
Valorile CV0: A: 01 23 45 67 B: 89 ab cd ef C: fe dc ba 98 D: 76 54 32 10
► ecuația CVi = f (CVi-1, mi-1) implementează schema Davies-Meyer: CVi = E (mi-1, CVi-1) ⨁ mi-1
unde funcția de compresie este un cifru bloc cu 4 runde, fiecare folosind o funcție de rundă diferită:

F(X, Y,Z) = (X ˄ Y) ˅ (¬X) ˄ Z) ˅ indică operația logică OR


G(X, Y,Z) = (X ˄ Z) v (Y ˄ (¬Z)) unde: ˄ indică operația logică AND
H(X, Y,Z) = X ⨁Y ⨁ Z ¬ indică operația logică NOT
I(X, Y,Z) = Y ⨁ (X ˅ (¬Z) ⨁ indică operația logică XOR

► Operațiile unei runde (fiecare rundă se efectuează de 16 ori deoarece blocul procesat este de 512
biţi, iar funcţia de rundă procesează 32 de biţi la un moment dat):
- funcția de rundă corespunzătoare F, G, H sau I
- o deplasare circulară la stânga <<<
- o adunare modulo 232 a constantei {Ti}, Ti = 232⋅abs(sin(i)), i în radiani, i = 1, ..., 64
- o adunare modulo 232 a cuvântului de 32 de biți {Mi}ale mesajului cu (A, B, C, D)
35
► în urma procesării ultimului bloc ⟹ valoarea finală pentru valorile (A, B, C, D) = CVk+1 = H(m).

Operaţiile unei runde MD5

În momentul de față se consideră că MD5 nu mai oferă un nivel de securitate foarte ridicat, fiind
descoperite o serie de coliziuni. Un atac de tip ”birthday” necesită 264 evaluări pentru a identifica două
mesaje cu aceeași valoare hash.
A fost înlocuit cu funcții hash din familia SHA (”SECURE HASH ALGORITHM”):
- SHA1 și SHA2 proiectate în baza schemei Merkle-Damgard
- SHA3 (specificații complete: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf):
FIPS 202 specifică familia de funcții (SHA-3). Fiecare dintre funcțiile SHA-3 se bazează pe o instanță
a algoritmului KECCAK pe care NIST l-a selectat ca câștigător al competiției publice lansată la 2
noiembrie 2007.
Familia SHA-3 este formată din patru funcții hash criptografice și două funcții ”extendable-output
functions - XOFs”. Funcțiile hash criptografice se numesc SHA3-224, SHA3-256, SHA3- 384 și SHA3-
512; iar funcțiile XOF se numesc SHAKE128 și SHAKE256.

36

S-ar putea să vă placă și