Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE DIPLOMĂ
Absolvent
Coordonator științific
Conf. Dr. Ing. Andrei Stan
Iași, 2019
DECLARAȚIE DE ASUMARE A AUTENTICITĂȚII
LUCRĂRII DE LICENȚĂ
CI MZ 297232
legitimat(ă)cu seria nr. ,CNP
1960626226715
Data Semnătura
Cuprins
Structura internă AES.....................................................................................................................7
SubBytes și InvSubBytes.........................................................................................................9
MixColumn și InvMixColumn..............................................................................................10
ShiftRows și InvShiftRows....................................................................................................10
AddRoundKey.......................................................................................................................10
KeySchedule..........................................................................................................................11
Integrarea modulelor de bază.....................................................................................................11
AES – Mediu de Verificare........................................................................................................12
Resurse Hardware Folosite........................................................................................................13
Simulare Formă de undă............................................................................................................13
Bibliografie................................................................................................................................13
Dezvoltarea unui modul de criptare
AES implementat pe FPGA
Olaru Mihai Alexandru
Rezumat
Lucrarea de față își propune studierea și implementarea într-o manieră hardware a unui
modul de criptare folosind AES (Advanced Encryption Standard) și sintetizarea acestuia pe un
FPGA.
AES este cel mai folosit algoritm simetric de criptare, datorită faptului că se poate
implementa relativ ușor în software și cu un cost redus în hardware.
Ca și specificații, AES lucrează cu blocuri de intrare pe 128 de biți, lungimea cheii poate
fi 128, 192, 256 biți, la baza sunt fundamente matematice din corpuri finite (Galois Fields), iar
algoritmul se termină după executarea unui număr de runde, în funcție de lungimea cheii.
În analiza lui s-au observat mai multe direcții precum: dezvoltarea unei arhitecturi
pipeline, fără feedback pentru a obține viteză de zeci de GigaBits pe secundă (mai ales pentru
criptarea canalelor de comunicare). A doua direcție a fost dezvoltarea unu arhitecturi compacte și
optimizarea unor bucăți din algoritm pentru a obține un cost minim (hardware). O altă tendință a
fost reutilizarea componentelor în operațiile de bază ale algoritmilor și descompunerea lor în
părți compune astfel încât, acceeași componentă să poată fi folosită și în procesul de criptare dar
și în cel de decriptare.
Corpuri Prime
Corpurile prime sunt cele mai intuitive exemple de corpuri finite, adică corpuri unde n=1.
Elementele corpurilor GF(p) pot fi reprezentate de întregii 0, 1, ..., p-1. Cele două operații ale
acestui corp sunt adunarea mod p și înmulțirea mod p.
Fie p un număr prim. Atunci GF(p) este un corp prim, sau un corp finit, corp Galois cu un număr
prim de elemente. Toate elementele diferite de 0 din GF(p) au un invers. Aritmetica în GF(p) este
făcută mod p.
Pentru a realiza operațiile de bază într-un corp prim, trebuie să urmăm regulile următoare:
adunarea și înmulțirea sunt realizate mod p, inversul aditiv pentru oricare element a este dat de
relația a + (-a) = 0 mod p, și cel multiplicativ al elementelor nenule este definit prin a * a-1 = 1.
Ca și exemplu se considera GF(5) = {1, 2, 3, 4}. Tabelele de mai jos descriu cum se pot realiza
operațiile pentru fiecare element din corp.
Adunare
+ 0 1 2 3 4 Adunare invers
0 0 1 2 3 4 −0 = 0
1 1 2 3 4 0 −1 = 4
2 2 3 4 0 1 −2 = 3
3 3 4 0 1 2 −3 = 2
4 4 0 1 2 3 −4 = 1
Înmulțire 4 0 4 3 2 1
Înmulțire invers
X 0 1 2 3 4
0 0 0 0 0 0 0−1 nu există
1 0 1 2 3 4 1−1 = 1
2 0 2 4 1 3 2−1 = 3
3 0 3 1 4 2 3−1 = 2
4−1 = 4
Un simplu și foarte important exemplu este dat de GF(2). Elementelui acestui corp de ordin doi
sunt 0 și 1, și operațiile disponibile sunt sub forma următoare:
Adunare Înmulțire
+ 0 1 x 0 1
0 0 1 0 0 0
1 1 0 1 0 1
Adunarea în GF(2) este echivalent cu o poartă XOR, iar înmulțirea este echivalentă cu o poartă
ȘI.
Extinderi Galois
În AES, corpul finit folosit are 256 de elemente și este descris ca fiind GF(2 8). Acest corp este
ales pentru că fiecare element poate fi reprezentat pe un byte. Fiecare byte de dată este tratat ca
un element individual din GF(28) și manipulează datele făcând calculele aritmetice în acest corp
finit.
Dacă ordinul acest ordin a corpului finit nu este prim, 2 8 nu este prim, adunarea și înmulțirea nu
poate fi reprezentată de și adunare și scăderea modulo 2 8. Pentru acest tip de corpuri finite, se
folosesc notații diferite și reguli de calcul diferit. Pentru a calcula exdinderea corpului, elemente
pot fi reprezentate ca și polinoame cu coeficienți în GF(2). Gradul polinomului folosit pentru
AES este 7 deoarece aceste este reprezentat în GF(28). Fiecare element poate fi reprezentat în
maniera următoare:
Fie elementul A din GF(28), A poate fi scris sub forma A(x) = a7x7+ ... a1x + a0, ai fiind
din GF(2) = {0, 1}. Este important de observat că fiecare polinom poate fi simplu salvat sub
formă de un vector de 8 biți (1 byte). Puterea lui x se deduce din poziția bitului în vector.
A = (a7, a6, a5, a4, a3, a2, a1, a0)
AES-ul operează cu elementele, coloanele sau rândurile din matrice curentă de stare.
Similiar, octeții din cheie se aranjează într-o matrice cu patru rânduri și patru(128 biți), șase(192
biți) sau opt(256 biți) coloane.
SubBytes și InvSubBytes
Operația SubBytes este o transformare individuală a fiecărui byte din starea internă.
Această operație este compusă din două operții de bază :
Transformare afină peste GF(2) calculată cu următoare ecuație b’= f(b) XOR
c, unde f este descrisă în ecuația din Figura 1.3(stânga), b este inversul
octetului iar c este o constantă egală cu 0x63. Pentru operația inversă
(InvSubBytes) se folosește ecuația din Figura 1.3(dreapta).
ShiftRows și InvShiftRows
Cele două funcții au rolul de a realiza un set de permutări pe rând în matrice de stare.
Atfel încât primul rând nu se permută, rândul al doile se permută cu o poziție la stânga,
rândul al treilea cu două poziții la stânga, iar ultimul rând se permută cu trei poziții la stânga.
AddRoundKey
Cele două date de intrare pentru această funcție sunt matricea curentă de stare și cheia internă
curentă. Cele două date de intrare sunt combinate folosind operația XOR. Această operație
este echivalentă cu adunarea in GF(2).
KeySchedule
g – este o funcție neliniară ce primește ca parametri de intrare patru octeți. Octeții sunt rotiți,
după care se aplică o transformare S-box și se adună(XOR pe biți) coeficienții rundei.
Coeficienții pe rundă sunt generați astfel:
RC[1] = x0 = (00000001)2,
RC[2] = x1 = (00000010)2,
...
9
RC[10] = x = (00110110)2
Celelalte trei cuvinte din W sunt calculate astfel:
W[4i + j] = W[4i + j – 1] + W[4(i-1) + j], i = 1, ..., 10; j = 1, 2, 3
Bibliografie