• Tidak ada hasil yang ditemukan

5.1 Kesimpulan

Berdasarkan hasil pengujian program enkripsi dengan algoritma ElGamal dan steganografi dengan least significant bit (LSB), maka dibuat kesimpulan berikut ini :

1. Dengan menggunakan algoritma ElGamal, data akan diubah ke bentuk desimal, kemudian akan dienkripsi dengan menggunakan fungsi �� ( ���� ) dan ���� ( ��� ). Hasil enkripsinya akan dalam bentuk desimal, dimana ciphertextnya adalah {��,����}, sehingga menghasilkan deretan bilangan desimal. Deretan bilangan desimal yang dihasilkan tidak memiliki pola dan tidak dapat dipahami. Dengan menyisipkan ciphertext ke citra menggunakan algoritma LSB, maka keamanan data akan semakin kuat karena ukuran citra tidak mengalami perubahan, sedangkan perubahan citra tidak tampak oleh mata, hal ini dapat terjadi karena perubahan yang terjadi hanya pada nilai matrix citranya sedangkan ukuran matrix citranya tidak mengalami perubahan. Setelah diimplementasikan dan diuji, disimpulkan bahwa dengan menggabungkan algoritma ElGamal dengan LSB akan menghasilkan keamanan yang kuat.

2. Berdasarkan pengujian yang dilakukan maka kinerja program baik karena waktu yang dibutuhkan untuk mengenkripsi dan menyisipkan pesan dengan panjang pesan antara 20 hingga 60 karakter adalah kurang dari 3 detik, Sedangkan waktu yang dibutuhkan untuk mengkekstraksi dan mendekripsikan kembali pesan tersebut adalah kurang dari 1 detik.

5.2 Saran

Agar sistem dapat dikembangkan lebih baik dan lebih sempurna, maka penulis memberikan saran berikut ini :

1. Pengujian algoritma sebaiknya dilakukan lebih banyak lagi, dengan mengkombinasikan panjang pesan, kunci serta citra yang lebih banyak lagi. Dengan demikian dapat diketahui apa yang menyebabkan lama proses secara detail, sehingga kerja sistem dapat dibuat lebih baik lagi.

2. Program perlu dikembangkan agar dapat menggunakan file citra yang lebih banyak lagi, sehingga dapat diketahui file citra mana yang terbaik untuk algoritma ini.

3. Program perlu dikembangkan untuk mendukung file ekstensi teks lainnya, terutama

doc dan pdf, karena ekstensi ini merupakan ekstensi yang paling banyak digunakan untuk teks.

4. Session key dipengaruhi oleh nilai bilangan prima yang dibangkitkan, sehingga nilai bilangan prima yang dibangkitkan perlu dibuat batasan, sehingga waktu untuk enkripsi dan penyisipan lebih kecil.

5. Algoritma ElGamal merupakan algoritma yang menggunakan fungsi modulo, oleh karena itu algoritma yang digunakan untuk fungsi modulo harus lebih baik dari yang telah diimplementasikan, sehingga meminimalkan waktu enkripsi dan dekripsi.

Daftar Pustaka

[1] Ayushi. 2010. A Sysmetric Key Cryptographic Algorithm. International Journal of Computer Aplications. Volume 1-No.14.

[2] Cole, E. 2003. Hiding in Plain Sight: Steganography and Art of Convert Communication. Indianapolis, indiana. Willey Publishing, Inc.

[3] Gerami, P., Ibrahim, S., Bashardoost, M. 2012. Least Significant Bit Image Steganography Using Particle Swarm Optimization and Optical Pixel Adjustment. International Journal of Computer Application. Volume 55-no.2. hal.20-25.

[4] Gupta, S., Gujral, G., Anggarwal, N. 2012. Enhanced Least Significant Bit Algorithm For Image Steganography. IJCEM International Journal of Computational Engineering & Management, Vol 15 Issue 4: hal 40-42.

[5] Katzenbeisser, S dan Petitcolas, F. 2000. Information Hiding Techniques for Steganography and Digital Watermarking. Massachusetts: Artech House, Inc.

[6] Klitz, K. dan Pietzak, K. 2010. Leakage Resilient Elgamal Encryption. Journal of Centrum Winkunde and Informatica. Nedherland.

[7] Mollin, R.A . 2007. An Introduction to Cryptography,a 2nd edition. Florida : Taylor & Francis Group, LLC.

