• Tidak ada hasil yang ditemukan

Implementasi Digital Signature dengan Algoritma RSA dan Lehmann Prime Generator

N/A
N/A
Protected

Academic year: 2017

Membagikan "Implementasi Digital Signature dengan Algoritma RSA dan Lehmann Prime Generator"

Copied!
22
0
0

Teks penuh

(1)

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

(2)

{

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;

(3)

}

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)

(4)

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

(5)

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

(6)

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;

(7)

// 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;

(8)

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

(9)

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

(10)

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

{

(11)

}

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

}

}

(12)

}

(13)

LAMPIRAN B : TABEL ASCII DAN HEKSA DESIMAL

ASCII

Decimal

Hexadecimal

Null

0

0

start of header

1

1

start of text

2

2

end of text

3

3

end of transmission

4

4

Enquire

5

5

Acknowledge

6

6

Bell

7

7

Backspace

8

8

horizontal tab

9

9

Linefeed

10

A

vertical tab

11

B

form feed

12

C

carriage return

13

D

shift out

14

E

shift in

15

F

data link escape

16

10

device control 1/Xon

17

11

device control 2

18

12

19

13

20

14

21

15

22

16

23

17

24

18

(14)

ASCII

Decimal

Hexadecimal

26

1A

27

1B

file separator

28

1C

group separator

29

1D

record separator

30

1E

unit separator

31

1F

Space

32

20

!

33

21

"

34

22

#

35

23

$

36

24

%

37

25

&

38

26

'

39

27

(

40

28

)

41

29

*

42

2A

+

43

2B

,

44

2C

-

45

2D

.

46

2E

/

47

2F

0

48

30

1

49

31

2

50

32

3

51

33

4

52

34

5

53

35

(15)

ASCII

Decimal

Hexadecimal

7

55

37

8

56

38

9

57

39

:

58

3A

;

59

3B

<

60

3C

=

61

3D

>

62

3E

?

63

3F

@

64

40

A

65

41

B

66

42

C

67

43

D

68

44

E

69

45

F

70

46

G

71

47

H

72

48

I

73

49

J

74

4A

K

75

4B

L

76

4C

M

77

4D

N

78

4E

O

79

4F

P

80

50

Q

81

51

R

82

52

(16)

ASCII

Decimal

Hexadecimal

T

84

54

U

85

55

V

86

56

W

87

57

X

88

58

Y

89

59

Z

90

5A

[

91

5B

\

92

5C

]

93

5D

^

94

5E

_

95

5F

`

96

60

a

97

61

b

98

62

c

99

63

d

100

64

e

101

65

f

102

66

g

103

67

h

104

68

i

105

69

j

106

6A

k

107

6B

l

108

6C

m

109

6D

n

110

6E

o

111

6F

(17)

ASCII

Decimal

Hexadecimal

q

113

71

r

114

72

s

115

73

t

116

74

u

117

75

v

118

76

w

119

77

x

120

78

y

121

79

z

122

7A

{

123

7B

|

124

7C

}

125

7D

~

126

7E

127

7F

128

80

129

81

130

82

131

83

132

84

133

85

134

86

135

87

136

88

137

89

138

8A

139

8B

140

8C

(18)

ASCII

Decimal

Hexadecimal

142

8E

143

8F

144

90

145

91

146

92

147

93

148

94

149

95

150

96

151

97

152

98

153

99

154

9A

155

9B

156

9C

157

9D

158

9E

159

9F

160

A0

¡

161

A1

¢

162

A2

£

163

A3

¤

164

A4

¥

165

A5

¦

166

A6

§

167

A7

¨

168

A8

©

169

A9

(19)

ASCII

Decimal

Hexadecimal

«

171

AB

¬

172

AC

-

173

AD

®

174

AE

¯

175

AF

°

176

B0

±

177

B1

²

178

B2

³

179

B3

´

180

B4

µ

181

B5

182

B6

·

183

B7

¸

184

B8

¹

185

B9

º

186

BA

»

187

BB

¼

188

BC

½

189

BD

¾

190

BE

¿

191

BF

À

192

C0

Á

193

C1

Â

194

C2

Ã

195

C3

Ä

196

C4

Å

197

C5

Æ

198

C6

(20)

ASCII

Decimal

Hexadecimal

È

200

C8

É

201

C9

Ê

202

CA

Ë

203

CB

Ì

204

CC

Í

205

CD

Î

206

CE

Ï

207

CF

Ð

208

D0

Ñ

209

D1

Ò

210

D2

Ó

211

D3

Ô

212

D4

Õ

213

D5

Ö

214

D6

×

215

D7

Ø

216

D8

Ù

217

D9

Ú

218

DA

Û

219

DB

Ü

220

DC

Ý

221

DD

Þ

222

DE

ß

223

DF

À

224

E0

á

225

E1

â

226

E2

ã

227

E3

(21)

ASCII

Decimal

Hexadecimal

Å

229

E5

Æ

230

E6

ç

231

E7

è

232

E8

é

233

E9

ê

234

EA

ë

235

EB

Ì

236

EC

Í

237

ED

î

238

EE

ï

239

EF

ð

240

F0

ñ

241

F1

ò

242

F2

ó

243

F3

ô

244

F4

õ

245

F5

ö

246

F6

÷

247

F7

ø

248

F8

ù

249

F9

ú

250

FA

û

251

FB

ü

252

FC

ý

253

FD

þ

254

FE

(22)

Referensi

Dokumen terkait

[r]

1) Guru membuka kesempatan secara luas dan bervariasi kepada peserta didik untuk melakukan pengamatan melalui kegiatan membaca dan melihat tentang perlawanan rakyat

[r]

Laporan konsep akhir disampaikan 8 (Delapan) Minggu setelah pekerjaan dimulai, sebelum rapat pembahasan dan 5 (lima) eksemplar disampaikan sebagai hasil

[r]

[r]

Rata-rata memori yang digunakan untuk menjalankan program sorting dengan bahasa pemrograman Lua dengan metode bubble sort yaitu sebesar 213,6 KiB ,untuk metode selection sort

Application of Pyraclostrobin by concentrations of 400 ppm and 800 ppm effectively reduced yield loss by increasing night temperature of 2 o C, which resulted in 20.20% and