LAMPIRAN A : LISTING PROGRAM Basic.java

  

LAMPIRAN A : LISTING PROGRAM

Basic.java

  package ferluleapp; /**

  • @author Ratna */ public class basic {

  //fungsi untuk menghitung modulus dalam pangkat yang besar public static int modExp(int a, int b, int x) { int c = 1 ; for (int i = 0 ; i < b ; i++ ){ c = (a * c) % x; } return c; }

  //membuat daftar karakter dalam array public static char codeChar[] = { ' ','1','2','3','4','5','6','7','8','9','0','- ','=','!','@','#','$','%','^','&','*','(',')','_','+','a','b','c','d' ,'e','f', 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w',' x','y','z','A','B','C','D','E','F','G','H','I','J','K', 'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',',','.',' /',';','‘','[',']','\'','<','>','?',':','“','{','}',

  '|','`','~','€','£','¥','©','β' };

  //merubah karakter menjadi kode public static int charToCode(char m){ int codeC = 0; for (int i = 0 ; i < codeChar.length; i++) { if (m == codeChar[i]){ codeC = i; break; } } return codeC; }

  //merubah kode menjadi karakter public static char codeToChar(int co){ char charC = 0; for (int i = 0 ; i < codeChar.length; i++){ if(co == i){ charC = codeChar[i]; break; } } return charC; }

  //fungsi untuk pangkat dengan inputan n(nilai awal), m(pangkat) public static int mathPow(int n, int m){ int x = 1; for( int i = 1 ; i <= m ; i++ ){ x = n * x; } return x; } }

  Elgamal.java

  package ferluleapp; import java.util.Random; /**

  • @author Ratna */ public class elgamal {

  //fungsi untuk memecah ciphernumber dari proses enkripsi public static String mt(String x){ String result = ""; String a = ""; String b = ""; char resulta = 0; char resultb = 0; if(x.length() == 1){ a = "0"; b = String.valueOf(x.charAt(0)); } else if(x.length() == 2){ a = String.valueOf(x.charAt(0)); b = String.valueOf(x.charAt(1)); } else if(x.length() == 3){ a = String.valueOf(x.charAt(0)); b = String.valueOf(x.charAt(1)) + String.valueOf(x.charAt(2)); } else if(x.length() == 4){ a = String.valueOf(x.charAt(0)) + String.valueOf(x.charAt(1)); b = String.valueOf(x.charAt(2)) + String.valueOf(x.charAt(3)); } resulta = basic.codeToChar(Integer.parseInt(a)); resultb = basic.codeToChar(Integer.parseInt(b)); result = String.valueOf(resulta)+String.valueOf(resultb); return result; }

  //fungsi proses enkripsi public static String enkripsi(String str, int keyP){ //[START] Initialize variabel-variabel

  Random gen = new Random(); int keyAlpha = 0, keyBeta = 0, keyA = 0; int keyK = 0; int keyGamma = 0; int keyDelta = 0; int ca = 0; String cipherText = "";

  //[END] Initialize variabel-variabel keyAlpha = prime.isPrimitif(keyP); //perulangan mencari nilai kunci alpha int tempKeyA = 0; for( int i = 0 ; i < keyP - 2 ; i++ ){ tempKeyA = gen.nextInt(keyP-2) + 1; if ( prime.isPrime(tempKeyA) == true && tempKeyA < 1000){ keyA = tempKeyA; break; } }

  //perulangan kunci alpha menghindari digit kedua dari belakang 0 if( String.valueOf(keyA).length() > 2){ while ( String.valueOf(keyA).charAt(String.valueOf(keyA).length()-2) == '0' ){ for( int i = 0 ; i < keyP - 2 ; i++ ){ tempKeyA = gen.nextInt(keyP-2) + 1; if ( prime.isPrime(tempKeyA) == true && tempKeyA < 1000){ keyA = tempKeyA; break; } } } } keyBeta = basic.modExp(keyAlpha, keyA, keyP); cipherText += mt(Integer.toString(keyP))+""+mt(Integer.toString(keyA)); for (int i = 0 ; i < str.length() ; i++){ keyK = (int) (Math.random() * (keyP - 2)); // menentukan nilai acak K,dimana K elemen dari 0 ... p-2 ca = basic.charToCode(str.charAt(i)); // merubah char ke bentuk kode keyGamma = basic.modExp(keyAlpha, keyK, keyP); // menghitung nilai Gamma untuk proses enkripsi if ( Integer.toString(keyGamma).length() > 2){ while ( Integer.toString(keyGamma).charAt(Integer.toString(keyGamma).length()

  • 2) == '0' ){ keyK = (int) (Math.random() * (keyP - 2)); keyGamma = basic.modExp(keyAlpha, keyK, keyP); } } keyDelta = basic.modExp((basic.modExp(keyBeta, keyK, keyP)*basic.modExp(ca, 1, keyP)), 1, keyP); // menghitung nilai Delta untuk proses enkripsi if ( Integer.toString(keyDelta).length() > 2){ while ( Integer.toString(keyDelta).charAt(Integer.toString(keyDelta).length()
  • 2) == '0' ){ keyK = (int) (Math.random() * (keyP - 2)); keyGamma = basic.modExp(keyAlpha, keyK, keyP); keyDelta = basic.modExp((basic.modExp(keyBeta, keyK, keyP)*basic.modExp(ca, 1, keyP)), 1, keyP); } } cipherText += mt(Integer.toString(keyGamma))+""+mt(Integer.toString(keyDelta)); } return cipherText; } // fungsi untuk melakukan proses dekripsi. public static String dekripsi(String txt){

  int keyDekrip = 0; int keyDG = 0; int keyDek= 0; int cd = 0; String plainText = ""; String a = "", b = "", c = ""; int q = 0 , n = 1; String tempKeyP = "", tempKeyA = ""; String tempKeyPa = String.valueOf(basic.charToCode(txt.charAt(0))); String tempKeyPb = String.valueOf(basic.charToCode(txt.charAt(1))); String tempKeyAa = String.valueOf(basic.charToCode(txt.charAt(2))); String tempKeyAb = String.valueOf(basic.charToCode(txt.charAt(3))); if ( tempKeyPb.length() == 3 ){ if(tempKeyPb.substring(0, 1).equals("1") && tempKeyPb.substring(1, 2).equals("0")){ tempKeyPb = tempKeyPb.substring(1, 2) + tempKeyPb.substring(2, 3); } } if ( tempKeyAb.length() == 3 ){ if(tempKeyAb.substring(0, 1).equals("1") && tempKeyAb.substring(1, 2).equals("0")){ tempKeyAb = tempKeyAb.substring(1, 2) + tempKeyAb.substring(2, 3); } } int keyP = Integer.valueOf(tempKeyPa+tempKeyPb); int keyA = Integer.valueOf(tempKeyAa+tempKeyAb); txt = txt.substring(4, txt.length()); int[] hh = new int[txt.length()/2]; for (int j = 0 ; j < txt.length()/2 ; j++){ a = String.valueOf(basic.charToCode(txt.charAt(q))); b = String.valueOf(basic.charToCode(txt.charAt(q+1))); q = q + 2; c = a+b; hh[j] += Integer.valueOf(c); } int count = 0; int keyGammaInvers = 0 ; int tempa = 0, tempb = 0; for ( int i = 0 ; i < (hh.length)/2 ; i++){ keyGammaInvers = keyP - 1 - keyA; keyDekrip = basic.modExp(hh[count], (keyGammaInvers), keyP); tempa = basic.modExp(hh[(count+1)], 1, keyP); keyDG = basic.modExp((tempa * keyDekrip), 1, keyP); plainText += basic.codeToChar(keyDG); count = count + 2; } return plainText; } }

  fileChooser.java

  package ferluleapp; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import javax.swing.JFileChooser; /**

  • @author Ratna */ public class fileChooser { public static String test() throws IOException { String str = "";

  JFileChooser chooser=new JFileChooser(); int returnVal = chooser.showOpenDialog(null); if(returnVal == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); BufferedReader br=new BufferedReader(new FileReader(f)); String st=""; while((st=br.readLine())!=null){ str += st+"\n"; } } return str; } static void main(String string) { throw new UnsupportedOperationException("Not yet implemented"); } }

  ifPrime.java

  package ferluleapp; /**

  • @author Ratna */ public class ifPrime {

  //fungsi untuk metode Fermat public static boolean isFermat(int prime){ boolean isFermat = false; for (int i = 1 ; i < prime ; i++){ if(basic.modExp(i, (prime-1), prime) == 1){ isFermat = true; } else { break; } } return isFermat; }

  //fungsi untuk metode Lucas-Lehmer public static int isLuLe(int x){ boolean isLuLe = false; int keymp = 0; boolean isMersenePrime = false; int mp = basic.mathPow(2, x) - 1; int s = 4; //int n = 0; if (prime.isPrime(mp) == true){ isMersenePrime= true; } for ( int i = 3 ; i <= x ; i++){ n++; s = ((basic.mathPow(s, 2)) - 2 ) % mp; } if( s == 0 && isMersenePrime == true){ keymp = mp; } return keymp; } }

  keyGenerator.java

  package ferluleapp; import java.util.Random; /**

  • @author Ratna */ //class untuk membangkitkan kunci berdasarkan Fermat atau Lucas- Lehmer public class keyGenerator { public static int keyGenFermat(){ int s = 0, t = 0, keyP = 0; for ( int i = 0 ; i < 5000 ; i++){ s = prime.primeGenerator(); //System.out.println("s : "+s+" : "+ifPrime.isFermat(s)+" : "+prime.isSecurePrime(s));

  if( prime.isPrime(s) == true ){ if ( ifPrime.isFermat(s) == true && prime.isSecurePrime(s) == true && s > 100 ){ keyP = s; break; } } else { continue; } } return keyP; } public static int keyGenLuLe(){ int keyP = 0, t = 0; Random generator = new Random(); for ( int i = 0 ; i < 50 ; i++){ t = generator.nextInt(50)+1; if ( prime.isPrime(t) == true) { if (t==31){ continue; } if ( ifPrime.isLuLe(t) != 0 && ifPrime.isLuLe(t) > 255 ){ break; } else if ( ifPrime.isLuLe(t) == 0) { keyP = 0; } } } return keyP; } }

  Prime.java

  package ferluleapp; import java.util.Random; /**

  • @author Ratna */ public class prime {

  //fungsi untuk mengecek bilangan prima public static boolean isPrime(int p){ boolean prime = false; int c = 0; int b = 1; for (int i = 0 ; i < p ; i++){ b = b + 1; c = p % b; if ( c == 0 ){ break; } } if ( p == b ){ prime = true; } else { prime = false; } return prime; } public static boolean isPrimeDouble(double p){ boolean prime = false; double c = 0; int b = 1; for (int i = 0 ; i < p ; i++){ b = b + 1; c = p % b; if ( c == 0 ){ break; } } if ( p == b ){ prime = true; } else { prime = false; } return prime; }

  //fungsi untuk mengecek bilangan prima aman public static boolean isSecurePrime(int x){ int q = 0 ; q = ( x - 1 ) / 2; if( isPrime(q) == true ){ return true; } else { return false; } }

  //fungsi untuk membangkitkan bilangan acak public static int primeGenerator(){ Random generator = new Random(); int r = generator.nextInt(5000)+256; return r; } // fungsi untuk melakukan proses enkripsi

  //fungsi untuk mengecek bilangan primitif public static int isPrimitif(int keyP){ int q = 0; int alpha = 0; int alphaS = 0 ; int alphaQ = 0; int tempPrim = 0; Boolean isPrim = false; Random gen = new Random(); for ( int i = 0 ; i < keyP-2 ; i++ ){ tempPrim = gen.nextInt(keyP-2) + 1; q = (keyP - 1) / 2; alphaS = basic.modExp(tempPrim, 2, keyP); alphaQ = basic.modExp(tempPrim, q, keyP); if ( (alphaS == 1 && alphaQ == 1) || (alphaS == 1 || alphaQ == 1) ){ isPrim = false; } else { isPrim = true; alpha = tempPrim; break; }

  } return alpha; } }