[8] Munir, Rinaldi. 2006. Kriptografi. Bandung : Penerbit Informatika.

[9] Rumbaugh, J.,Jacobson, I.,Booch, G. 1999. The unified Modelling Language Refence Manual.Massachusetts :Addison Wesley Longman, Inc.

[10] Schneier, B. 1997. Applied Cryptography, 2nd edition. New York: John-Wiley & Sons.

[11] Sejati, D. 2007. Studi dan Perbandingan Steganografi Metode EOF(End of File) dengan DCS(Dynamic Cell Spreading). Skripsi. Bandung, Indonesia : Institut Teknologi Bandung.

[12] Stalling, W. 2011. Cryptography and Network Security. Fifth Edition. New York: Pearson Education, Inc.

[13] Sharma, P., Gupta, A.K., dan Sherma, S. 2012. Intesified ElGamal Cryptosystem (IEC). Internatioanal Journal of Advences in Engineering and Technology. ISSN:2331-1963.

LISTING PROGRAM //FinalElgamalLsb.java

package finalelgamal.lsb; public class FinalElgamalLsb {

public static void main(String[] args) { MenuUtama menu_utama=new MenuUtama(); menu_utama.setVisible(true); } } //MenuUtama.java package finalelgamal.lsb; import com.sun.glass.ui.Application; import javax.swing.JFrame;

public class MenuUtama extends javax.swing.JFrame { /** Creates new form MenuUtama */

public MenuUtama() { initComponents(); }

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {

jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu();

jMenuItem1 = new javax.swing.JMenuItem(); jMenuItem2 = new javax.swing.JMenuItem(); jMenuItem3 = new javax.swing.JMenuItem(); jMenu2 = new javax.swing.JMenu();

jMenuItem4 = new javax.swing.JMenuItem(); jMenuItem5 = new javax.swing.JMenuItem(); jMenuItem6 = new javax.swing.JMenuItem();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setForeground(new java.awt.Color(255, 102, 255));

setResizable(false);

addWindowListener(new java.awt.event.WindowAdapter() {

public void windowActivated(java.awt.event.WindowEvent evt) { formWindowActivated(evt); } }); jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resource/background2.png"))) ; // NOI18N jLabel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.b order.BevelBorder.RAISED));

jLabel2.setFont(new java.awt.Font("Times New Roman", 1, 24)); jLabel2.setForeground(new java.awt.Color(255, 255, 255));

jLabel2.setText(" Program Enkripsi Elgamal dan Steganografi LSB"); jLabel3.setFont(new java.awt.Font("Traditional Arabic", 1, 18)); jLabel3.setForeground(new java.awt.Color(255, 255, 255));

jLabel3.setText("Dibuat Oleh : Hermanda I.T. Simamora [0814010079]");

jLabel4.setText("Copyright@HermandaSimamora& Ilmu Komputer USU"); jMenu1.setText("Program");

jMenuItem1.setText("Bangkitkan Kunci");

jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt);

} });

jMenu1.add(jMenuItem1);

jMenuItem2.setText("Enkripsi & Sisipkan ");

jMenuItem2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem2ActionPerformed(evt);

} });

jMenu1.add(jMenuItem2);

jMenuItem3.setText("Ekstraksi & Dekripsi ");

jMenuItem3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem3ActionPerformed(evt); } }); jMenu1.add(jMenuItem3); jMenuBar1.add(jMenu1); jMenu2.setText("Help"); jMenuItem4.setText("About"); jMenuItem4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem4ActionPerformed(evt); } }); jMenu2.add(jMenuItem4); jMenuItem5.setText("Cara penggunaan"); jMenuItem5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem5ActionPerformed(evt); } }); jMenu2.add(jMenuItem5); jMenuItem6.setText("Keluar"); jMenuItem6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem6ActionPerformed(evt);

});

jMenu2.add(jMenuItem6); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1);

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { PembangkitKunci menu_bangkitkankunci = new PembangkitKunci();

menu_bangkitkankunci.show(); this.dispose();

}

private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) { EnkripsidanHide menu_enkripsihide =new EnkripsidanHide();

menu_enkripsihide.show(); this.dispose();

}

private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) { EkstraksidanDekripsi menu_ektraksidekripsi = new EkstraksidanDekripsi();

menu_ektraksidekripsi.show(); this.dispose();

}

