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