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){
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;
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; }