private void formWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here:

}

private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) { About menu_about=new About();

menu_about.show(); this.dispose();

}

private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) { CaraPenggunaan menu_penggunaan=new CaraPenggunaan();

menu_penggunaan.show(); this.dispose();

}

private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0);

} public static void main(String args[]) { try {

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } }

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(MenuUtama.class.getName()).log(java.util .logging.Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(MenuUtama.class.getName()).log(java.util .logging.Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(MenuUtama.class.getName()).log(java.util .logging.Level.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(MenuUtama.class.getName()).log(java.util .logging.Level.SEVERE, null, ex);

}

//</editor-fold>

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() { public void run() {

new MenuUtama().setVisible(true); }

}); }

// Variables declaration - do not modify private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2;

private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem2; private javax.swing.JMenuItem jMenuItem3; private javax.swing.JMenuItem jMenuItem4; private javax.swing.JMenuItem jMenuItem5; private javax.swing.JMenuItem jMenuItem6;

// End of variables declaration } //PembangkitKunci.java package finalelgamal.lsb; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.math.BigInteger; import java.util.Arrays; import java.util.Collections; import java.util.Random; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane;

public class PembangkitKunci extends javax.swing.JFrame { /** Creates new form PemabangkiKunci */

public PembangkitKunci() { initComponents();

}

public static int modulo(int a, int b,int c ){ int d; int e; int a1 = a ; int p = 1; while (b > 0) { if (b % 2 !=0){ p *= a1; d = p % c; p = d; } b/=2; e= (a1 * a1) % c; a1=e; } return p; }

public static int isPrimitive(int a, int b) { int d;

int result [] = new int [b]; // array baru untuk result int i;

String R="";

String Result ="";

for (i=1 ; i<b; i++){

result[i]=modulo(a,i,b); R += i+" "; Result += result[i]+" "; } System.out.println("nilai R :"+R);

//System.out.println("nilai result : "+Result); String data=Result;

String[] numbers = data.split(" ");

Integer[] intValues = new Integer[numbers.length]; for (int h = 0; h < numbers.length; h++) {

intValues[h] = Integer.parseInt(numbers[h].trim()); }

Collections.sort(Arrays.asList(intValues));

// Mengembalikan nomor yang berurutan ke string menggunakan String Builde object

// StringBuilder object. Prints the sorted string numbers. //

StringBuilder builder = new StringBuilder(); for (int h = 0; h < intValues.length; h++) { Integer intValue = intValues[h];

builder.append(intValue); if (h < intValues.length - 1) { builder.append(" "); } } System.out.println("After = " + builder.toString()); if (R.contains(builder.toString())){ d=a; } else { d=0;

}

return d; }

public static int checkPrima(int prima) { Random rand = new Random(4);

Scanner input = new Scanner(System.in);

int testNumber[] = new int [13]; testNumber[0] = 2; testNumber[1] = 3; testNumber[2] = 5; testNumber[3] = 7; testNumber[4] = 11; testNumber[5] = 13; testNumber[6] = 17; testNumber[7] = 19; testNumber[8] = 23; testNumber[9] = 29; testNumber[10] = 31; testNumber[11] = 37; testNumber[12] = 41; int bilanganRandom; int result = 0; int randPrime; int m; int p; int statue = 1;

for (int counter = 0 ; counter < 6 ; counter++) //menguji hingga 6 kali pakah menhasilkan 1 atau p-1

{

bilanganRandom = rand.nextInt(12); //mengacak bilangan random randPrime = testNumber[bilanganRandom]; //mengenerate array testnumber[13] dan menginiliasikan menjadi rendPrime

if (!(randPrime == prima)){ //mengecek apakah array yang digenerate sama dengan bilangan prima

//pangkat = modExp(randPrime,(prima-1)/2, prima); //result = pangkat % prima;

result = modulo (randPrime, (prima-1)/2, prima ) ; if (!(result == 1 || result == prima-1)){

statue = -1; break; } } } if (statue == -1){ prima = 0; } else { prima = prima; } return prima; } @SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {

jLabel1 = new javax.swing.JLabel();

jSeparator2 = new javax.swing.JSeparator(); jLabel2 = new javax.swing.JLabel();

jSeparator3 = new javax.swing.JSeparator(); jLabel3 = new javax.swing.JLabel();

jTextField1 = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel();

jTextField2 = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel();

jTextField3 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton();

jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); jButton5 = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel();

jTextField4 = new javax.swing.JTextField(); jTextField5 = new javax.swing.JTextField(); jButton6 = new javax.swing.JButton();

jButton7 = new javax.swing.JButton(); setResizable(false);

jLabel1.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel1.setText("Fungsi Untuk Membangkitkan Kunci Enkripsi dan Dekripsi");

jLabel2.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel2.setText("Fungsi Untuk Membangkitkan Sebuah Bilangan Prima ");

jLabel3.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel3.setText("Masukkan Sebuah Kunci");

jLabel4.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel4.setText("Kunci Publik");

jLabel5.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel5.setText("Kunci Privat");

jButton1.setText("Generate");

jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt);

} });

