ENKRIPSI DATA MENGGUNAKAN
ALGORITMA SERPENT
Disusun Oleh :
Edi Permadi Budiono
Sudirman
Irfan Sa’di
Angga Tri Cahyono
UNIVERSITAS MARITIM RAJA ALI HAJI
FAKULTAS TEKNIK
Software Engineering
Kriptografi adalah suatu ilmu yang mempelajari bagaimana cara menjaga agar data atau pesan tetap aman saat dikirimkan, dari pengirim ke penerima tanpa mengalami gangguan dari pihak ketiga. Menurut Bruce Scheiner dalam bukunya "Applied Cryptography", kriptografi adalah ilmu pengetahuan dan seni menjaga message-message agar tetap aman (secure). Konsep kriptografi sendiri telah lama digunakan oleh manusia misalnya pada peradaban Mesir dan Romawi walau masih sangat sederhana. Prinsip-prinsip yang mendasari kriptografi yakni:
• Confidelity (kerahasiaan) yaitu layanan agar isi pesan yang dikirimkan
tetap rahasia dan tidak diketahui oleh pihak lain (kecuali pihak pengirim, pihak penerima / pihak-pihak memiliki ijin). Umumnya hal ini dilakukan dengan cara membuat suatu algoritma matematis yang mampu mengubah data hingga menjadi sulit untuk dibaca dan dipahami.
• Data integrity (keutuhan data) yaitu layanan yang mampu
mengenali/mendeteksi adanya manipulasi (penghapusan, pengubahan atau penambahan) data yang tidak sah (oleh pihak lain).
• Authentication (keotentikan) yaitu layanan yang berhubungan
dengan identifikasi. Baik otentikasi pihak-pihak yang terlibat dalam pengiriman data maupun otentikasi keaslian data/informasi.
• Non-repudiation (anti-penyangkalan) yaitu layanan yang dapat mencegah
suatu pihak untuk menyangkal aksi yang dilakukan sebelumnya (menyangkal bahwa pesan tersebut berasal dirinya).
Berikut adalah istilah-istilah yang digunakan dalam bidang kriptografi :
• Plaintext (M) adalah pesan yang hendak dikirimkan (berisi data asli). • Ciphertext (C) adalah pesan ter-enkrip (tersandi) yang merupakan hasil
enkripsi.
• Enkripsi (fungsi E) adalah proses pengubahan plaintext menjadi
• Dekripsi (fungsi D) adalah kebalikan dari enkripsi yakni mengubah
ciphertext menjadi plaintext, sehingga berupa data awal/asli.
• Kunci adalah suatu bilangan yang dirahasiakan yang digunakan dalam
proses enkripsi dan dekripsi.
Kriptografi itu sendiri terdiri dari dua proses utama yakni proses enkripsi dan proses dekripsi. Seperti yang telah dijelaskan di atas, proses enkripsi mengubah plaintext menjadi ciphertext (dengan menggunakan kunci tertentu) sehingga isi informasi pada pesan tersebut sukar dimengerti.
Gambar 2.1 Diagram proses enkripsi dan dekripsi
Peranan kunci sangatlah penting dalam proses enkripsi dan dekripsi (disamping pula algoritma yang digunakan) sehingga kerahasiaannya sangatlah penting, apabila kerahasiaannya terbongkar, maka isi dari pesan dapat diketahui.
Secara matematis, proses enkripsi merupakan pengoperasian fungsi E (enkripsi) menggunakan e (kunci enkripsi) pada M (plaintext) sehingga dihasilkan C (ciphertext), notasinya :
Sedangkan untuk proses dekripsi, merupakan pengoperasian fungsi D (dekripsi) menggunakan d (kunci dekripsi) pada C (ciphertext) sehingga dihasilkan M (plaintext), notasinya :
Dd(C) = M
Sehingga dari dua hubungan diatas berlaku :
Dd(Ee(M)) = M
Algoritma Simetri Serpent
Algoritma Serpent merupakan hasil kerjasama internasional yang melibatkan tiga negara Inggris, Israel, dan Norwegia melalui tiga buah universitasnya. Inggris dalam hal ini diwakili oleh Cambridge University sedangkan Israel diwakili oleh Haifa Israel dan Norwegia diwakili oleh University of Bergen. Algoritma ini dikembangkan oleh Ross Anderson dari Inggris, Eli Biham dari Israel, dan Lars Knudsen dari Norwegia.
Serpent merupakan algoritma cipher blok algoritma dengan 32 putaran jaringan Substitution-Permutation Network (SP-network) yang beroperasi pada empat word 32 bit, yang berarti ukuran bloknya adalah 128 bit. Untuk komputasi internal, semua nilai direpresentasikan dalam little-endian, di mana word pertama adalah least-significant word, dan word terakhir adalah most-significant word.
Serpent mendukung masukan kunci sepanjang 128 bit, 192 bit, dan 256 bit. Kenyataannya, dalam mekanisme penjadwalan kunci dibutuhkan kunci sepanjang 256 bit. Oleh karena itu, untuk masukan kunci sepanjang 128 bit dan 192 bit memerlukan mekanisme tambahan, yaitu padding. Padding menambahkan bit “1” pada bit terpenting (most significant bit) dan beberapa bit “0” sampai ukuran kunci mencapai 256 bit.
Untuk proses enkripsi, Serpent membutuhkan 32 upakunci 128 bit yang dinotasikan dengan K0, … , K32. Tahapan untuk mendapatkan ke-33 upakunci yaitu [SER09]:
1. Membagi kunci masukan K menjadi delapan bagian, masing-masing 32 bit yang dinotasikan dengan w-8, … , w-1
2. Membentuk 132 kunci antara (prekey) yang dinotasikan dengan w0, … , w131 melalui persamaan:
wi = (wi-8 wi-5 wi-3 wi-1 Ø i) <<< 11, Notasi Ø merupakan bagian kecil dari golden ratio ( + 1) / 2 atau 0x9e3779b9 dalam heksadesimal.
3. Membentuk 132 kunci putaran (round key) k0 sampai k131 yang dibentuk dari kunci antara yang dihasilkan dari proses sebelumnya dengan menggunakan S-boxes. S-boxes digunakan untuk mengubah kunci antara wi menjadi ki dengan ketentuan berikut ini :
{k0, k1, k2, k3} = S3 (w0, w1, w2, w3) {k4, k5, k6, k7} = S2 (w4, w5, w6, w7) {k8, k9, k10, k11} = S1 (w8, w8, w10, w11) {k12, k13, k14, k15} = S0 (w12, w13, w14, w15) . . . {k124, k125, k126, k127} = S4 (w124, w125, w126, w127) {k128, k129, k130, k131} = S3 (w128, w129, w130, w131)
Pembentukan kunci putaran untuk tahap (1) sampai tahap (3) dapat digambarkan dalam gambar ini.
4. Membentuk kunci 128 bit Ki (untuk I € {0, … , 32}) dari 32 bit nilai kj dengan cara: Ki = {k4i, k4i+1, k4i+2,k4i+3}
5. Menerapkan IP pada upakunci yang dihasilkan untuk menempatkan bit-bitnya ke dalam urutan yang sesuai. Ki = IP (Ki)
Algoritma Serpent ini terdiri dari : 1. Initial Permutation (IP)
2. Terdiri dari 32 putaran, masing-masing terdiri dari sebuah operasi pengacakan kunci, operasi menggunakan S-Box, dan transformasi linear. Pada putaran terakhir, transformasi ini
digantikan dengan penambahan operasi pengacakan kunci. 3. Final Permutition (FP)
IP atau Initial Permutation diterapkan pada plainteks P menghasilkan B0, yang merupakan input dari putaran pertama, yaitu putaran-0 (putaran diberi nomor dari 0 sampai 31). Hasil dari putaran pertama (putaran-0) dinamakan B1, hasil putaran kedua (putaran-1) dinamakan B2, dan seterusnya sampai B32. Permutasi akhir akan menghasilkan cipherteks C.
Masing-masing fungsi putaran Ri (i = 0,...,31) hanya menggunakan sebuah S-Box ter-replikasi. Misalnya, R0 menggunakan S0, 32 copy yang diterapkan secara paralel, sehingga copy dari S0 menggunakan bit 0,1,2, dan 3 dari B0 ⊕ K0 sebagai input dan mengembalikan empat bit pertama dari vektor intermediate sebagai output, copy selanjutnya menerima masukan bit ke 4-7 dari B0 ⊕ K0 dan mengembalikan empat bit selanjutnya dari vektor intemediate, dan seterusnya. Vektor intermediate kemudian ditransformasi menggunakan linear transformasi, menghasilkan B1.
Contoh Implementasi Algoritma Serpent dalam Pemmrograman Java :
public class CryptoUtils {
public static void main(String arg[]) { try {
java.io.StreamTokenizer Input=new java.io.StreamTokenizer(System.in);
System.out.print("Masukkan kata yang akan dienkripsi : "); Input.nextToken();
String hash =
byteArrayToHexString(CryptoUtils.computeHash(Input.sval)); System.out.println("Hasil enkripsinya (hex string) : " + hash); boolean ok = true;
String inputHash = ""; while (ok) {
System.out.print("Sekarang coba masukkan pasword rahasianya : " );
Input.nextToken(); inputHash =
byteArrayToHexString(CryptoUtils.computeHash(Input.sval)); if (hash.equals(inputHash)){
System.out.println("Mantabb! benerr BOSS"); ok = false;
else
System.out.println("Salah Gan, coba lagi...!"); }
}
catch (Exception e){ e.printStackTrace(); }
}
public static byte[] computeHash(String x) throws Exception { java.security.MessageDigest d =null; d = java.security.MessageDigest.getInstance("SHA-1"); d.reset(); d.update(x.getBytes()); return d.digest(); }
public static String byteArrayToHexString(byte[] b){ StringBuffer sb = new StringBuffer(b.length * 2); for (int i = 0; i < b.length; i++){
int v = b[i] & 0xff; if (v < 16) { sb.append('0'); } sb.append(Integer.toHexString(v)); } return sb.toString().toUpperCase(); } }
Hasil Programnya : (Jika Benar)