Advaned Enryption Standard (AES)
Latar Belakang DES dianggap udah tidak aman. Perlu diuulkan tandard algoritma baru ebagai pengganti DES. National Intitute of Standard and Tehnology (NIST) menguulkan kepada Pemerintah Federal AS untuk ebuah tandard kriptografi kriptografi yang baru. NIST mengadakan lomba membuat tandard algoritma kriptografi yang baru. Standard terebut kelak diberi nama Advaned Enryption Standard (AES). 2
Peryaratan algoritma baru: 1. Termauk ke dalam kelompok algoritma kriptografi imetri berbai ipher blok. 2. Seluruh ranangan algoritma haru publik (tidak dirahaiakan) 3. Panjang kuni flekibel: 128, 192, dan 256 bit. 4. Ukuran blok yang dienkripi adalah 128 bit. 5. Algoritma dapat diimplementaikan baik ebagai oftware maupun hardware. 3
Lima finali lomba: 1. Rijndael (dari Vinent Rijmen dan Joan Daemen Belgia, 86 uara) 2. Serpent (dari Ro Anderon, Eli Biham, dan Lar Knuden Inggri, Irael, dan Norwegia, 59 uara). 3. Twofih (dari tim yang diketuai oleh Brue Shneier USA, 31 uara) 4. RC6 (dari Laboratorium RSA USA, 23 uara) 5. MARS (dari IBM, 13 uara) 4
Pada bulan Oktober 2000, NIST mengumumkan untuk memilih Rijndael (dibaa: Rhine-doll) Pada bulan November 2001, Rijndael ditetapkan ebagai AES Diharapkan Rijndael menjadi tandard kriptografi yang dominan paling edikit elama 10 tahun. 5
Speifikai Algoritma Rijndael Rijndael mendukung panjang kuni 128 bit ampai 256 bit dengan tep 32 bit. Panjang kuni dan ukuran blok dapat dipilih eara independen. Setiap blok dienkripi dalam ejumlah putaran tertentu, ebagaimana halnya pada DES. Karena AES menetapkan panjang kuni adalah 128, 192, dan 256, maka dikenal AES-128, AES-192, dan AES-256. 6
Panjang Kuni (Nk word) Ukuran Blok (Nb word) Jumlah Putaran (Nr) AES-128 4 4 10 AES-192 6 4 12 AES-256 8 4 14 Catatan: 1 word = 32 bit Seara de-fakto, hanya ada dua varian AES, yaitu AES-128 dan AES-256, karena akan angat jarang pengguna menggunakan kuni yang panjangnya 192 bit. 7
Dengan panjang kuni 128-bit, maka terdapat ebanyak 2 128 = 3,4 10 38 kemungkinan kuni. Jika komputer terepat dapat menoba 1 juta kuni etiap detik, maka akan dibutuhkan waktu 5,4 10 24 tahun untuk menoba eluruh kuni. Jika terepat yang dapat menoba 1 juta kuni etiap milidetik, maka dibutuhkan waktu 5,4 10 18 tahun untuk menoba eluruh kuni. 8
Algoritma Rijndael Tidak eperti DES yang berorientai bit, Rijndael beroperai dalam orientai byte. Setiap putaran mengunakan kuni internal yang berbeda (diebut round key). Eniphering melibatkan operai ubtitui dan permutai. 9
Gari bear Algoritma Rijndael yang beroperai pada blok 128-bit dengan kuni 128-bit adalah ebagai berikut (di luar proe pembangkitan round key): 1. AddRoundKey: melakukan XOR antara tate awal (plaintek) dengan ipher key. Tahap ini diebut juga initial round. 2. Putaran ebanyak Nr 1 kali. Proe yang dilakukan pada etiap putaran adalah: a. SubByte: ubtitui byte dengan menggunakan tabel ubtitui (S-box). b. ShiftRow: pergeeran bari-bari array tate eara wrapping.. MixColumn: mengaak data di maing-maing kolom array tate. d. AddRoundKey: melakukan XOR antara tate ekarang round key. 3. Final round: proe untuk putaran terakhir: a. SubByte b. ShiftRow. AddRoundKey 10
11
#define LENGTH 16 /* Jumlah byte di dalam blok atau kuni */ #define NROWS 4 /* Jumlah bari di dalam tate */ #define NCOLS 4 /* Jumlah kolom di dalam tate */ #define ROUNDS 10 /* Jumlah putaran */ typedef unigned har byte; /* unigned 8-bit integer */ rijndael (byte plaintext[length], byte iphertext[length], byte key[length]) { int r; /* penaah pengulangan */ byte tate[nrows][ncols]; /* tate ekarang */ trut{byte k[nrows][ncols];} rk[rounds + 1]; /* kuni pada etiap putaran */ KeyExpanion(key, rk); /* bangkitkan kuni etiap putaran */ CopyPlaintextToState(tate, plaintext); /* iniialiai tate ekarang */ AddRoundKey(tate, rk[0]); /* XOR key ke dalam tate */ for (r = 1; r<= ROUNDS - 1; r++) { SubByte(tate); /* ubtitui etiap byte dengan S-box */ ShiftRow(tate); /* rotaikan bari i ejauh i byte */ MixColumn(tate); /* aak maing-maing kolom */ AddRoundKey(tate, rk[r]); /* XOR key ke dalam tate */ } SubByte(tate); /* ubtitui etiap byte dengan S-box */ ShiftRow(tate); /* rotaikan bari i ejauh i byte */ AddRoundKey(tate, rk[rounds]); /* XOR key ke dalam tate */ CopyStateToCiphertext(iphertext, tate); /* blok iphertek yang dihailkan */ } 12
Algoritma Rijndael mempunyai 3 parameter: 1. plaintext : array berukuran 16-byte, yang berii data maukan. 2. iphertext : array berukuran 16-byte, yang berii hail enkripi. 3. key : array berukuran 16-byte, yang berii kuni iphering (diebut juga ipher key). Dengan 16 byte, maka blok data dan kuni yang berukuran 128-bit dapat diimpan di dalam array 16 elemen (16 8 = 128). 13
Blok plaintek diimpan di dalam matrix of byte yang bernama tate dan berukuran NROWS NCOLS. Plaintek 128-bit Untuk blok data 128-bit, ukuran tate 4 4. tate 14
Pada awal enkripi, 16-byte data maukan, in 0, in 1,, in 15 dialin ke dalam array tate (direaliaikan oleh fungi: CopyPlaintextToState(tate, plaintext)) input byte tate array output byte in 0 in 4 in 8 in 12 S 0,0 S 0,1 S 0,2 S 0,3 out 0 out 4 out 8 out 12 in 1 in 5 in 9 in 13 S 1,0 S 1,1 S 1,2 S 1,3 out 1 out 5 out 9 out 13 in 2 in 6 in 10 in 14 S 2,0 S 2,1 S 2,2 S 2,3 out 2 out 6 out 10 out 14 in 3 in 7 in 11 in 15 S 3,0 S 3,1 S 3,2 S 3,3 out 3 out 7 out 11 out 15 15
Contoh: (elemen tate dan kuni dalam notai HEX) 16
Tranformai SubByte() SubByte() memetakan etiap byte dari array tate dengan menggunakan S-box. 17
18
Tranformai ShiftRow() Tranformai ShiftRow() melakukan pergeeran eara wrapping (iklik) pada 3 bari terakhir dari array tate. Jumlah pergeeran bergantung pada nilai bari (r). Bari r = 1 digeer ejauh 1 byte, bari r = 2 digeer ejauh 2 byte, dan bari r = 3 digeer ejauh 3 byte. bari r = 0 tidak digeer. 19
Geer bari ke-1: Hail pergeeran bari ke-1 dan geer bari ke-2: 20
Hail pergeeran bari ke-2 dan geer bari ke-3: Hail pergeeran bari ke-3: 21
Tranformai MixColumn() Tranformai MixColumn() mengalikan etiap kolom dari array tate dengan polinom a(x) mod (x 4 + 1). Setiap kolom diperlakukan ebagai polinom 4-uku pada GF(2 8 ). a(x) yang ditetapkan adalah: a(x) = {03}x 3 + {01}x 2 + {01}x + {02} 22
23 (x) = a(x) (x) 02 01 01 03 03 02 01 01 01 03 02 01 01 01 03 02 ' ' ' ' 3, 2, 1, 0, 3, 2, 1, 0,, 3 2, 1, 0,, 0 ) ({03} ) ({02} ', 3 2, 1, 0,, 1 ) ({03} ) ({02} ' ) ({03} ) ({02} ', 3 1, 1, 0,, 2 ) ({02} ) ({03} ', 3 1, 0, 0,, 3
Hail tranformai ShiftRow() ebelumnya: Operai MixColumn() terhadap kolom pertama: 24
Hail tranformai MixColumn() eluruhnya: 25
Tranformai AddRoundKey() Tranformai ini melakukan operai XOR terhadap ebuah round key dengan array tate, dan hailnya diimpan di array tate. 26
27
28
29
30