jButton2.setText("Save");

jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt);

} });

jButton3.setText("Save");

jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt);

} });

jButton4.setText("Clear");

jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt);

} });

jButton5.setText("Menu Utama");

jButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton5ActionPerformed(evt);

} });

jLabel6.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel6.setText("Masukkan Sebuah Bilangan");

jButton6.setText("Next Prime");

jButton6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton6ActionPerformed(evt);

} });

jButton7.setText("Clear");

jButton7.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton7ActionPerformed(evt);

} });

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int p= 0;

int t; //variabel bilangan acak untuk bilangan prima int prima = 0; //inisialisasi bilagan prima (p) int alpha=0; // inisialisasi bilanga alpha (α)

int t1; //variabel bilangan acak untuk primitive root int d=0; // vaiabel untuk perulangan while

int a=0; //variabel kunci prvat

BigInteger b=new BigInteger("0"); //alpha pangkat a String result;

String result1;

a = Integer.parseInt(jTextField1.getText()); //System.out.println(" nilai kunci " +key); while (p==0){

Random RandomGenerator = new Random(); //inilialisasi bilangan random

int randomInt = RandomGenerator.nextInt(30000); // acak nilai hingga batas 300000000

t = randomInt;

if (t % 2 == 0) { //apabila bilangan yang digenerate genap maka akan dibangkitkan kembali

p =0;

System.out.print(" " + p); } else {

prima= checkPrima(t); //mengecek bilangan yang dibangkitkan apakah prima atau tidak

System.out.println("generated " +prima); }

}

