Publikasi Waktu Publikasi - Pengamanan Data Dengan Kombinasi Teknik Kriptografi Rabin Dan Teknik Steganografi Chaotic LSB

  No Judul Artikel Penulis Publikasi Waktu Publikasi Tempat 1.

  Decision Support System Model in the Determination of Accreditation of Institutions and Training Course

  Erlanie Sufarnaf Armaini Rahman Desinta Br Purba Jamaluddin

  International Seminar

  7 Maret 2011 Politeknik Negeri Medan

  2 Aplikasi Penyembunyian Pesan pada Berkas Digital Jaidup Banjarnahor

  Jamaluddin Riken Pakpahan Seminar Nasional

  21 September 2014 Fasilkom-TI USU

  3 Penyelesaian Masalah 8-Queen dengan Teknik Algoritma Genetik Jamaluddin

  Majalah Ilmiah Methoda Mei-

  Agustus 2012 UMI –Medan

  4 Analisis Perbandingan Kompresi Data dengan Fixed-Length Code, Variable-Length Code dan Algoritma Huffman Jamaluddin

  Majalah Ilmiah Methoda Mei-

  Agustus 2013 UMI - Medan

  Lampiran B LISTING PROGRAM import java.util.Random; import java.io.*; public class Rabin2 { public Rabin2() { } public static long rnd(int mini, int maxi) {

  // inclusive mini & maxi Random randomGenerator = new Random(); int r; do r = randomGenerator.nextInt(maxi + 1); while (r < mini); return r;

  } public static long modexp(long x, long y, long n) { long z = 1; for (long i = 1; i <= y; i++) { z = (x * z) % n; } return z; } public static boolean Fermat(int p) { if (p == 2) return true; int trial = (int)Math.log10(p) + 2; for (int i =0; i < trial; i++) { int a = (int)rnd(2, p - 1); int f = (int)modexp(a, p - 1, p); if (f != 1) return false;

  } return true; } public static long[] extended_gcd(long a, long b) { long[] result = new long[2]; if (b == 0) { result[0] = 1; result[1] = 0; return result;

  } long k = (long)Math.floor(a / b); long r = a % b; result = extended_gcd(b, r); long m = result[0]; long n = result[1]; result[0] = n; result[1] = m - k * n; return result;

  } public static long encrypt(long plainnum, long n) {

  String s = Long.toBinaryString(plainnum); String b = s + s; plainnum = Long.parseLong(b, 2); long ciphernum = modexp(plainnum, 2, n); return ciphernum;

  } public static boolean isDoubled(String x) { if (x.length() % 2 != 0) return false; int mid = x.length() / 2; for (int i = 0; i < mid; i++) if (x.charAt(i) != x.charAt(mid + i)) return false; return true;

  } public static long getTheRightDecryption(long[] decrypted) { int i; for (i = 0; i < 4; i++) if (isDoubled(Long.toBinaryString(decrypted[i]))) break;

  StringBuffer b = new StringBuffer(); String s = new String(Long.toBinaryString(decrypted[i])); long mid = s.length() / 2; for (i = 0; i < mid; i++) b.append(s.charAt(i)); return Long.parseLong(new String(b), 2);

  } public static long decrypt(long ciphernum, long p, long q) { long n = p * q; long[] result = new long[2]; result = extended_gcd(p, q); long yp = result[0]; long yq = result[1]; long mp = modexp(ciphernum, (p + 1) / 4, p); long mq = modexp(ciphernum, (q + 1) / 4, q); long v = yp * p * mq; long w = yq * q * mp; long[] decrypted = new long[4]; decrypted[0] = (v + w) % n; decrypted[1] = (v - w) % n; decrypted[2] = (-v + w) % n; decrypted[3] = (-v - w) % n; for (int i = 0; i < 4; i++) { if (decrypted[i] < 0)

  { decrypted[i] += n; } System.out.println("Nilai Plainnum"+(i+1)+"

  = " +decrypted[i]); } return getTheRightDecryption(decrypted);

  } public static int getRandomPrime(int mini, int maxi) { int p; do p = (int)rnd(mini, maxi) / 2 * 2 + 1; while (!Fermat(p)); return p;

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

  String plainnum2 = null; BufferedReader br = new BufferedReader(new

  InputStreamReader(System.in)); try {

  System.out.print("Masukkan Nilai yang akan di enkripsi : "); plainnum2 = br.readLine();

  } catch(Exception e){} int plainnum = Integer.parseInt(plainnum2); System.out.println("\n\nNilai Plainnum

  = " +plainnum); String s = Integer.toBinaryString(plainnum); //mengubah int menjadi String System.out.println("Nilai Plainnum dalam biner

  = " +s); String b = s + s; //mengandakan nilai s System.out.println("Nilai Plainnum Biner setelah digandakan

  = " +b); int maxi = Integer.parseInt(b, 2); //mengubah s(biner) menjadi desimal System.out.println("Nilai Plainnum dalam Desimal

  = " +maxi); int p, q; do p = getRandomPrime(1, maxi); while(p % 4 != 3); do q = getRandomPrime(1, maxi); while(q % 4 != 3 || p == q || p * q < 0); long n = p * q; long ciphernum = encrypt(plainnum, n); System.out.println ("\n\np = " + p); System.out.println ("q = " + q); System.out.println ("n = " + n); //System.out.println ("plainnum = " + plainnum); System.out.println ("\n\nCiphernum = " + ciphernum); System.out.println ("\n"); long decrypted = decrypt(ciphernum, p, q); System.out.println("\n\nPlainnum Hasil Dekripsi = " + decrypted);

  } }

  import java.io.File; import java.awt.Point; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.awt.image.DataBufferByte; import javax.imageio.ImageIO; import javax.swing.JOptionPane; public class Steganography { public Steganography()

  { } public boolean encode(String path, String original, String ext1, String stegan, String message)

  { String file_name = image_path(path,original,ext1); BufferedImage image_orig = getImage(file_name); BufferedImage image = user_space(image_orig); image = add_text(image,message); return(setImage(image,new

  File(image_path(path,stegan,"png")),"png")); } public String decode(String path, String name) { byte[] decode; try {

  BufferedImage image = user_space(getImage(image_path(path,name,"png"))); decode = decode_text(get_byte_data(image)); return(new String(decode));

  } catch(Exception e) {

  JOptionPane.showMessageDialog(null, "Tidak terdapat pesan rahasia didalam

  Gambar !! ","Error", JOptionPane.ERROR_MESSAGE); return "";

  } } private String image_path(String path, String name, String ext)

  { return path + "/" + name + "." + ext; } private BufferedImage getImage(String f) {

  BufferedImage image = null; File file = new File(f); try { image = ImageIO.read(file); } catch(Exception ex) {

  JOptionPane.showMessageDialog(null, "File Gambar tidak dapat dibuka!!","Error",JOptionPane.ERROR_MESSAGE);

  } return image; } private boolean setImage(BufferedImage image, File file,

  String ext) { try

  { file.delete(); //delete resources used by the File

  ImageIO.write(image,ext,file); return true; } catch(Exception e) {

  JOptionPane.showMessageDialog(null, "File tidak dapat disimpan!","Error",JOptionPane.ERROR_MESSAGE); return false;

  }

  } private BufferedImage add_text(BufferedImage image, String text)

  { byte img[] = get_byte_data(image); byte msg[] = text.getBytes(); byte len[] = bit_conversion(msg.length); try { encode_text(img, len, 0); encode_text(img, msg, 32);

  } catch(Exception e) {

  JOptionPane.showMessageDialog(null,"Target File tidak dapat menampung pesan!!", "Error",JOptionPane.ERROR_MESSAGE);

  } return image; } private BufferedImage user_space(BufferedImage image) {

  BufferedImage new_img = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR);

  Graphics2D graphics = new_img.createGraphics(); graphics.drawRenderedImage(image, null); graphics.dispose(); //release all allocated memory for this image return new_img;

  } private byte[] get_byte_data(BufferedImage image) {

  WritableRaster raster = image.getRaster(); DataBufferByte buffer =

  (DataBufferByte)raster.getDataBuffer(); return buffer.getData(); } private byte[] bit_conversion(int i) { byte byte3 = (byte)((i & 0xFF000000) >>> 24); byte byte2 = (byte)((i & 0x00FF0000) >>> 16); byte byte1 = (byte)((i & 0x0000FF00) >>> 8 ); byte byte0 = (byte)((i & 0x000000FF) ); return(new byte[]{byte3,byte2,byte1,byte0});

  } private byte[] encode_text(byte[] image, byte[] addition, int offset)

  { if(addition.length + offset > image.length) { throw new IllegalArgumentException("File tidak cukup panjang!");

  } for(int i=0; i<addition.length; ++i) { int add = addition[i]; for(int bit=7; bit>=0; --bit, ++offset) //ensure the new offset value carries on through both loops { int b = (add >>> bit) & 1; image[offset] = (byte)((image[offset] &

  0xFE) | b ); }

  } return image; } private byte[] decode_text(byte[] image) { int length = 0; int offset = 32; for(int i=0; i<32; ++i) { length = (length << 1) | (image[i] & 1); } byte[] result = new byte[length]; for(int b=0; b<result.length; ++b ) { for(int i=0; i<8; ++i, ++offset)

  { result[b] = (byte)((result[b] << 1) | (image[offset] & 1));

  } } return result;

  } }

  mport java.io.File; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.awt.event.ActionListener; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.ImageIcon; import javax.swing.JMenuItem; import javax.swing.JTextArea; import javax.imageio.ImageIO; import javax.swing.JOptionPane; import javax.swing.JFileChooser; public class Steganography_Controller { private Steganography_View view; private Steganography_Rabin rabin; private Steganography model; private JPanel decode_panel; private JPanel encode_panel; private JTextArea input; private JButton encodeButton,decodeButton; private JLabel image_input; private JMenuItem encode; private JMenuItem decode; private JMenuItem exit; private Encode enc; private Decode dec; private EncodeButton encButton; private DecodeButton decButton; private String stat_path = ""; private String stat_name = ""; public Steganography_Controller(Steganography_View aView,

  Steganography aModel) { view = aView; model = aModel; encode_panel = view.getTextPanel(); decode_panel = view.getImagePanel(); input = view.getText(); image_input = view.getImageInput(); encodeButton = view.getEButton(); decodeButton = view.getDButton(); encode = view.getEncode(); decode = view.getDecode(); exit = view.getExit(); enc = new Encode(); encode.addActionListener(enc); dec = new Decode(); decode.addActionListener(dec); exit.addActionListener(new Exit()); encButton = new EncodeButton(); encodeButton.addActionListener(encButton); decButton = new DecodeButton(); decodeButton.addActionListener(decButton); encode_view();

  } private void encode_view() { update(); view.setContentPane(encode_panel); view.setVisible(true);

  } private void decode_view() { update(); view.setContentPane(decode_panel); view.setVisible(true);

  } private class Encode implements ActionListener { public void actionPerformed(ActionEvent e)

  { encode_view(); }

  } private class Decode implements ActionListener { public void actionPerformed(ActionEvent e)

  { decode_view(); JFileChooser chooser = new JFileChooser("./"); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.setFileFilter(new Image_Filter()); int returnVal = chooser.showOpenDialog(view); if (returnVal == JFileChooser.APPROVE_OPTION){ File directory = chooser.getSelectedFile(); try{

  String image = directory.getPath(); rabin.decrypt(returnVal,directory.getPath(),directory.getPath()); stat_name = directory.getName(); stat_path = directory.getPath(); stat_path = stat_path.substring(0,stat_path.length()-stat_name.length()-1); stat_name = stat_name.substring(0, stat_name.length()-4); image_input.setIcon(new

  ImageIcon(ImageIO.read(new File(image)))); } catch(Exception except) { JOptionPane.showMessageDialog(view, "File tidak dapat dibuka !!",

  "Error!", JOptionPane.INFORMATION_MESSAGE);

  } }

  } } private class Exit implements ActionListener { public void actionPerformed(ActionEvent e)

  {

  System.exit(0); }

  } private class EncodeButton implements ActionListener { public void actionPerformed(ActionEvent e)

  { JFileChooser chooser = new JFileChooser("./"); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.setFileFilter(new Image_Filter()); int returnVal = chooser.showOpenDialog(view); if (returnVal == JFileChooser.APPROVE_OPTION){

  File directory = chooser.getSelectedFile(); try{

  String text = input.getText(); String ext =

  Image_Filter.getExtension(directory); String name = directory.getName(); String path = directory.getPath(); path = path.substring(0,path.length()-name.length()-1); name = name.substring(0, name.length()-4);

  String stegan = JOptionPane.showInputDialog(view,

  "Masukkan Nama File yang telah diEnkoding", "Nama File",

  JOptionPane.PLAIN_MESSAGE); if(model.encode(path,name,ext,stegan,text)) {

  JOptionPane.showMessageDialog(view, "Gambar berhasil di Encoding dengan sempurna",

  "Success!", JOptionPane.INFORMATION_MESSAGE);

  } else {

  JOptionPane.showMessageDialog(view, "Gambar tidak dapat di Encoding",

  "Error!", JOptionPane.INFORMATION_MESSAGE);

  } rabin.encrypt(text,e); decode_view(); image_input.setIcon(new

  ImageIcon(ImageIO.read(new File(path + "/" + stegan + ".png")))); } catch(Exception except) { JOptionPane.showMessageDialog(view, "File tidak dapat dibuka !!",

  "Error!", JOptionPane.INFORMATION_MESSAGE);

  } }

  } } private class DecodeButton implements ActionListener { public void actionPerformed(ActionEvent e)

  { String message = model.decode(stat_path, stat_name); System.out.println(stat_path + ", " + stat_name); if(message != "") { encode_view();

  JOptionPane.showMessageDialog(view, "Gambar telah berhasil di Decoding!",

  "Success!", JOptionPane.INFORMATION_MESSAGE); input.setText(message);

  } else {

  JOptionPane.showMessageDialog(view, "Gambar tidak bisa di Decoding!",

  "Error!", JOptionPane.INFORMATION_MESSAGE);

  } }

  } public void update() { input.setText(""); image_input.setIcon(null); stat_path = ""; stat_name = "";

  } }