LAMPIRAN A : LISTING PROGRAM
PrimeGenerator.java
package tandatangandigital;
import java.math.*;
import java.util.*;
public class PrimeGenerator {
BigInteger TWO = BigInteger.ONE.add(BigInteger.ONE);
BigInteger Zero = BigInteger.ZERO;
BigInteger minus = new BigInteger("-1");
// fungsi ini digunakan untuk mendapatkan numbits untuk
// mencari bilangan prima pada bigInteger
public int GetNumbit(int panjangDigitPrima)
{
int numbits = 0;
BigInteger TwoValue = new BigInteger("2");
BigInteger resultRandomNumber;
//cek panjang digit prima
//apabila nilai random number sama dengan panjang digit prima, maka
// nilai numbit = randomnumbit
//ini digunakan untuk menentukan distribusi nilai pada Biginteger
random
boolean cekNumbit = false;
while(!cekNumbit)
{
Random rand = new Random();
int randNumbits = rand.nextInt(332);
//332 = panjangnya 100 digit
//perhitungan distribusi nilai pada BigInteger = 2 ^
// numbits -1
resultRandomNumber =
(TwoValue.pow(randNumbits)).subtract(BigInteger.ONE);
if(String.valueOf(resultRandomNumber).length() ==
{
cekNumbit = true;
numbits = randNumbits;
}
return numbits;
}
public BigInteger getPrima (int panjangDigitPrima, int
numbits) {
BigInteger pangkat,Legendre,s;
BigInteger bilPrima = BigInteger.ONE;
boolean prime;
prime = false;
String strbilPrima;
Random rand = new Random();
while (prime==false || (String.valueOf(bilPrima).
length() != panjangDigitPrima))
{
bilPrima = new BigInteger(numbits, rand);
if (bilPrima.mod(TWO) != BigInteger.ZERO;
strbilPrima = String.valueOf(bilPrima);
BigInteger acak = TWO;
int nPrimaDigit = strbilPrima.length();
int count = 0;
for (int i=0; i <nPrimaDigit; i++){
acak = acak.add(BigInteger.ONE);
pangkat =(bilPrima.subtract(BigInteger.ONE)).
divide(TWO);
Legendre = acak.modPow(pangkat, bilPrima);
}
}
if(count == nPrimaDigit) {
prime = true;
}
else{
//reset nilai prime ke false
prime = false;
}
}
return bilPrima;
}
}
RSA.Java
package tandatangandigital;
import java.math.*;
import java.util.*;
public class RSA {
BigInteger TWO = new BigInteger("2");
BigInteger minus = (BigInteger.ONE).subtract(TWO);
// mencari perkalian 2 bilangan prima p dan q
//
public BigInteger cariN (BigInteger p, BigInteger q) {
BigInteger n;
n=p.multiply(q);
System.out.println(n);
return n;
}
// cari nilai phi, dimana phi = (p-1)(q-1)
BigInteger phi;
phi =
((p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInt
eger.ONE)));
return phi;
}
// Cari nilai kunci, dimana gcd(e,phi) = 1
public BigInteger getPublickey (BigInteger n,BigInteger p,
BigInteger q, BigInteger phi) {
BigInteger e,nilaiGCD;
Random rand = new Random();
e = BigInteger.probablePrime(n.bitLength()/2, rand);
// nilaiGCD = this.cariGCD(e, phi);
while (phi.gcd(e).intValue() != 1 ) {
e = BigInteger.probablePrime(n.bitLength()/2, rand);
}
return e;
}
// Cari nilai kunci privat, dimana d = e (pangkat -1) mod (phi)
public BigInteger getPrivatekey (BigInteger e, BigInteger phi) {
BigInteger d;
d = e.modInverse(phi);
return d;
}
// Method untuk mengubah character ke Number ASCII
public String characterToASCII(String str){
String number="";
for(int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
int j = (int) c;
cod = String.valueOf(j);
if (cod.length()==2) {
cod = "0"+cod;
}
number += cod;
}
System.out.println("nilai ascii : "+number);
return number;
}
// Method untuk enkripsi pesan, cipherteks = pesan (pangkat d)
mod n
public String enkripsi (String code, BigInteger d, BigInteger n)
{
BigInteger hasil;
double panjang = code.length();
int pjgcode = (int) panjang;
int m;
String cipherNumber ="";
//String strN = String.valueOf(n);
int panjangN = (String.valueOf(n)).length();
String [] pesan = new String[(code.length())];
System.out.println("nilai panjang pesan :"+pjgcode);
System.out.println("nilai panjang n : "+panjangN);
if (pjgcode < panjangN) {
BigInteger cod = new BigInteger (code);
hasil = cod.modPow(d, n);
System.out.println("nilai hasil enkripsi ="+hasil+"dari
nilai :"+cod+"pangkat dari"+d+"modulo dari "+n);
cipherNumber = hsil;
}
else {
m = panjangN-1; // nilai
m < n, maka, m = panjangN-1
int awal = 0;
int akhir = 0;
int banyakBlokCode = (int) (Math.ceil(panjang / m));
for (int i = 0; i < banyakBlokCode; i++) {
awal = i * m ;
akhir = awal + m;
if (akhir > code.length()) {
akhir = code.length();
}
pesan[i] = code.substring(awal, akhir);
BigInteger s = new BigInteger(pesan[i]);
hasil = s.modPow(d, n);
String []b = new String[(panjangN)];
String hsil = String.valueOf(hasil);
if (hsil.length() < panjangN)
{
int selisih = panjangN-hsil.length();
for (int k=0; k < selisih; k++) {
hsil ='0'+hsil;
}
}
cipherNumber +=hsil;
}
}
return cipherNumber;
// Method untuk mengubah ciphernumber ke bentuk heksa desimal
public String cipherNumberToHeksa(String cipherNumber){
String heksa = new String();
String [] psan = new String[cipherNumber.length()];
String cipherteks="";
if (cipherNumber.length() % 2 != 0) {
cipherNumber = "0"+cipherNumber;
}
int blokPesan = cipherNumber.length() / 2;
int awal = 0;
int akhir = 2;
for(int i=0; i < blokPesan; i++) {
awal = i*2;
akhir = awal+2;
psan[i] =cipherNumber.substring(awal,akhir);
Integer b = Integer.parseInt(psan[i]);
heksa = Integer.toHexString(b);
if(heksa.length() == 1)
{
heksa = "0"+heksa;
}
cipherteks +=heksa;
System.out.println("hasil dari cipher heksa :"
+cipherteks);
}
return cipherteks;
}
public String cipherteksToCiphernumber (String heksa,BigInteger n,
int panjangPlainteksASCII) {
String N = String.valueOf(n);
String ciphernumber="";
String ciphernumberBaru;
int b;
String cipher;
int blokPesan = heksa.length() / 2;
int awal = 0;
int akhir =2;
for(int i=0; i<blokPesan; i++) {
awal = i*2;
akhir = awal+2;
if(akhir>heksa.length()) {
akhir = heksa.length();
}
number[i] =heksa.substring(awal,akhir);
b = Integer.parseInt(number[i],16);
cipher = String.valueOf(b);
if (cipher.length() ==1) {
cipher = "0"+cipher;
}
ciphernumber +=cipher;
}
if (ciphernumber.length()% N.length() ==1) {
ciphernumberBaru
=ciphernumber.substring(1,ciphernumber.length());
ciphernumber = ciphernumberBaru;
System.out.println("hasil dari ciphernumber :"
+ciphernumber);
}
return ciphernumber;
}
public String dekripsi(String ciphernumber, BigInteger e,
BigInteger n, int panjangPlainteksASCII) {
String nilaiN = String.valueOf(n);
double panjang = ciphernumber.length();
int a = (int) panjang;
String [] psan = new String[a];
int blokPesan = (int) (Math.ceil(panjang/nilaiN.length()));
int awal = 0;
int akhir =nilaiN.length();
String ciphernumberBaru;
String ascii="";
if (ciphernumber.length() <= nilaiN.length())
{
BigInteger decimal = new BigInteger(ciphernumber);
String addString="";
hasil = decimal.modPow(e, n);
ascii+=hasil;
if (ascii.length() < panjangPlainteksASCII) {
int selisih = panjangPlainteksASCII - ascii.length();
for (int j = 1 ; j <= selisih ; j++)
{
addString +="0";
}
ascii = addString + ascii;
}
System.out.println("nilai ascii ="+ascii);
}
else {
for(int i = 0; i < blokPesan; i++) {
awal = i*nilaiN.length();
akhir = awal+nilaiN.length();
if (akhir > ciphernumber.length()) {
akhir = ciphernumber.length();
psan[i] = ciphernumber.substring(awal,akhir);
System.out.println("nilai array pesan " +psan[i]);
BigInteger decimal = new BigInteger (psan[i]);
hasil = decimal.modPow(e, n);
System.out.println("hasil dekripsi :" +hasil);//
dekripsi pesan
String hasilDekripsi = String.valueOf(hasil);
//Logic untuk mengecek panjang satu blok apa sudah
valid atau belum dengan panjang plainteks ascii semula
int currentLengthText = (nilaiN.length()-1) +
ascii.length();
System.out.println(String.valueOf(currentLengthText));
if (currentLengthText <= panjangPlainteksASCII)
{
if(hasilDekripsi.length() < (nilaiN.length()-1))
{
int selisih = nilaiN.length() -
hasilDekripsi.length() - 1;
String addString = "";
for (int j = 1 ; j <= selisih ; j++)
{
addString +="0";
}
hasilDekripsi = addString + hasilDekripsi;
}
}
else
{
int sisaTeks = panjangPlainteksASCII -
ascii.length();
int selisih = sisaTeks - hasilDekripsi.length();
String addString = "";
System.out.println("addString :"+addString);
for (int j = 1 ; j <= selisih ; j++)
{
}
hasilDekripsi = addString + hasilDekripsi;
}
ascii +=hasilDekripsi;
}
}
return ascii;
}
public String plainteksASCIIToPlainteksString(String ascii) {
StringBuilder sb= new StringBuilder();
int awal =0;
int blok = ascii.length() / 3;
int akhir = 0;
String[] pesan = new String [(ascii.length())];
//mengubah number ASCII ke character
if(ascii.length()< 3) {
sb.append((char)Integer.parseInt(ascii));
}
else {
for (int i=0; i < blok; i++) {
awal = i*3;
akhir = awal+3;
if (akhir > ascii.length()) {
akhir = ascii.length();
}
pesan[i] = ascii.substring(awal,akhir);
int plainteks = Integer.parseInt(pesan[i]);
sb.append((char) plainteks);
System.out.println("pesan asli" +sb.toString());
}
}
}