IMPLEMENTASI ALGORITMA AES PADA ENKRIPSI TEKS
A. Latar Belakang Algoritma AES (Advanced Encryption Standard) muncul akibat penggunaan standart enkripsi kriptografi simetri terdahulu (DES) yang dianggap sudah tidak aman lagi, karena dengan perangkat keras khusus kunci bisa ditemukkan dalam beberapa hari. National Institute of Standards and Technology (NIST) sebagai agency Departemen Perdagangan AS mengusulkan kepada Pemerintah Federal AS untuk sebuah standard kriptografi yang baru. Persyaratan yang diajukan oleh NIST mengenai standar baru yang diusulkan antara lain: 1.
Algoritma yang ditawarkan termasuk ke dalam kelompok algoritma kriptografi simetri berbasis cipher blok
2.
Seluruh rancangan algoritma harus public (tidak dirahasiakan)
3.
Panjang kunci fleksibel yaitu: 128,192 dan 256
4.
Ukuran blok yang dienkripsi adalah 128 bit
5.
Algoritma dapat diimplementasikan baik sebagai software maupun hardware
NIST menerima 15 proposal algoritma yang masuk. Konferensi diselenggarakan untuk menilai keamanan algoritma yang diusulkan. Pada bulan agustus 1998, NIST memilih 5 finalis yang didasarkan pada aspek keamanan algoritma, efisiensi, fleksibilitas dan kebutuhan memory. Kelima finalis tersebut adalah: 1.
Rijndael
2.
Serpent
3.
Twofish
4.
RC6
5.
MARS
Pada bulan oktober 2000, NIST menggumumkan untuk memilih Rijndael dan dinobatkan sebagai AES bulan november 2001 yang merupakan standart kriptografi yang dominan paling sediket 10 tahun.
B. Deksrisi Algoritma Rijndael AES Rijndael termasuk dalam jenis algoritma kriptografi yang sifatnya simetri dan cipher block.
Dengan
demikian
algoritma
ini mempergunakan
kunci
yang
sama
saat
enkripsi dan dekripsi serta masukan dan keluarannya berupa blok dengan jumlah bit tertentu. Rijndael mendukung berbagai variasi ukuran blok dan kunci yang akan digunakan. Namun Rijndael mempunyai ukuran blok dan kunci yang tetap sebesar 128, 192, 256 bit. Pemilihan ukuran blok data dan kunci akan menentukan jumlah proses yang harus dilalui untuk proses enkripsi dan dekripsi. Berikut adalah perbandingan jumlah proses
yang
harus dilalui untuk masing-masing masukan. Panjang kunci
Ukuran Blok
Jumlah Putaran
(Nk Words)
(Nb Words)
(Nr)
AES-128
4
4
10
AES-192
6
4
12
AES-256
8
4
14
Tabel 1. Jumlah putaran berdasarkan panjang kunci Algoritma Rinjdael menggunakan substitusi dan permutasi dan sejumlah putaran (chiper berulang). Setiap putaran menggunakan kunci internal yang berbeda (kunci setiap putaran disebut round key). Algoritma rinjdael beroperasi pada byte, tidak seperti pada DES yang beroperasi pada bit. Secara garis besar algoritma rijndael yang beroperasi pada blok 128-bit dengan kunci 128bit adalah sebagai berikut: 1.
AddRoundKey Melakukan XOR antara state awal (plainteks dengan cipher key). Tahap ini disebut juga
initial round 2.
Putaran sebanyak Nr-1 kali Proses yang dilakukan pada setiap putaran adalah:
a.
Subbytes: substitusi byte dengan menggunakan tabel substitusi (S-Box)
b.
ShiftRows: Pergeseran baris-baris array state secara wrapping
c.
MixColumns: Mengacak data di masing-masing kolom array state
d.
AddRoundKey: Melakukan XOR antara state sekarang round key
3.
Final Round: Proses untuk putaran terakhir
a.
Subbytes
b.
ShiftRows
c.
AddRoundKey
State Cipher Key 0
Initial Round
AddRoundKey
Round
1-SubBytes
0 2-ShiftRows
3-MixColumns
Round Key 0
9 4-AddRoundKey
Rounds
SubBytes
ShiftRows
Round Key 10
Final Round
AddRoundKey
Gambar 1. Proses Algoritma AES Rijndael C. Key Schedule Expansi cipher key menjadi round key dengan menggunakan rijndael’s key schedule. Ekspansi key digunakan untuk membentuk round key yang akan digunakan langkah-langkah enkripsi plainteks (state). Secara umum rijndael’s key schedule memanfaatkan beberapa operasi sebagai berikut:
1.
Rotate Operasi ini merupakan operasi pemindahan byte. Byte terujung dipindahkan ke ujung
lainnya tanpa mengubah keterurutan komponen lain 2.
Rcon Operasi ini merupakan operasi eksponensial dari bilangan bulat 2 dalam semesta rijndael
finite field. 3.
S-Box Substitusi s-box merupakan tabel yang mensubstitusikan nilai byte dengan nilai yang
ditentukan. Umumnya, iterasi tahapan rounds pada AES diulang sebanyak sembilan kali. Oleh karenanya, terdapat sebelas round key yang dibutuhkan dalam satu kali enkripsi state. Round key tersebut adalah sebuah cipher key pada initial round, sembilan lainnya pada tahapan rounds, serta satu round key yang digunakan pada final round. Operasi-operasi di atas kemudian diimplementasikan pada key schedule dan diulang sebanyak kebutuhan. Komponen byte paling kanan dari cipher key diambil dan di-rotate. Masing-masing komponen kemudian disubtitusi dengan acuan S- box.
Gambar 2. Proses Key Schedule D. Sub Bytes Proses SubBytes adalah dalam operasi ini setiap bytes yang akan dienkripsi dengan cara mengganti setiap bytes states dengan bytes pada sebuah tabel yang dinamakan tabel S-Box. Sebuah Tabel S-Box terdiri dari 16x16 baris dan kolom dengan masing-masing berukuran 1 bytes. Tabel S-Box diperlihatkan pada Gambar 2 dibawah ini :
Tabel 2. S-Box Sedangkan Proses SubBytes diperlihakan pada Gambar 3 dibawah ini :
Gambar 3. Proses SubBytes Seperti yang kita ketahui bahwa Algoritma AES merupakan Algoritma simetri yang berarti tabel substitusi yang dibutuhkan untuk mengeksripsi berbeda dengan untuk mendekripsi.
E. Sift Row Proses Shift Rows akan beroperasi pada tiap baris dari tabel state. Proses ini akan bekerja dengan cara memutar bytes-bytes pada 3 baris terakhir ( baris 1, 2, dan 3 ) dengan jumlah perputaran yang berbeda-beda. Baris 1 akan diputar sebanyak 1 kali, baris 2 akan diputar sebanyak 2 kali, dan baris 3 akan diputar sebanyak 3 kali. Sedangkan baris 0 tidak akan diputar. Proses ShiftRows perlihatkan pada Gambar 6 dibawah ini :
Gambar 4. Proses SiftRow F. Mix Columns Proses MixColumns akan beroperasi pada tiap kolom dari tabel state. Operasi ini menggabungkan 4 bytes dari setiap kolom tabel state dan menggunakan transformasi linier. Operasi Mix Columns memperlakukan setiap kolom sebagai polinomial 4 suku dalam Galois field dan kemudian dikalikan dengan c(x) modulo (x4+1), dimana c(x)=3x3+x2+x+2. Kebalikkan dari polinomial ini adalah c(x)=11x 3+13x2+9x+14. Operasi MixColumns juga dapat dipandang sebagai perkalian matrix. Langkah MixColumns dapat ditunjukkan dengan mengalikan 4 bilangan di dalam Galois field oleh matrix berikut ini.
Atau bila dijabarkan r0=2a0+a3+a2+3a1 r1=2a1+a0+a3+3a2 r2=2a2+a1+a0+3a3 a3=2a3+a2+a1+3a0 Operasi penjumlahan di atas dilakukan dengan operasi XOR, sedangkan operasi perkalian dilakukan dalam Galois field.
Gambar 5. Proses MixColumns
G. Add Round Key Pada proses ini subkey digabungkan dengan state. Proses penggabungan ini menggunakan operasi XOR untuk setiap byte dari subkey dengan byte yang bersangkutan dari state. Untuk setiap tahap, subkey dibangkitkan dari kunci utama dengan menggunakan proses key schedule. Setiap subkey berukuran sama dengan state yang bersangkutan. Proses AddRoundKey diperlihatkan pada gambar berikut.
Gambar 6. Proses Add Round Key H. Implementasi Program Penulis mengimplementasikan algoritma AES Rijndael ini ke dalam sebuah program sederhana untuk mengenkripsi sebuah inputan string. Program ini ditulis dengan menggunakan bahasa pemrograman Java. Algoritma AES sudah terintegrasi dengan bahasa pemrograman Java. Dalam Java Development Kit sudah tersedia paket class-class yang dapat digunakan untuk proses enkripsi maupun deskripsi menggunakan algoritma AES ini. Paket-paket class tersebut dapat dipelajari dalam dokumentasi Java Development Kit pada paket java.security.* dan javax.cripto.Chiper.
Gambar 7. Implementasi Program (Enkripsi) Melalui aplikasi sederhana ini kita dapat menginputkan sebuah string sembarang dan sebuah key yang panjangnya adalah 16 karakter (128 bit). Kemudian untuk melakukan enkripsi kita menekan tombol Enkripsi.
Gambar 8. Implementasi Program (Deskripsi)
Berikut adalah potongan kode program java yang mengimplementasikan algoritma AES untuk mengenkripsi sebuah inputan string. import java.security.*; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import sun.misc.*; public class SimpleAES { private static final String ALGORITHM = "AES"; private Key key = null; public String encrypt(String valueToEnc) throws Exception { Cipher c = Cipher.getInstance(ALGORITHM); c.init(Cipher.ENCRYPT_MODE, key); byte[] encValue = c.doFinal(valueToEnc.getBytes()); String encryptedValue = new BASE64Encoder().encode(encValue); return encryptedValue; } public String decrypt(String encryptedValue) throws Exception { Cipher c = Cipher.getInstance(ALGORITHM); c.init(Cipher.DECRYPT_MODE, key); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue); byte[] decValue = c.doFinal(decordedValue); String decryptedValue = new String(decValue); return decryptedValue; } public void generateKey(String inputKey) throws Exception { try { byte[] keyValue = inputKey.getBytes("UTF-8"); this.key = new SecretKeySpec(keyValue, ALGORITHM); } catch (Exception ex) { throw ex; } } }
I.
Daftar Pustaka
1.
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
2.
http://docstore.mik.ua/orelly/java-ent/jnut/ch26_01.htm
3.
Surian, Didi, Algoritma Kriptografi AES Rijndael,Jurnal Teknik Elektro, Vol. 8 No. 2, 97101