Implementasi Digital Signature dengan Algoritma RSA dan Lehmann Prime Generator

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() ==
panjangDigitPrima)

Universitas Sumatera Utara

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

Universitas Sumatera Utara

// 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 [] number = new String[heksa.length()];

Universitas Sumatera Utara


String cipher;
int blokPesan = heksa.length() / 2;
int awal = 0;
int akhir =2;

for(int i=0; iheksa.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) {
BigInteger hasil;

Universitas Sumatera Utara

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()