Implementasi Algoritma Vigenere Cipher Untuk Kriptografi Teks Menggunakan Pemrograman C++
Table of Contents
Biasanya, saya concern untuk meneliti dan mengulas Algoritma Hill Cipher, dengan berbagai varian matrix key dan platform yang telah dibuat. Karena sebenarnya seahlian saya hanya Pemrograman Java, maka jadilah segala pembahasan algoritma apapun saya terapkan di Java, baik dekstop via Netbeans maupun Android via Android Studio. Kali ini, saya mencoba hal baru. Pemrograman C++. Sebenarnya masih kerabat dekat Java. Sama-sama bisa object oriented programming. Namun dengan penulisan syntax yang berbeda, saya tetap harus belajar dari nol. Referensi yang saya gunakan adalah buku dari maestro kriptografi dari ITB, Dr. Rinaldi Munir. Pembahasan yang saya ulas adalah Algoritma Vigenere Cipher.
Algoritma Vigenere Cipher merupakan salah satu kriptografi klasik yang populer. Juga dikenal sebagai salah satu contoh cipher abjad banyak. Alasannya karena plainteks suatu karakter mampu dienkripsi menjadi cipherteks yang variatif. Misalkan plainteks i dapat dienkripsi menjadi U, J, T bahwan W. Asik bukan?
Gambar 1. Tabel Vigenere Cipher |
Perhatikan Gambar 1 yang merupakan tabel Vigenere Cipher! Anda hayati dan cermati, ada kumpulan abjad, ditulis horizontal dan vertikal secara berututan. Tiba-tiba ada huruf "A" sebagai titik temu dari huruf "N" yang ditarik secara horizontal dan vertikal. Prinsipnya sederhana, jika plainteks berawalan "N" dan kunci juga beralawan "N", maka bisa dipastikan bahwa cipherteks yang dihasilkan adalah "A". Jadi, cipherteks bisa diperoleh dari titik temu antara plainteks dan kunci. Tinggal sesuaikan saja hurufnya. Seandainya anda masih bingung, saya tuliskan artikel tentang teori dan hitung manual khusus Algoritma Vigenere Cipher. Sebenarnya pembahasan sudah banyak, tinggal anda googling saja. Jika anda sudah paham duluan teorinya, langsung saja menuju implementasi pemrograman.
Sebagaimana yang saya singgung sebelumnya. Pemrograman untuk Vigenere Cipher menggunakan C++. Saya tuliskan di DevC++. Saya sarankan anda tidak langsung copy-paste, melainkan ketikkan manual biar greget.
Ketika source code tersebut di-compile dan di running, akan tampil interface console seperti Gambar 2. Anda wajib menyiapkan plainteks, cipherteks dan hasil yang disimpan dalam type File (lihat Gambar 3). Ketika anda memilih enkripsi, tuliskan angka 1. Kemudian program meminta anda menuliskan nama file plainteks sebagai masukan dan nama file cipherteks sebagai keluaran. Pun jika memilih angka 2 untuk dekripsi. File cipherteks sebagai masukan dan file hasil sebagai keluaran dekripsi wajib tersedia duluan.
Selamat mencoba. Setelah ini, pekerjaan rumah saya masih tersisa. Menjelaskan hitung manual Vigenere Cipher dan mencoba alih bahasa ke berbagai bahasa pemrograman yang saya bisa. Ayo kita diskusi jika ada pertanyaan.
// Program Enkripsi dan Dekripsi Teks menggunakan Algoritma Vigenere Cipher #include <iostream> #include <string.h> #include <fstream> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void enkripsi(){ string K; char fileplain[20], filecipher[20], c; int i, r, k; FILE *Fin, *Fout; cout<< "Ketikkan nama file plainteks: "; scanf("%s", fileplain); Fin = fopen(fileplain,"rb"); cout<< "ketikkan nama file hasil (cipherteks): "; scanf("%s", filecipher); Fout = fopen(filecipher, "wb"); cout<< "Ketikkan kunci : "; cin >> K; for(i =0; i<K.length(); i++){ K[i]=toupper(K[i]); r =0; cout <<"Encrypting...."; while((c=getc(Fin))!= EOF){ if(isalpha(c)){ c=toupper(c); c=c-65; k=K[r]; k=k-65; c=(c+k)%26; c=c+65; } putc(c,Fout); r=(r+1)% K.length(); } cout<< "selesai" <<endl; fclose(Fin); fclose(Fout); } } void dekripsi(){ string K; char fileplain[20], filecipher[20], c; int i, r, k; FILE *Fin, *Fout; cout<< "Ketikkan nama file cipherteks: "; scanf("%s" , filecipher); Fin = fopen(filecipher, "rb"); cout << "ketikkan nama file hasil (plainteks): "; scanf("%s", fileplain); Fout = fopen(fileplain, "wb"); cout<< "Ketikkan kunci: "; cin >>K; for(i=0;i<K.length() ; i++){ K[i]=toupper(K[i]); r=0; cout<< "Decrypting...."; while ((c=getc(Fin))!= EOF){ if(isalpha(c)){ c=toupper(c); c= c-65; k=K[r]; k=k-65; if(c-k<0){ c=26+(c-k); }else{ c=(c-k)%26; } c=c+65; c=tolower(c); } putc(c,Fout); r= (r+1)% K.length(); } cout<< "selesai" << endl; fclose(Fin); fclose(Fout); } } int main() { int pil; bool stop; stop = false ; while(!stop){ cout << "menu " << endl; cout << "1. enkripsi " << endl; cout << "2. dekripsi " << endl; cout << "3. exit " << endl; cout << "pilih menu "; cin>> pil; switch(pil){ case 1: enkripsi();break; case 2: dekripsi(); break; case 3: stop=true; break; } } }
Ketika source code tersebut di-compile dan di running, akan tampil interface console seperti Gambar 2. Anda wajib menyiapkan plainteks, cipherteks dan hasil yang disimpan dalam type File (lihat Gambar 3). Ketika anda memilih enkripsi, tuliskan angka 1. Kemudian program meminta anda menuliskan nama file plainteks sebagai masukan dan nama file cipherteks sebagai keluaran. Pun jika memilih angka 2 untuk dekripsi. File cipherteks sebagai masukan dan file hasil sebagai keluaran dekripsi wajib tersedia duluan.
Gambar 2. Running File |
Gambar 3. Plainteks, Cipherteks dan Hasil sebagai input dan output |
Selamat mencoba. Setelah ini, pekerjaan rumah saya masih tersisa. Menjelaskan hitung manual Vigenere Cipher dan mencoba alih bahasa ke berbagai bahasa pemrograman yang saya bisa. Ayo kita diskusi jika ada pertanyaan.