57
LAMPIRAN A : LISTING PROGRAM
/* * Source Code Program Algoritma Kombinasi RSA dan ElGamal * oleh : * Nama : Hasnan Aulia Haq * NIM : 100823019 * Prodi : Ekstensi Matematika * Jurusan : Matematika FMIPA USU 2010 * */ package rsaelgamal; import java.math.BigInteger; import java.util.Random; import java.io.*; public class Kombinasi { private private private private private private private private private private
BigInteger BigInteger BigInteger BigInteger BigInteger BigInteger BigInteger BigInteger BigInteger BigInteger
p; q; N; g; phi; x; e; y; d; c;
public static BigInteger ZERO = BigInteger.ZERO; public static BigInteger ONE = new BigInteger ("1"); public static BigInteger TWO = new BigInteger ("2"); private BigInteger batas = new BigInteger ("256"); private Random r; public Kombinasi() { r = new Random(); p = PrimaAman(batas); q = PrimaAman(batas); while (p.compareTo(q)==0){ p = PrimaAman(batas); q = PrimaAman(batas); } N = p.multiply(q); g = Primitif (N); e = PrimaAman(batas.divide(TWO)); x = PrimaAman(batas.divide(TWO));
Universitas Sumatera Utara
58
phi = p.subtract(BigInteger.ONE).multiply (q.subtract(BigInteger.ONE)); while (N.gcd(e).compareTo(BigInteger.ONE) == 1 && e.compareTo(N) == 1 ) { e.add(BigInteger.ONE); } while (N.gcd(x).compareTo(BigInteger.ONE) == 1 && x.compareTo(N) == 1 ) { x.add(BigInteger.ONE); } while (N.gcd(g).compareTo(BigInteger.ONE) == 1 && g.compareTo(N) == 1 ) { g.add(BigInteger.ONE); } d = e.modInverse(phi); y = g.modPow(x, N); } public static void header (){ System.out.println ("***************************************"); System.out.println ("* Program Pesan Rahasia *"); System.out.println ("* Dgn Algoritma Kombinasi RSA-ElGamal *"); System.out.println("* *"); System.out.println ("* Copyright (c) 2012 Hasnan Aulia Haq *"); System.out.println ("* Program Studi Ekstensi Matematika FMIPA USU *"); System.out.println ("***************************************”); System.out.println (""); System.out.println (""); } public static int CekPrima(BigInteger a){ int cekPrima; BigInteger b,c; b=ONE; do{ b=b.add(ONE); c=a.mod(b); } while (c.compareTo(ZERO)>0); if (a.compareTo(b)==0) cekPrima=1; else cekPrima=0; return cekPrima; }
Universitas Sumatera Utara
59
public static BigInteger PrimaAman(BigInteger batas){ BigInteger rand; Random r= new Random(); do{ rand = new BigInteger(10,r); } while (rand.compareTo(batas) == 1); BigInteger p; int cekPrima; do{ int cekPri; do { rand=rand.add(ONE); cekPri = CekPrima(rand); } while (cekPri==0); p = (TWO.multiply(rand).add(ONE)); cekPrima=CekPrima(p); } while (cekPrima==0); return p; } public static int CekPrimitif (BigInteger alpha, BigInteger p){ int cekPrimitif; BigInteger b,q; q = (p.subtract(ONE).divide(TWO)); b = alpha.modPow(TWO, p); if (b.compareTo(ONE)==0){ cekPrimitif = 0; } else { b= alpha.modPow(q, p); if (b.compareTo(ONE)==0){ cekPrimitif = 0; } else { cekPrimitif = 1; } } return cekPrimitif; } public static BigInteger Primitif(BigInteger p) { BigInteger alfa; Random r= new Random(); BigInteger nilaik; do {
Universitas Sumatera Utara
60
do{ nilaik = new BigInteger(10,r); } while (nilaik.compareTo(p) == 1); alfa = nilaik.add(ONE); } while (CekPrimitif(alfa,p) < 1); return alfa; } public static void cetakKunci(BigInteger N, BigInteger e, BigInteger x, BigInteger d, BigInteger y, BigInteger g){ System.out.println("Kunci Publik (N, e, x ) = (" + N +" , "+ e +" , "+ x +")"); System.out.println("Kunci Privat (d,y) = (" + d +" , "+ y +")"); System.out.println("Bilangan acak g = " + g); System.out.println(""); System.out.println(""); } // for mencetak ascii public static void stringkeAscii (byte[] m){ System.out.println(""); System.out.println("Plainteks :"); for (int i=0; i<m.length;i++){ System.out.println ("\tm"+i+" = " +m [i]); } System.out.println(""); } public static void cetakChiper (BigInteger [][] a){ System.out.println("Chiperteks (c1,c2) :"); for (int i=0; i
Universitas Sumatera Utara
61
} System.out.println(""); System.out.println(""); } public BigInteger [][] Enkripsi (byte[] m, BigInteger y, BigInteger e,BigInteger N,BigInteger g){ BigInteger [][] chiper = new BigInteger [m.length][2]; // For Enkripsi for (int i=0; i<m.length;i++){ // mendapatkan BigInteger m BigInteger me = new BigInteger(String.valueOf(m[i])); // mendapatkan nilai acak c c = PrimaAman(batas.divide(TWO)); // mencari nilai minus c BigInteger minc = c.negate(); chiper [i][0] = ((me.multiply(y.modPow(minc, N))) .modPow(e, N).mod(N)); chiper [i][1] = g.modPow(c, N); } return chiper; } private BigInteger[] dekripsi (BigInteger[][] chiper1, BigInteger d, BigInteger x, BigInteger N) { BigInteger[] dekripsi = new BigInteger [chiper1.length]; // For Dekripsi for (int i=0; i
Universitas Sumatera Utara
62
BigInteger d = Kombinasi.d; BigInteger y = Kombinasi.y; DataInputStream in=new DataInputStream(System.in); String teststring; header (); cetakKunci(N,e,x,d,y,g); // memasukkan plaintext System.out.println("Masukkan pesan yang akan di enkripsi :"); System.out.print("Pesan = "); teststring=in.readLine(); byte [] m = teststring.getBytes(); System.out.println("Jumlah Plainteks " + m.length+ " huruf"); // mencetak nilai ascii plainteks stringkeAscii(m); // Enkripsi BigInteger [][] chiper = Kombinasi.Enkripsi(m,y,e,N,g); cetakChiper(chiper); // DEKRIPSI BigInteger [] dekripsi = Kombinasi.dekripsi(chiper, d, x, N); // mencetak hasil Dekripsi cetakDekripsi(dekripsi); } }
Universitas Sumatera Utara
63
LAMPIRAN B : TABEL ASCII KODE ASCII ( 0 – 127 )
Universitas Sumatera Utara
64
KODE ASCII Extendeed ( 128 – 255 )
Universitas Sumatera Utara