while (d==0){

Random RandomGenerate = new Random(); //inilialisasi bilangan random int randomInt1 = RandomGenerate.nextInt(a-1); //generate sebuah bilangan dengan nilai prima - 1

t1 = randomInt1;

alpha=isPrimitive(t1,a); // memanggil method isPrimitive untuk memeriksa apakah primitve root atau tidak

d=alpha; if(d!=0) break;

Random RandomGenerate = new Random();

int randomInt1 = RandomGenerate.nextInt(3000); // acak nilai hingga batas 300000000 } BigInteger x = BigInteger.valueOf(alpha); BigInteger y = BigInteger.valueOf(a); BigInteger s = BigInteger.valueOf(prima); b = x.modPow(y, s); result=prima+" "+alpha+" "+b; result1=prima+" "+a;

jTextField2.setText(result); // menampilkan kunci publik jTextField3.setText(result1); // menampilkan kunci privat }

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) { int p=0;

int prima=0;

int d=Integer.parseInt(jTextField4.getText()); while (p==0){

if (d % 2 == 0) { //apabila bilangan yang digenerate genap maka akan dibangkitkan kembali

p =0; } else {

prima= checkPrima(d); //mengecek bilangan yang dibangkitkan apakah prima atau tidak

p=prima; //masukkan nilai prima ke variabel p }

d++; // menambah variabel d dengan nilai 1 }

jTextField5.setText(String.valueOf(prima)); }

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { FileWriter fw = null;

try {

String nmfile = "kuncipublik.txt"; fw = new FileWriter(nmfile);

BufferedWriter bw = new BufferedWriter(fw); //Membuat objek untuk menulis file String isiText=""; isiText = jTextField2.getText(); bw.write(isiText); bw.newLine(); bw.close(); fw.close();

JOptionPane.showMessageDialog(rootPane, "nilai kunci publik telah tersimpan");

catch (IOException ex) { Logger.getLogger(PembangkitKunci.class.getName()).log(Level.SEVERE, null, ex); } }

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { FileWriter fw = null;

try {

String nmfile = "kunciprivat.txt"; fw = new FileWriter(nmfile);

BufferedWriter bw = new BufferedWriter(fw); //Membuat objek untuk menulis file String isiText=""; isiText = jTextField3.getText(); bw.write(isiText); bw.newLine(); bw.close(); fw.close();

JOptionPane.showMessageDialog(rootPane, "nilai kunci privat telah tersimpan");

}

catch (IOException ex) {

Logger.getLogger(PembangkitKunci.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { jTextField1.setText("");

jTextField2.setText(""); jTextField3.setText("");

}

private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) { jTextField4.setText("");

jTextField5.setText("");

}

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) { MenuUtama menu_utama=new MenuUtama();

menu_utama.show(); this.dispose();

} public static void main(String args[]) { setting code (optional) ">

with the default look and feel. try {

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } }

java.util.logging.Logger.getLogger(PembangkitKunci.class.getName()).log(jav a.util.logging.Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(PembangkitKunci.class.getName()).log(jav a.util.logging.Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(PembangkitKunci.class.getName()).log(jav a.util.logging.Level.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(PembangkitKunci.class.getName()).log(jav a.util.logging.Level.SEVERE, null, ex);

}

//</editor-fold>

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() { public void run() {

new PembangkitKunci().setVisible(true); }

}); }

// Variables declaration - do not modify private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JButton jButton4; private javax.swing.JButton jButton5; private javax.swing.JButton jButton6; private javax.swing.JButton jButton7; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6;

private javax.swing.JSeparator jSeparator2; private javax.swing.JSeparator jSeparator3; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; private javax.swing.JTextField jTextField3; private javax.swing.JTextField jTextField4; private javax.swing.JTextField jTextField5;

// End of variables declaration } //EnkripsidanHide.java package finalelgamal.lsb; import addon.CustomFileFilter; import addon.LabelAccessory; import java.awt.ComponentOrientation; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.ColorModel;

import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.Raster; import java.awt.image.SampleModel; import java.awt.image.WritableRaster; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.math.BigInteger; import java.util.Locale; import java.util.Random; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; public class EnkripsidanHide extends javax.swing.JFrame { private static int PREFERRED_WIDTH;

private static int PREFERRED_HEIGHT; private BufferedImage oriIMG = null; private BufferedImage plainIMG = null; private ImageIcon ikon;

private BufferedImage cipherIMG = null; private DataBuffer dBuf;

private byte [] msgb;

private WritableRaster raster; private ColorModel cm;

private SampleModel sm; private long speedElgamal; boolean ispremulti; byte[] pixels; byte[] sisipkan; String newData; String filetype; String finalContainer = ""; String a; String b; byte[] pixels1 ; String pixels2;

String [] pixels3 = new String [100000000]; /** Creates new form EnkripsidanHide */ public EnkripsidanHide() {

initComponents(); }

public static BigInteger modulo(BigInteger a, BigInteger b,BigInteger c ){

BigInteger d = new BigInteger("1"); //inisialisasi variabel d dengan nilai 1

BigInteger a1 = a ; //memberikan nilai a1 dengan nilai a

BigInteger p = new BigInteger("1"); // inisialisasi variabel p dengan nilai 1

for(int i = 1; i <= b.intValue(); i++) { // perulangan dimana nilai i 1 hingga lebih kecil atau sma dgn dengan nilai b

p= p.multiply(a1);// menghitung nilai p denga cara mengalikan p dngn a1 d = p.mod(c); // menghitung nilai d dengan cara memodulokan dengan nilai c p = d; } return p; }

private String byteToBinary(byte byteData){ String binary = "";

for (int iteration = 0 ; iteration < Byte.SIZE ; iteration++ ){ binary+=(byteData & 0x80) == 0 ? '0' : '1'; byteData <<= 1; } return binary; }

public static String Enkripsi( String s,String t){ String textString=s;

int p =textString.length(); String textString1=t;

int testNumber [] = new int[p];

BigInteger result [][]= new BigInteger [p][2]; BigInteger prima = new BigInteger("0");

BigInteger apa = new BigInteger("0"); //alpha pangkat a BigInteger alpha = new BigInteger("0");

BigInteger e = new BigInteger("0"); BigInteger y = new BigInteger("0"); BigInteger z = new BigInteger("1"); String hasil = "";

String hasil1 = ""; String hasil2 = ""; String hasil3 = "";

String array[] = textString1.split("\\s"); int a=0;

int f=0; int k=0;

for (int count = 0; count < array.length; count++) { if (!array[count].isEmpty()) { a=Integer.parseInt(array[0]); f=Integer.parseInt(array[1]); k=Integer.parseInt(array[2]); } } prima=BigInteger.valueOf(a); alpha=BigInteger.valueOf(f); apa=BigInteger.valueOf(k);

for(int i = 0; i < textString.length(); i++) {

Random RandomGenerate = new Random(); //inilialisasi bilangan random

int randomInt1 = RandomGenerate.nextInt(prima.intValue()-1); BigInteger b = BigInteger.valueOf(randomInt1);//convert integer randomInt1 to BigInteger

testNumber[i] = (int)textString.charAt(i); //convert char to decimal

result [i][0]=modulo(alpha,b,prima) ;

BigInteger sementara= modulo (apa,b,prima); BigInteger sementara1= d.multiply(sementara);

result [i][1]=modulo(sementara1,z,prima); //m x(a pangkat b) mdulo p

hasil +=result[i][0]+" "+result[i][1]+" "; }

return hasil; }

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {

jFileChooser1 = new javax.swing.JFileChooser(); jFileChooser2 = new javax.swing.JFileChooser(); jFileChooser3 = new javax.swing.JFileChooser(); jLabel1 = new javax.swing.JLabel();

jSeparator1 = new javax.swing.JSeparator(); jLabel2 = new javax.swing.JLabel();

jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jLabel3 = new javax.swing.JLabel();

jTextField1 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton();

jButton2 = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); jButton5 = new javax.swing.JButton(); jButton6 = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); jButton7 = new javax.swing.JButton(); jButton8 = new javax.swing.JButton();

jSeparator2 = new javax.swing.JSeparator(); jTextField2 = new javax.swing.JTextField(); jLabel8 = new javax.swing.JLabel();

jLabel9 = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(102, 255, 255));

setResizable(false);

jLabel1.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel1.setText("Fungsi Untuk Meng-Enkripsi dan Menyisipkan Pesan Ke Gambar");

jLabel2.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel2.setText("Pesan");

jTextArea1.setColumns(20); jTextArea1.setRows(5);

jScrollPane1.setViewportView(jTextArea1);

jLabel3.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel3.setText("Kunci");

jButton1.setText("Browse");

jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt);

});

jButton2.setText("Browse");

jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jLabel4.setText("Gambar"); jLabel5.setBackground(new java.awt.Color(204, 255, 102)); jLabel5.setForeground(new java.awt.Color(153, 255, 153)); jLabel5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resource/label.png"))); // NOI18N jButton3.setText("Browse"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt);

} });

