BAB 4
IMPLEMENTASI DAN PENGUJIAN APLIKASI
4.1 Implementasi
Setelah menganalisis dan merancang sistem, maka proses yang dilakukan adalah mengimplementasikannya kedalam sebuah program. Program dibuat dengan menggunakan
bahasa pemograman java, dengan menggunakan software netbeans sebagai Integrated Development Environment IDE java.
4.1.1 Tampilan Halaman Utama
Kontrol program terdapat pada halaman utama, dimana terdapat 2 menu, yaitu menu program dan help. Pada menu program terdiri dari 3 item yaitu bangkitkan kunci, enkripsipenyisipan,
dan ekstraksidekripsi. Sedangkan pada menu help terdiri dari 3 item yaitu about, cara penggunaan, dan keluar. Gambaran kontrol program dapat dilihat seperti gambar berikut ini :
Gambar 4.1 Halaman Utama
Universitas Sumatera Utara
4.1.2 Tampilan Halaman Bangkitkan kunci
Pada halaman bangkitkan kunci akan terdapat 2 fungsi yaitu bangkitkan bilangan prima dan bangkitkan kunci privat dan publik. Fungsi bangkitkan prima hanya sebagai alat bantu untuk
mencari kunci yang kita inginkan, dimana kunci tersebut harus bilangan prima. Berikut ini adalah tampilan halaman bangkitkan bilangan prima :
Gambar 4.2 Halaman Bangkitkan Kunci
Untuk membangkitkan kunci, pengguna hanya perlu menginputkan sebuah kunci, dimana kunci tersebut merupakan bilangan prima. Setelah menginputkan kunci, pengguna
kemudian mengklik button generate dan secara otomatis program akan membangkitkan kunci publik dan privat. Pengguna dapat menyimpan kunci publik dan privat dalam bentukt txt
dengan cara mengklik button save.
Pada form bangkitkan kunci akan ada fungsi untuk membangkitkan bilangan prima dengan menggunakan algoritma lehmann, berikut adalah method algoritma lehmann dalam
bahasa pemograman java :
public static int checkPrimaint prima { Random rand = new Random4;
int testNumber[] = new int [13]; testNumber[0] = 2;
testNumber[1] = 3; testNumber[2] = 5;
testNumber[3] = 7;
Universitas Sumatera Utara
testNumber[4] = 11; testNumber[5] = 13;
testNumber[6] = 17; testNumber[7] = 19;
testNumber[8] = 23; testNumber[9] = 29;
testNumber[10] = 31; testNumber[11] = 37;
testNumber[12] = 41; int bilanganRandom;
int result = 0; int randPrime;
int m; int p;
int statue = 1; for int counter = 0 ; counter 6 ; counter++ {
bilanganRandom = rand.nextInt12; randPrime = testNumber[bilanganRandom];
if randPrime == prima{ result = modulo randPrime, prima-12, prima ;
if result == 1 || result == prima-1{ statue = -1;
break; }
} }
if statue == -1{ prima = 0;
} else { prima = prima;
} return prima;
}
Pada teori lehmann, untuk menentukan sebuah bilangan p prima atau tidak, maka menggunakan fungsi
�
�−12
≡ 1 �� − 1��� �. Pada method diatas, telah diinisialisasi 13 array yang akan digunakan sebagai nilai a dimana variabel yang digunakan pada method
diatas adalah testnumber. Pengujian akan dilakukan sebanyak 6 kali, sehingga dapat dipastikan bahwa bilangan tersebut prima. sebelum diuji, maka akan dibangkitkan 6 bilangan
dari ke 13 array yang telah diinisialisasi, kemudian bilangan yang telah dibangkitkan tersebut dimasukkan ke fungsi satu persatu , jika hasilnya bukan 1 atau -1 maka proses akan
dihentikan, sedangkan jika hasilnya 1 atau -1 maka proses akan dilanjutkan sampai proses perhitungannya sebanyak 6 kali. setelah itu akan di kembaikan nilai tersebut prima , dimana
pada program diwakili dengan variabel prima. 55
Universitas Sumatera Utara
4.1.3 Tampilan Halaman Enkripsi dan Penyisipan
Halaman ini merupakan halaman yang digunakan untuk enkripsi dan penyisipan pesan ke citra. Untuk dapat melakukan enkripsi dan penyisipan, pengguna harus menginputkan pesan,
kunci dan gambar. Pesan dan kunci dapat diinputkan dengan mengetiknya langsung atau dengan mencari filenya dengan mengklik button browse. Sedangkan gambar diinputkan
dengan mengklik button browse, kemudian cari filenya.
Gambar 4.3 Halaman Enkripsi dan Penyisipan
Jika form pesan, kunci dan gambar ada yang kosong, maka aplikasi akan memberi peringatan bahwa ada form yang kosong. Setelah ketiga form diinputkan, langkah selanjutnya
yaitu mengklik button enkripsipenyisipan, kemudian sistem akan memproses dan mencetak hasilnya. Hasil enkripsi dan penyisipan dapat disimpan dengan cara mengklik button save,
kemudian simpan ke folder yang diinginkan.
Pada form enkripsi dan penyisipan akan ada fungsi untuk enkripsi dengan menggunakan algoritma elgamal, berikut adalah method algoritma elgamal untuk fungsi
enkripsi dalam bahasa pemograman java :
public static String Enkripsi String s,String t{ String textString=s;
int p =textString.length; String textString1=t;
int testNumber [] = new int[p]; BigInteger result [][]= new BigInteger [p][2];
BigInteger prima = new BigInteger0;
56
Universitas Sumatera Utara
BigInteger apa = new BigInteger0; alpha pangkat a BigInteger alpha = new BigInteger0;
BigInteger e = new BigInteger0; BigInteger y = new BigInteger0;
BigInteger z = new BigInteger1; String hasil = ;
String hasil1 = ; String hasil2 = ;
String hasil3 = ; String array[] = textString1.split\\s;
int a=0; int f=0;
int k=0; for int count = 0; count array.length; count++ {
if array[count].isEmpty { a=Integer.parseIntarray[0];
f=Integer.parseIntarray[1]; k=Integer.parseIntarray[2];
} } prima=BigInteger.valueOfa;
alpha=BigInteger.valueOff; apa=BigInteger.valueOfk;
forint i = 0; i textString.length; i++ {
Random RandomGenerate = new Random; int randomInt1 = RandomGenerate.nextIntprima.intValue-1;
BigInteger b = BigInteger.valueOfrandomInt1
testNumber[i] = inttextString.charAti; BigInteger d =BigInteger.valueOftestNumber[i] ;
result [i][0]=moduloalpha,b,prima ; BigInteger sementara= modulo apa,b,prima;
BigInteger sementara1= d.multiplysementara; result [i][1]=modulosementara1,z,prima;
hasil +=result[i][0]+ +result[i][1]+ ; }
return hasil; }
Pada method diatas maka kunci akan dibaca dari file txt, kemudian diparsing sehingga menghasilkan nilai p ,
�, �
�
. Inputan text akan diubah kebentuk desimal dengan menggunakan tabel ascii, kemudian dilakukan perhitungan dengan fungsi
�
�
��� � , dimana pada method diatas diwakili dengan variabel result [i][0]. Setelah itu maka akan dilakukan perhitungan dengan
fungsi ��
��
��� � , dimana pada method diatas diwakili dengan variabel result [i][1]. Kemudian untuk mendapatkan ciphertext-nya, maka akan digabungkan kedua variabel tersebut yaitu
result[i][0] dan result [i][1], dimana pada method diwakili dengan variabel hasil. Pada form enkripsi dan penyisipan, terdapat pula fungsi penyisipan ciphertext kedalam
gambar dengan menggunakan algoritma LSB, berikut merupakan algoritma LSB untuk fungsi penyisipan dalam bahasa pemograman java :
Universitas Sumatera Utara
private void jButton4ActionPerformedjava.awt.event.ActionEvent evt { String textString = jTextArea1.getText;
String textString1 = ; long startTime, endTime;
textString1 = jTextField1.getText; startTime = System.currentTimeMillis;
String msg=EnkripsitextString,textString1; if oriIMG==null{
JOptionPane.showMessageDialognull, Buka File Citra , Aplikasi KriptografiSteganography Citra Digital, 1;
} else { dBuf = oriIMG.getData.getDataBuffer;
raster = oriIMG.getRaster; cm = oriIMG.getColorModel;
sm = raster.getSampleModel; ispremulti = oriIMG.isAlphaPremultiplied;
pixels=DataBufferByteoriIMG.getRaster.getDataBuffer.getDat; String q=;
if .equalsjTextField1.getText { JOptionPane.showMessageDialognull, Kata sandi masih kosong , Aplikasi
Kriptografi Citra Digital, 1; } else {
String msb=; String msgbt=;
msgb=msg.getBytes; for int iter = 0 ; iter msg.length ; iter++{
msb =byteToBinarymsgb[iter]; msgbt += msb+ ;
} System.out.printlnmsb;
System.out.printlnnilai bit-bit pesan+msgbt; String e=;
String f=; int d=msgbt.length ;
System.out.printlnpanjang yang disisipkan :+d; String b=Integer.toBinaryStringd;
if b.length=21{ int c=21-b.length;
forint i=0;ic;i++{ e +=0;
} f=e+b;
} System.out.printlnnilai bit dari panjang +f;
int h=pixels.length-1; String r=;
forint i=0; if.length;i++ { r += f.charAti;
ifr.length==7{ String sementara=r;
pixels[h]=Byte.parseBytesementara, 2; q +=pixels[h]+ ;
h--; r=;
} }
System.out.printlnnilai bit +q; System.out.printlnpanjang pixel +h;
String bitsContainer; String newBitsContainer;
Universitas Sumatera Utara
int indexOfByteInContainer = 0; if pixels.length msgbt.length Byte.SIZE{
System.out.printlnProcess stop~; } else {
String t=; String s=;
String nilai=; int i;
for i=0; imsgbt.length;i++{ bitsContainer=byteToBinarypixels[i];
newBitsContainer = bitsContainer.substring0,6+ msgbt.charAti; pixels [i]=Byte.parseBytenewBitsContainer,2;
nilai +=newBitsContainer + ; }
System.out.printlnbit yang telah diubah+nilai; String Result=;
for i=0 ; i100;i++{ Result +=pixels[i];
} System.out.printlnnilai dari bit yan telah diubah+Result;
} }
System.out.printlnnilai bit yang mau disisipkan +q; DataBufferByte db = new DataBufferBytepixels, dBuf.getSize,
dBuf.getOffset; WritableRaster wraster = Raster.createWritableRastersm, db, null;
cipherIMG = new BufferedImagecm,wraster,ispremulti, null; Ikon = new ImageIconToolkit.getDefaultToolkit.createImage
cipherIMG.getSource; if ikon.getIconWidthPREFERRED_WIDTH{
ikon = new ImageIconikon.getImage.getScaledInstance PREFERRED_WIDTH, -1, Image.SCALE_DEFAULT;
if ikon.getIconHeight PREFERRED_HEIGHT{ ikon = new ImageIconikon.getImage.getScaledInstance-1,
PREFERRED_HEIGHT, Image.SCALE_DEFAULT; }
} endTime = System.currentTimeMillis;
speedElgamal = endTime - startTime; String time = String.valueOfspeedElgamal;
jTextField2.setTexttime; jLabel7.setIconikon;
JOptionPane.showMessageDialognull, Citra selesai dienkripsi, Aplikasi Kriptografi Citra Digital, 1;
} }
Pada method diatas maka ciphertext akan diubah ke binari, kemudian file gambar dibaca dan dihitung jumlah byte-nya. Apabila byte citra binari ciphertext, proses akan
dihentikan, sedangkan apabila byte citra binari ciphertext maka proses penyisipan akan dilakukan. Pada proses penyisipan, setiap 1 binari cipherterxt akan disisipi pada setiap byte
citra. Jumlah binari ciphertext akan diubah ke 3 byte array, kemudian akan menggantika 3 byte terakhir dari citra.
Universitas Sumatera Utara
4.1.4 Tampilan Halaman Ekstraksi dan Dekripsi
Halaman ini merupakan halaman yang digunakan untuk mengekstraksi ciphertext dari citra, kemudian mendekripsikannya ke pesan asli. Untuk dapat melakukan ekstraksi dan dekripsi,
pengguna harus menginputkan citra dan kunci privat. Kunci dapat diinputkan dengan mengetiknya langsung atau mencari filenya dengan mengklik buton browse. Sedangkan citra
diinputkan dengan mengklik button browse, kemudian cari filenya.
Gambar 4.4 Halaman Ekstraksi dan Dekripsi
Jika form gambar dan kunci ada yang kosong, maka program akan memberi peringatan bahwa ada form yang kosong. Setelah citra dan kunci diinputkan, pengguna
kemudian mengklik button EkstraksiDekripsi, maka sistem akan memprosesnya dan mencetak Pesan aslinya.
Universitas Sumatera Utara
Pada form ekstraksi dan dekripsi akan ada fungsi ekstrak dengan algoritma LSB, berikut merupakan algoritma LSB untuk fungsi ektrak dalam bahasa java :
private void jButton1ActionPerformedjava.awt.event.ActionEvent evt { if oriIMG==null{
JOptionPane.showMessageDialognull, Buka File Citra , Aplikasi
Kriptografi dan Steganografi, 1; } else {
dBuf = oriIMG.getData.getDataBuffer; raster = oriIMG.getRaster;
cm = oriIMG.getColorModel; sm = raster.getSampleModel;
ispremulti = oriIMG.isAlphaPremultiplied; pixels=DataBufferByteoriIMG.getRaster.getDataBufer.getData;
byte [] s ; String d=;
String data=; String hasil=;
String hasilakhir=; String ahasil [] = new String[1000000];
int lengthhasil=0; int e = 0;
int panjang; String temp=;
String jumlah=; startTime = System.currentTimeMillis;
panjang = pixels.length-1; for int i=panjang;i=panjang-2;i--{
temp=Byte.toStringpixels[i]; jumlah +=temp + ;
} System.out.printlnjumlah;
String array[] = jumlah.split\\s; String temp1=;
String temp2=; for int i = 0; i array.length;i++ {
if array[i].isEmpty { int j=Integer.parseIntarray[i];
temp1=ByteToBitj; System.out.printlntemp1;
} temp2 +=temp1;
} panjang =Integer.parseInttemp2, 2;
System.out.printlntemp2; System.out.printlnpanjang pesan yang disisipkan : +panjang;
String temp3; String bitsContainer=;
String ContainerData=; for int i=0;ipanjang;i ++{
bitsContainer=byteToBinarypixels[i]; ContainerData +=bitsContainer;
} int panjangContainer=ContainerData.length;
System.out.printlnPanajng COntainer+panjangContainer; System.out.printlnData Container :+ContainerData;
Universitas Sumatera Utara
String Data=; String DataAkhir=;
for int i=7;iContainerData.length;i +=8{ Data +=ContainerData.charAti;
if Data.length==8{ String Sementara=Data;
int j=Integer.parseIntSementara, 2; char v=char j;
ahasil [lengthhasil]=String.valueOfv; DataAkhir += ahasil [lengthhasil];
Data =; lengthhasil++;
} }
proses dekripsi String string=;
string =jTextField1.getText; String textString1 = ;
textString1 = DataAkhir; HasilDekripsi=DekripsitextString1,string;
} endTime = System.currentTimeMillis;
speedElgamal = endTime - startTime; String time = String.valueOfspeedElgamal;
jTextField2.setTexttime; jTextArea1.setTextHasilDekripsi;
}
Pada method diatas, maka program akan membaca 3 byte terakhir dari byte citra, kemudian mengkonversinya ke desimal, sehingga diketahui berapa banyak binari data yang
disisipkan. Setelah itu, program akan mengambil bit ke delapan dari masing-masing byte sebanyak jumlah binari data yang disisipkan. Kemudian program akan menggabungkan binari
data dan apabila jumlah bitnya 8 maka akan dikonversi ke karakter, kemudian masing-masing karakter akan digabung, sehingga diperoleh ciphertext yang disisipkan pada citra, kemudian
akan dilanjutkan pada proses dekripsi. 62
Universitas Sumatera Utara
Pada form ekstraksi dan dekripsi, terdapat fungsi dekripsi dengan menggunakan algoritma elgamal, berikut adalah method algoritma elgamal untuk fungsi dekripsi dalam
bahasa pemograman java :
public static String Dekripsi String pesan, String kunci{ String string = ;
string=pesan; String textString1 = ;
textString1=kunci; String x= SplitGanjilstring;
String y= SplitGenapstring; int s=string.length;
String array[] = x.split\\s; String array1[] = y.split\\s;
String array2[] = textString1.split\\s; int d=0;
int e=0; BigInteger f = new BigInteger0;
BigInteger p = new BigInteger0; variabel bilangan prima BigInteger a = new BigInteger0; variabel kunci privat
BigInteger z = new BigInteger1; String hasil=;
String hasilakhir=; String hasilakhir1=;
String hasilakhir2=; String hasilakhir3=;
BigInteger result [][]= new BigInteger [s][2]; BigInteger result1 [][]= new BigInteger [s][2];
int aa=0; int bb=0;
for int count = 0; count array2.length; count++ { if array[count].isEmpty {
aa=Integer.parseIntarray2[0]; bb=Integer.parseIntarray2[1];
} } p=BigInteger.valueOfaa;
a=BigInteger.valueOfbb; for int count = 0; count array.length; count ++ {
if array[count].isEmptyarray1[count].isEmpty { d=Integer.parseIntarray[count];
e=Integer.parseIntarray1[count]; BigInteger h=p.subtractz;
BigInteger t=h.subtracta;p-1-a BigInteger i=BigInteger.valueOfd;
hasilakhir3 += i + ; result [count][0]=moduloi,t,p;
BigInteger j= result [count][0]; BigInteger k=BigInteger.valueOfe;
BigInteger n =j.multiplyk; result [count][1]=modulon,z,p ;
BigInteger r=result [count][1]; int u= r.intValue;
char v=char u; convert integer to char hasilakhir1 += v;
hasilakhir += result [count][0] + ; hasil +=result[count][1] + ;
} } return hasilakhir1; }
Universitas Sumatera Utara
Pada method diatas yang menjadi inputan adalah pesan dan kunci, dimana pesannya merupakan ciphertext hasil ekstraksi dari citra, sedangkan kuncinya merupakan kunci privat
yang diinputkan si penerima. Pesan akan diparsing menjadi 2 bagian yaitu �
�
��� � dan ��
��
��� � , sedangkan kunci akan diparsing menjadi p dan a. Setelah diparsing, akan dilakukan proses perhitungan dengan rumus
�
� �−1−�
��� � dimana pada program diwakili dengan variabel result [count][0], setelah nilainya didapat, akan dilanjutkan dengan proses
perhitungan dengan rumus �
� −�
�� ��� � dimana pada program diwakili dengan variabel result [count][1]. Setelah nilai desimal plaintext didapat, kemudian nilai tersebut dikonversi ke
karakter menggunakan tabel ascii, hasil dari konversi tersebut merupakan plaintext-nya.
4.2 Pengujian Aplikasi