IMPLEMENTASI ALGORITMA CHIPER CAESAR UNTUK ENKRIPSI DAN
DEKRIPSI PADA TABEL ASCII MENGGUNKAN BAHASA JAVA
Galih Fathul Rohmi, Entik Insannudin
Teknik Informatika UIN Sunan Gunung Djati Bandung
email :galih.fathulrohmi@student.uinsgd.ac.id; insan@if.uinsgd.ac.id
Abstraksi
Kriptografi adalah seni untuk menjaga kerahasiaan dan keamanan suatu pesan yang akan dikirim maupun diterima. Banyak metode yang bisa digunakan untuk melakukan seni ataupun ilmu kriptopgrafi. Pada jurnal ini, penulis akan membahas mengenai implementasi algoritma kriptografi klasik chiper caesar menggunakan bahasa java yang dicoding menggunakan netbeans berdasarkan tabel ASCII. Kriptografi secara umum digunakan dalam bidang informasi. Selain kriptografi ada juga bidang lain yang digunakan untuk memecahkan dan menganalisis sistem keamanan komunikasi. Bidang tersebut dinamakan kriptanalisis. Selain itu kriptanalisis disebut juga sebagai sebagai attackers atau penyerang.
Kata Kunci :
Chiper Caesar, Netbeams, JAVA, kriptografi
Pendahuluan
Kriptografi adalah ilmu dan juga seni yang mempelajari tentang cara menjaga keamanan suatu pesan atau informasi. Pesan atau informasi dapat dikategorikan ke dalam dua jenis, yaitu pesan yang dapat dibaca dengan mudah (plaintext) dan pesan yang tidak mudah untuk dibaca (ciphertext). Untuk melakukan kriptografi digunakan algoritma kriptografi. Algoritma kriptografi terdiri dari dua bagian, yaitu fungsi enkripsi dan dekripsi. Enkripsi adalah proses untuk merubah plaintext menjadi ciphertext, sedangkan dekripsi adalah kebalikannya yaitu merubah ciphertext menjadi plaintext. Salah satu teknik enkripsi adalah teknik subtitusi, yaitu mengganti setiap karakter plaintext dengan karakter lain. Terdapat empat cara dalam menggunakan teknik subtitusi, yaitu :
a) Monoalphabet, dimana setiap karakter ciphertext mengganti satu macam karakter plaintext tertentu.
b) Polialphabet, dimana setiap karakter ciphertext mengganti lebih dari satu macam karakter plaintext.
c) Monograf/unilateral, dimana satu enkripsi dilakukan terhadap satu karakter plaintext. Monograf/unilateral, dimana satu enkripsi dilakukan terhadap satu karakter plaintext. d) Poligraf/multilateral, dimana satu enkripsi
dilakukan terhadap lebih dari satu karakter plaintext.
Teknik enkripsi substitusi yang pertama kali dikenal dan paling sederhana ditemukan oleh Julius Caesar. Metode yang digunakan dalam caesar chiper ini adalah dengan mempertukarkan atau mengganti setiap huruf dari plaintext dengan huruf
lain dengan interval 3 huruf dari huruf plaintext. Sebagai contoh dapat dilihat di bawah ini :
Untuk menyandikan sebuah pesan, cukup mencari setiap huruf yang hendak disandikan di alfabet biasa, lalu tuliskan huruf yang sesuai pada alfabet sandi. Untuk memecahkan sandi tersebut gunakan cara sebaliknya. Contoh penyandian sebuah pesan adalah sebagai berikut. teks terang: kirim pasukan ke sayap kiri teks. Dan hasil enkripsi tersebut adalah: NLULP SDVXNDQ NH VDBDS NLUL
Proses enkripsi dapat secara matematis menggunakan operasi modulus dengan mengubah huruf-huruf menjadi angka, A = 0, B = 1,..., Z = 25. Sandi (En) dari "huruf" x dengan geseran n secara matematis dituliskan dengan, Sedangkan pada proses pemecahan kode (dekripsi), hasil dekripsi (Dn) adalah Setiap huruf yang sama digantikan oleh huruf yang sama di sepanjang pesan, sehingga sandi Caesar digolongkan kepada, substitusi monoalfabetik, yang berlawanan dengan substitusi polialfabetik.
Tinjauan Pustaka
Pada proses pembuatan program ini penulis melakukan observasi mengenai algoritma chiper caesar pada beberapa bahasa pemograman. Masih banyak yang menggunakan huruf alfabet standar dalam pembuatannya. Disini penulis akan mengimplementasikan dan menggabungkan antar kriptografi dengan tabel ASCII bukan hanya alfabet biasa pada umumunya dengan menggunakan java netbeans untuk pemogramannya.
Gambar 3. Proses enkripsi dan dekripsi simetri klasik
Berikut rumus enkripsi dan dekripsi cipher caesar untuk penggunaan alfabet standar:
a. Enkripsi
Ci = (Pi + K) mod 26
b. Dekripsi
Pi = (Ci - K) mod 26
Berikut rumus enkripsi dan dekripsi cipher caesar untuk penggunaan tabel ASCII:
a. Enkripsi
Ci = (Pi + K) mod 256
b. Dekripsi
Pi = (Ci - K) mod 526
Keterangan:
Ci = nilai desimal karakter ciphertext ke-i
Pi = nilai desimal karakter plaintext ke-i
K = nilai desimal karakter kunci ke-i mod 256 = karena berdasarkan ASCII
Gambar 1. Tabel ACII (simbol)
Gambar 2. Tabel ACII (teks)
Metode Penelitian
Dalam perkembangan ilmu kriptografi semakin luas dan banyak sekali dimanfaatkan terutama dalam mengamankan informasi atau pesan.
Pada Cipher Caesar kunci K adalah urutan huruf-huruf K = k……kn dimana ki didapat dari banyak penggeseran pada alphabet ke-i.
Pada kasus ini untuk algoritma klasiknya sendiri diterapkan pada aspek pensubtitusian hurufnya dengan melihat tabel ASCII dalam langkah enkripsi maupun dekripsinya.
Langkah Enkripsi pada implentasi di program ini adalah memasukan plaintext dan kunci sesuai dengan keinginan. Lalu palintext dan kunci tersebut digeser 1 huruf kebelakang (tabel ASCII). Setelah itu jumlahkan banyaknya kunci untuk huruf pertama di enkripsi. Contoh:
Plaintext: kripto lsjqup
Kunci: grafi hsbgj (lalu jumlahkan banyaknya kunci pada kasus ini ada 5 huruf jadi rumusnya : jumlah huruf+1)
Chipertext : 6hsbgjlsjqup
Untuk aturan penulisannya dimulai dari jumlah kunci lalu disusul kunci dan plaintext.
Langkah Dekripsi pada implementasi di program ini memasukan chipertext dan kunci yang sama digunakan pada saat melakukan enkripsi supaya berhasil untuk didekripsi kembali. Tidak beda jauh dengan proses enkripsi hanya saja di ganti dengan penambahan satu huruf kedepan dan membuang jumlah kunci yang ada.
Chipertext: lsjqup kripto
Kunci: grafi (lalu hilangakn jumlah kunci dan kunci) Plaintext : kripto
Hasil dan Pembahasan
Penulis menggunakan bahasa pemograman java netbean dalam pembuatan program algoritma chiper caesar. Pada program ini terdapat beberapa fungsi button yang sengaja dibuat untuk memudahkan user. Berikut adalah source serta
screenshot dari demo program yang telah penulis
buat:
Gambar 4. program Chiper Caesar
Berikut source code algoritma Chiper caesar ASCII: package progenkripsi;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.StringTokenizer; import javax.swing.JFileChooser; import javax.swing.JOptionPane; public class FormEnkrip extends javax.swing.JFrame {
private JFileChooser dialog = new JFileChooser(); public FormEnkrip() { initComponents(); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jLabel1 = new javax.swing.JLabel(); jPasswordField1 = new
javax.swing.JPasswordField();
btBuka = new javax.swing.JButton(); btSimpan = new javax.swing.JButton(); btKeluar = new javax.swing.JButton(); jScrollPane3 = new javax.swing.JScrollPane(); txtChiperText = new javax.swing.JTextArea(); jScrollPane4 = new javax.swing.JScrollPane(); txtPlaintext = new javax.swing.JTextArea(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); btEnkrip = new javax.swing.JButton(); btDekrip = new javax.swing.JButton(); txtKey = new javax.swing.JTextField(); jLabel6 = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane(); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); jLabel1.setText("===>"); jPasswordField1.setText("jPasswordField1"); setDefaultCloseOperation(javax.swing.WindowCon stants.EXIT_ON_CLOSE); setTitle("Program Enkripsi"); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURS OR)); setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N setModalExclusionType(null); setResizable(false); btBuka.setText("Buka File"); btBuka.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btBukaActionPerformed(evt); } }); btSimpan.setText("Simpan"); btSimpan.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btSimpanActionPerformed(evt); } }); btKeluar.setText("Keluar"); btKeluar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btKeluarActionPerformed(evt); } }); txtChiperText.setColumns(20); txtChiperText.setRows(5); jScrollPane3.setViewportView(txtChiperText); txtPlaintext.setColumns(20); txtPlaintext.setRows(5); jScrollPane4.setViewportView(txtPlaintext); jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N jLabel2.setText("Implementasi Algoritma Chiper Caesar "); jLabel3.setText("Plaintext"); jLabel4.setText("Chipertext"); btEnkrip.setText("Enkirpsi"); btEnkrip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btEnkripActionPerformed(evt); } });
btDekrip.setText("Dekripsi"); btDekrip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btDekripActionPerformed(evt); } }); txtKey.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { txtKeyKeyPressed(evt); } }); jLabel6.setText("Masukan Key"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayou t.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(jav ax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGrou p() .addGap(14, 14, 14) .addGroup(layout.createParallelGrou p(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(javax.swing.GroupLayo ut.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallel Group(javax.swing.GroupLayout.Alignment.LEADI NG) .addComponent(txtKey, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel6)) .addPreferredGap(javax.swing.L ayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallel Group(javax.swing.GroupLayout.Alignment.LEADI NG, false) .addGroup(layout.createSeque ntialGroup() .addComponent(btEnkrip, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swi ng.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btDekrip, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSeque ntialGroup() .addComponent(btSimpan, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swi ng.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btBuka) .addPreferredGap(javax.swi ng.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btKeluar, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addGroup(javax.swing.GroupLayo ut.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.L ayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addGroup(layout.createSequentialGrou p() .addGap(64, 64, 64) .addComponent(jLabel2))) .addContainerGap(20, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(93, 93, 93) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyl e.ComponentPlacement.RELATED, 200, Short.MAX_VALUE) .addComponent(jLabel4) .addGap(102, 102, 102)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayou t.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel2) .addGap(3, 3, 3) .addGroup(layout.createParallelGroup(jav ax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jLabel4)) .addGap(9, 9, 9) .addGroup(layout.createParallelGroup(jav ax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 219, Short.MAX_VALUE) .addComponent(jScrollPane3)) .addPreferredGap(javax.swing.LayoutStyl e.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(jav ax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btEnkrip) .addComponent(btDekrip) .addComponent(jLabel6)) .addGap(4, 4, 4) .addGroup(layout.createParallelGroup(jav ax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btSimpan) .addComponent(btBuka) .addComponent(btKeluar) .addComponent(txtKey, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLay out.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize() ;
java.awt.Dimension dialogSize = getSize();
setLocation((screenSize.width- dialogSize.width)/2,(screenSize.height-dialogSize.height)/2);
}// </editor-fold> //BUTTON OPEN FILE private void
btBukaActionPerformed(java.awt.event.ActionEvent evt) {
txtChiperText.setText(null);
int isi = dialog.showOpenDialog(this); if (isi == JFileChooser.APPROVE_OPTION) { //jika file dipilih open
File file = dialog.getSelectedFile(); try{
FileInputStream fstream = new FileInputStream(file); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine;
while ((strLine = br.readLine()) != null){ StringTokenizer st = new StringTokenizer(strLine, ","); txtChiperText.setText(txtChiperText.getText() + st.nextToken() +"\n"); } in.close();
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
} }
} //BUTTON SIMPAN FILE private void
btSimpanActionPerformed(java.awt.event.ActionEv ent evt) {
int isi = dialog.showSaveDialog(this); if (isi == JFileChooser.APPROVE_OPTION) { // jika file di pilih untuk di simpan
File file = dialog.getSelectedFile(); try {
file.createNewFile();
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file))); out.print(txtChiperText.getText()); out.flush();
}
catch (IOException ex) { System.err.println("Error: " + ex.getMessage()); } } } // BUTTON KELUAR private void btKeluarActionPerformed(java.awt.event.ActionEve nt evt) { System.exit(1); } // BUTTON ENKRIPSI DATA private void
btEnkripActionPerformed(java.awt.event.ActionEve nt evt) {
String key = txtKey.getText(); String isitext =
(key.length())+key+txtPlaintext.getText(); String out= "" ;
for (int i = 0; i < isitext.length(); i++) { int index = isitext.charAt(i);
char s = (char)(index+1) ; out = out+ String.valueOf(s); } txtChiperText.setText(out); txtPlaintext.setText(""); txtKey.setText(""); }
// BUTTON DEKRIPSI DATA private void
btDekripActionPerformed(java.awt.event.ActionEve nt evt) {
String isitext = txtChiperText.getText(); char k = (char)(isitext.charAt(0)); String key = "",out = "";
int jumKey =
Integer.parseInt(String.valueOf(k))-1; //
JOptionPane.showMessageDialog(null,jumKey); // buka password
for (int i = 1 ; i <= jumKey; i++) { int index = isitext.charAt(i); char s = (char)(index-1) ; key = key + String.valueOf(s); }
// JOptionPane.showMessageDialog(null,key);
if (key.equals(txtKey.getText())){ // hasil true for (int i = (jumKey+1) ; i < isitext.length(); i++) {
int index = isitext.charAt(i); char s = (char)(index-1) ; out = out + String.valueOf(s); } txtPlaintext.setText(out); } else{ JOptionPane.showMessageDialog(null,"Key tidak cocok \nSilahkan coba lagi");
}
} private void
txtKeyKeyPressed(java.awt.event.KeyEvent evt) { // TODO add your handling code here:
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override public void run() {
new FormEnkrip().setVisible(true); }
}); }
// Variables declaration - do not modify private javax.swing.JButton btBuka;
private javax.swing.JButton btDekrip; private javax.swing.JButton btEnkrip; private javax.swing.JButton btKeluar; private javax.swing.JButton btSimpan; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel6; private javax.swing.JPasswordField jPasswordField1;
private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JTextArea jTextArea1; private javax.swing.JTextArea txtChiperText; private javax.swing.JTextField txtKey; private javax.swing.JTextArea txtPlaintext; // End of variables declaration }
Kesimpulan dan Saran
Dalam pengimplementasian algortiam klasik chiper caesar untuk enkripsi-dekripsi dengan menggunakan table ASCII sebagai acuan memberikan kemungkinan lebih banyak karakter yang tercakup dari pada menggunakan huruf alfabet biasa yang tidak mencakup karakter.
Dengan belajar kriptografi setidaknya kita bisa mengaplikasikannya dalam mengamankan kerahasiaan informasi atau pesan yang akan dikirim maupun di terima.
Saran untuk penulis, penulis mengharapkan krittik dan saran yang membangun guna perbaikan serta pengembangan progam agar dapat lebih baik dan mempunyai daya saing di era kedepan.
Daftar Pustaka
.[1] Kester, Quist-Aphetsi., 2013, A HYBRID CRYPTOSYSTEM BASED ON VIGENÈRE CIPHER AND COLUMNAR TRANSPOSITION CIPHER,
Proceeding IJATER. Accra North, Ghana
[2] Rinaldi Munir, Kriptografi. Bandung, Indonesia: Penerbit Informatika, 2006.
[3] Novi Dian Ntathasia, Anang Eko Wicaksono, “Penerapan Teknik Kriptografi Stream Chiper Untuk Pengaman Basis Data,” Jurnal Basis Data, vol. 6, no.1, p. 22, Mei 2011.
[4] Unknow, 12 Januari 2014, ASCII Table and
Description, http://www.asciitable.com
[5] Khannedy, Eko Kurniawan, 2012. “Pemrograman GUI menggunakan Java dan NetBeans
[6] Arius, Doni. (2008). ”Pengantar Ilmu
KRIPTOGRAFI, Teori, Analisis dan Implementasi”. Yogyakarta.