jButton4.setText("Enkripsi & Penyisipan");

jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt);

} });

jButton5.setText("Clear");

jButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton5ActionPerformed(evt);

} });

jButton6.setText("Menu Utama");

jButton6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton6ActionPerformed(evt);

} });

jLabel6.setFont(new java.awt.Font("Times New Roman", 0, 14)); jLabel6.setText("Hasil Enkripsi & Steganografi");

jLabel7.setIcon(new

javax.swing.ImageIcon(getClass().getResource("/resource/label.png"))); // NOI18N

jButton7.setText("Save");

jButton7.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton7ActionPerformed(evt);

} });

jButton8.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton8ActionPerformed(evt);

} });

jLabel8.setText("Waktu Ekripsi dan Sisipkan"); jLabel9.setText("Milli Second");

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { FileFilter ft = new FileNameExtensionFilter("Text Files", "txt");

int returnVal = jFileChooser1.showOpenDialog( this ); String file_name = "";

if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION) { java.io.File file = jFileChooser1.getSelectedFile( );

try {

Scanner input = new Scanner (file); while (input.hasNext()){

file_name+= input.nextLine() + "\n"; }

} catch (IOException ex) {

Logger.getLogger(EnkripsidanHide.class.getName()).log(Level.SEVERE, null, ex); }

jTextArea1.setText(file_name); }

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { String str = null;

BufferedReader br = null;

JFileChooser chooser=new JFileChooser(); int returnVal = chooser.showOpenDialog(null); if(returnVal == JFileChooser.APPROVE_OPTION) { try {

File file = chooser.getSelectedFile();

br = new BufferedReader(new FileReader(file)); String st = "";

while ((st = br.readLine()) != null) { str= st;

}

br.close(); }

catch (IOException ex) { Logger.getLogger(EnkripsidanHide.class.getName()).log(Level.SEVERE, null, ex); } } jTextField1.setText(str); }

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { PREFERRED_WIDTH = jLabel5.getWidth();

PREFERRED_HEIGHT = jLabel5.getHeight();

FileFilter filtering = new CustomFileFilter("File Citra Digital (BMP)", new String[] {"BMP"});

jFileChooser1.setFileFilter(filtering);

int status = jFileChooser2.showOpenDialog(null); if (status == JFileChooser.APPROVE_OPTION) {

File selectedFile = jFileChooser2.getSelectedFile();

filetype = jFileChooser2.getTypeDescription(selectedFile); filetype="bmp";

try {

oriIMG = ImageIO.read(new File(selectedFile.getPath())); } catch (IOException ex) {

Logger.getLogger(EnkripsidanHide.class.getName()).log(Level.SEVERE, null, ex);

}

// Tampilkan Citra Digital Ke panelGambar/gbrPanel ikon = new ImageIcon(oriIMG);

if (ikon.getIconWidth()>PREFERRED_WIDTH){ ikon = new

ImageIcon(ikon.getImage().getScaledInstance(PREFERRED_WIDTH, -1, Image.SCALE_DEFAULT));

if (ikon.getIconHeight() > PREFERRED_HEIGHT){

ikon = new ImageIcon(ikon.getImage().getScaledInstance(-1, PREFERRED_HEIGHT, Image.SCALE_DEFAULT));

} }

jLabel5.setIcon(ikon);

} else if (status == JFileChooser.CANCEL_OPTION) { oriIMG = null;

jLabel3.setIcon(null); filetype="";

}

}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { //Proses Enkripsi

String textString = jTextArea1.getText(); String textString1 = "";

long startTime, endTime;

textString1 = jTextField1.getText(); startTime = System.currentTimeMillis(); String msg=Enkripsi(textString,textString1); //proses Steganografi if (oriIMG==null){

JOptionPane.showMessageDialog(null, "Buka File Citra !", "Aplikasi Kriptografi&Steganography Citra Digital", 1);

} else { dBuf = oriIMG.getData().getDataBuffer(); raster = oriIMG.getRaster(); cm = oriIMG.getColorModel(); sm = raster.getSampleModel(); ispremulti = oriIMG.isAlphaPremultiplied(); pixels=((DataBufferByte)oriIMG.getRaster().getDataBuffer()).getData(); String q=""; if ("".equals(jTextField1.getText())) {

JOptionPane.showMessageDialog(null, "Kata sandi masih kosong !", "Aplikasi Kriptografi Citra Digital", 1);

} else { String msb=""; // String msg; String msgbt=""; // msg = jTextField1.getText(); msgb=msg.getBytes();

for (int iter = 0 ; iter < msg.length() ; iter++){ msb =byteToBinary(msgb[iter]);

msgbt += msb+ ""; }

System.out.println(msb);

System.out.println("nilai bit-bit pesan"+msgbt); String e="";

String f="";

int d=msgbt.length() ;

System.out.println("panjang yang disisipkan :"+d); String b=Integer.toBinaryString(d); if (b.length()!=21){ int c=21-b.length(); for(int i=0;i<c;i++){ e +=0; } f=e+b; }

System.out.println("nilai bit dari panjang "+f); int h=pixels.length-1;

String r="";

for(int i=0; i<f.length();i++ ){ r += f.charAt(i); if(r.length()==7){ String sementara=r; pixels[h]=Byte.parseByte(sementara, 2); q +=pixels[h]+ " "; h--; r=""; } } System.out.println("nilai bit" +q); System.out.println("panjang pixel" +h); String bitsContainer; String newBitsContainer; int indexOfByteInContainer = 0;

if (pixels.length < msgbt.length() * Byte.SIZE){ System.out.println("Process stop~!"); } else { String t=""; String s=""; String nilai=""; int i;

for (i=0; i<msgbt.length();i++){

bitsContainer=byteToBinary(pixels[i]);

// System.out.println("nilai bitcontainer" +bitsContainer);

Dokumen terkait