67 1. Bahasa Python LISTING PROGRAM 1.1. Modulegate.py import sys sys.path.append("c:\skrip") import pythona def gerbang(fungsi): if(fungsi == "bangkitkunci"): from pythona import bangkitkankunci p, q, n = bangkitkankunci() print(p, q, n) elif(fungsi == "cekkunci"): from pythona import cekkunci hasil = cekkunci(b,c) print(hasil) elif(fungsi == "enkripsi"): from pythona import programenkripsi C = programenkripsi(d, b) for i in range(len(c)): print(c[i], end = " ") elif(fungsi == "dek"): from pythona import decryptciphertext cetak = decryptciphertext(d, b, c) for i in range(len(cetak)): print(cetak[i], end = " ") elif(fungsi == "dek2"): from pythona import decryptciphertext2 cetak = decryptciphertext2(d, b, c) for i in range(len(cetak)): print(cetak[i], end = " ") elif(fungsi == "cari"): from pythona import carihitamdaripath hasil = carihitamdaripath(d, b) for i in range(len(hasil)): print(hasil[i], end = '') if(i < len(hasil)-1): print(',', end = '') elif(fungsi == "embed"): from pythona import jalankansisip stroutput = jalankansisip(d, e, b) print(stroutput) elif(fungsi == "ekstrak"): from pythona import jalankanekstrak stroutput = jalankanekstrak(d) print(stroutput) global a a = str(sys.argv[1]) global b b = int(sys.argv[2]) global c c = int(sys.argv[3]) global d d = str(sys.argv[4])
68 global e e = str(sys.argv[5]) gerbang(a) 1.2. ModulepythonA.py import random, time class Timer(object): ''' timer starts with class initialisation ''' def init (self): self.t1= time.time() self.t2= time.time() def getelapsedltime(self): # gets total elapsed from class initialsation self.delta=time.time()-self.t1 return '{0:.3f'.format(self.delta) def gettimedifference(self): # gets time elapsed from previous reading (for first reading this is equal to total time elapsed getelapsedltime() self.delta=time.time()-self.t2 self.t2 = time.time() return '{0:.3f'.format(self.delta) def differentrandom(n): x = [] for i in range(0, len(str(n))): a = random.randint(2,n-1) while a in x: a = random.randint(2,n-1) x.append(a) return x def tobin(x): return "{0:b".format(x) def ntobin(n): return tobin(n-1) def modexpsam(x, y, z): b = tobin(y) t = len(b) result = 1 for i in range(0, t): result = (result * result) % z if(b[i] == "1"): result = (result * x) % z return result
69 def moduloeks(acak, y, bil): z = 1 for j in range (1, y + 1): z = (acak * z) % bil return z def fermatprime(x): y = x - 1 # panjang digit untuk pengetesan iterasi = len(str(x)) * 2 if(iterasi < 3): iterasi = 3 for i in range (0, iterasi): acak = random.randint(1, y) if(moduloeks(acak, y, x)!= 1): return False return True def isprime(x): lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,15 7,163,167,173,179,181,191,193,197,199,211,223,227,229,233,2 39,241,251,257,263,269,271,277,281,283,293,307,311,313,317, 331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,50 3,509,521,523,541,547,557,563,569,571,577,587,593,599,601,6 07,613,617,619,631,641,643,647,653,659,661,673,677,683,691, 701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,90 7,911,919,929,937,941,947,953,967,971,977,983,991,997] if x in lowprimes: return True elif x & 1!= 0: return fermatprime(x) return False def bangkitkankunci(): syarat_tdk_terpenuhi = True while syarat_tdk_terpenuhi: p = random.randint(3,10000) if (p % 4 == 3) and isprime(p): syarat_tdk_terpenuhi = False syarat_tdk_terpenuhi = True while syarat_tdk_terpenuhi: q = random.randint(3,10000) if (q!= p) and (q % 4 == 3) and isprime(q): syarat_tdk_terpenuhi = False n = p * q return p, q, n def cekkunci(key1, key2): if (key1 % 4 == 3) and isprime(key1) and (key2 % 4 == 3) and isprime(key2) and (key1!= key2): return "T" else: return "F"
70 def enkripsi(p, n): if P < n: C = modexpsam(p,2,n) return C return False def encryptall(p, n): C = [] for i in range(0, len(p)): C.append(enkripsi(ord(P[i]),n)) if C[i] == False: break; return C def programenkripsi(plaintext, kuncipublik): measure=timer() P = str(plaintext) n = int(kuncipublik) C = encryptall(p, n) C.append(measure.getElapsedlTime()) return C def exteuclid(a,b): A, B, x, lastx, y, lasty = a, b, 1, 0, 0, 1 while (B > 0): hasilbagi = A//B sisabagi = A - hasilbagi * B A, B = B, sisabagi S = x - hasilbagi * lastx x, lastx = lastx, S T = y - hasilbagi * lasty y, lasty = lasty, T return A, x, y def CRT(mp, mq, p, q): n = p * q M1 = n // p M2 = n // q gcd, y1, y2 = exteuclid(m1,m2) return mp*m1*y1, mq*m2*y2, n def autodekripsi(c, p, q): mp = modexpsam(c, (p+1)//4, p) mq = modexpsam(c, (q+1)//4, q) x, y, n = CRT(mp,mq,p,q) P1 = (x + y) % n P2 = (x - y) % n P3 = (-x + y) % n P4 = (-x - y) % n return min(p1, P2, P3, P4) def autodekripsirabin(c, p, q): mp = modexpsam(c, (p+1)//4, p) mq = modexpsam(c, (q+1)//4, q) x, y, n = CRT(mp,mq,p,q)
71 P1 = (x + y) % n P2 = (x - y) % n P3 = (-x + y) % n P4 = (-x - y) % n return min(p1, P2, P3, P4), P1, P2, P3, P4 def convertliststringctoint(c): hasil = [] c = C.split(',') for i in c: hasil.append(int(i)) return hasil def decryptciphertext2(c, p, q): measure=timer() C = convertliststringctoint(c) P = [] for i in range(0, len(c)): minp = autodekripsi(c[i], p, q) P.append(chr(minP)) stringp = ''.join(p) et = measure.getelapsedltime() cetak = [] cetak.append(stringp) cetak.append(et) temp = tulishasildekripsi(stringp) return cetak def decryptciphertext(c, p, q): measure=timer() C = list(c) ordo = [] for i in range(len(c)): ordo.append(ord(c[i])) C = ordo P = [] for i in range(0, len(c)): minp = autodekripsi(c[i], p, q) P.append(chr(minP)) stringp = ''.join(p) et = measure.getelapsedltime() cetak = [] cetak.append(stringp) cetak.append(et) temp = tulishasildekripsi(stringp) return cetak class Convert: def toli(self, string): temp = string.split(',') temp2 = [] for e in temp: temp2.append(int(e)) return temp2 def tosi(self, L): temp = ""
72 for i in range(len(l)): temp += str(l[i]) if(i < len(l)-1): temp += ',' return temp def todec(self, P): temp = [] for i in range(len(p)): temp.append(ord(p[i])) return temp def toascii(self, string): string = self.toli(string) temp = "" for e in string: temp += chr(e) return temp #hasil = isprime(100) #print(hasil) 2. Bahasa C# 2.1. Fungsi Pembangkit Kunci pada FormPembangkitKunci.cs public void runpythonbangkitkunci(){ ProcessStartInfo p = new ProcessStartInfo(); p.filename = "c:\\python33\\python.exe"; p.redirectstandardoutput = true; p.useshellexecute = false; p.arguments = "c:\\skrip\\gate.py "+ "bangkitkunci 0 0 'x' 'x'"; // start the python program with two parameters try{ using(process exeproc = Process.Start(p)){ StreamReader s = exeproc.standardoutput; String output = s.readtoend(); '); string []r = output.split(new char[]{' textboxkuncip.text = r[0].tostring(); textboxkunciq.text = r[1].tostring(); textboxkuncin.text = r[2].tostring();
73 catch{ MessageBox.Show("Gagal melakukan pembangkit kunci.", "Kesalahan Proses Pembangkit Kunci", MessageBoxButtons.OK, MessageBoxIcon.Error); void ButtonGenerateClick(object sender, EventArgs e) { if(!string.isnullorwhitespace(textboxkuncip.text) &!string.isnullorwhitespace(textboxkunciq.text)){ if(messagebox.show("kunci yang anda tulis sebelumnya akan terhapus. Yakin untuk melanjutkan?", "Peringatan: Pembangkitan Kunci", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK){ else{ runpythonbangkitkunci(); runpythonbangkitkunci(); 2.2.Fungsi Cek Kunci pada FormPembangkitKunci.cs void ButtonCekKunciClick(object sender, EventArgs e){ if(string.isnullorwhitespace(textboxkuncip.text) string.isnullorwhitespace(textboxkunciq.text)){ MessageBox.Show("Pasangan kunci tidak boleh ada yang kosong.", "Kesalahan Kunci", MessageBoxButtons.OK, MessageBoxIcon.Error);
74 textboxkuncin.text = ""; else if(!string.isnullorwhitespace(textboxkuncip.text) &!string.isnullorwhitespace(textboxkunciq.text)){ string hasil = runpythoncekkunci(); if(string.equals(hasil, "T")){ else{ int a = int.parse(textboxkuncip.text); int b = int.parse(textboxkunciq.text); int c = a*b; textboxkuncin.text = c.tostring(); MessageBox.Show("Kunci tidak memenuhi syarat.", "Kesalahan Kunci", MessageBoxButtons.OK, MessageBoxIcon.Error); textboxkuncin.text = ""; public string runpythoncekkunci(){ string hasil; int kunci1 = int.parse(textboxkuncip.text); int kunci2 = int.parse(textboxkunciq.text); ProcessStartInfo p = new ProcessStartInfo(); p.filename = "c:\\python33\\python.exe"; p.redirectstandardoutput = true; p.useshellexecute = false; p.arguments = "c:\\skrip\\gate.py "+ "cekkunci " + kunci1 + " " + kunci2 + " 'x' 'x'"; try{ using(process exeproc = Process.Start(p)){
75 StreamReader s = exeproc.standardoutput; String output = s.readtoend(); string []r = output.split(new char[]{' '); hasil = r[0][0].tostring(); catch{ MessageBox.Show("Gagal dalam melakukan cek kunci.", "Kesalahan Cek Kunci", MessageBoxButtons.OK, MessageBoxIcon.Error); hasil = ""; return hasil; 2.3.Fungsi Enkrip Pesan void Button1EnkripsiClick(object sender, EventArgse) { if(string.isnullorwhitespace(textbox1plaintext.text) stri ng.isnullorwhitespace(textbox1keyotp.text)){ MessageBox.Show("Kunci OTP atau Pesan tidak boleh kosong.", "Kesalahan Dekripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); else{ textbox2chiphertext.text=""; //ambilplainteks string plain=textbox1plaintext.text; //ambilpanjangplainteks int panjangplain=textbox1plaintext.text.length; //ambilkunci string kunci=textbox1keyotp.text; //ambilpanjangkunci
76 int pk=kunci.length; string cipher=""; //cekpanjangkuncidgnplain kunciotp= ""; if(pk<panjangplain){ //contohkunci=abc //plain:farid //kunciotp=abc kunciotp +=kunci; string tempplain=regex.replace(plain, @"\s+", ""); int pjgtempplain=tempplain.length; for(int i = 0; i<(panjangplain-pjgtempplain);i++){ //kunciotp=abcfa tempplain+= (char)tempplain[i]; //MessageBox.Show(tempplain); //proses menyamakan kunci == plain //perulangan sesuai kurangnya kunci for(int i = 0; i<(panjangplain-pk);i++){ //kunciotp=abcfa kunciotp+= (char)tempplain[i]; else{ kunciotp = kunci; DateTime starttime = DateTime.Now; MessageBox.Show("panjang karakter : "+panjangplain.tostring()); //algoritma otp for(int i=0; i<panjangplain;i++){ cipher+=(char) (plain[i] + kunciotp[i]); 2.4. Program Enkripsi Kunci Pesan
77 void Button1EnkripkeyClick(object sender, EventArgs e) { //cek kunci if(string.isnullorwhitespace(textboxkeyrabin.text)){ MessageBox.Show("Kunci publik belum ada.", "Kesalahan Enkripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); //cek plain else if(string.isnullorempty(textbox1keyotp.text)){ MessageBox.Show("Tidak ada pesan (plaintext) yang terdeteksi.", "Kesalahan Enkripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); else{ //jika ada string ciphertext = runpythonenkripsi(); textbox1cipherkey.copy(); public string runpythonenkripsi(){ string hasil; string hasil2; //ambil kunci int n = int.parse(textboxkeyrabin.text); //ambil pesan string plaintext =kunciotp; //ambil pnjang kunci int pjgplaintext = kunciotp.length; // string pltxt1 = plaintext.replace("\"","\\\""); int temporary = 0; ProcessStartInfo p = new ProcessStartInfo(); p.filename = "c:\\python33\\python.exe"; p.redirectstandardoutput = true; p.useshellexecute = false; // make sure we can read the output from stdout p.arguments = "c:\\skrip\\gate.py "+ "enkripsi " + n + " " + temporary + " \"" + pltxt1 + "\" 'x'"; try{ using(process exeproc = Process.Start(p)){ StreamReader s = exeproc.standardoutput; String output = s.readtoend(); string r = output; // get the parameter hasil = r.tostring(); hasil2 = hasil.replace(" ",","); hasil2 = hasil2.remove(hasil2.length-1,1);
78 string elapsedtime = hasil2.split(',').last(); hasil2 = hasil2.remove((hasil2.length - elapsedtime.length), elapsedtime.length); hasil2 = hasil2.remove(hasil2.length-1,1); if(hasil2 == "False"){ MessageBox.Show("Kunci publik tidak memenuhi syarat.", "Kesalahan Melakukan Enkripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); hasil2 = ""; else{ textbox1cipherkey.text = hasil2.tostring(); //Untuk menampilkan ASCII try{ string kode = textbox1cipherkey.text.tostring(); List<string> listhasilsplit = new List<string>(kode.Split(',')); List<Int32> ci = listhasilsplit.convertall(x => Convert.ToInt32(x)); List<char> lichar = new List<char>(ci.ConvertAll(x => Convert.ToChar(x))); string chartostring = string.join("", lichar.toarray()); catch{ kode = chartostring; //End Tampil ASCII MessageBox.Show("Berhasil melakukan enkripsi (" + elapsedtime + " detik)", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information); 2.5. Program dekripsi Kunci Pesan void Button1dekripkeyotpClick(object sender, EventArgs e) { if(string.isnullorwhitespace(kp.text) string.isnullorwhitespace(kq.text)){ MessageBox.Show("Kunci private tidak boleh kosong.", "Kesalahan Dekripsi", MessageBoxButtons.OK, MessageBoxIcon.Error);
79 else if(string.isnullorempty(ctotp.text)){ MessageBox.Show("Tidak ada ciphertext terdeteksi.", "Kesalahan Dekripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); else{ try{ string ciphertext = ctotp.text.tostring(); string[] buffers = new string[ctotp.text.tostring().length]; buffers = ubahkeint(); string result = ConvertStringArrayToStringJoin(bufferS); List<string> listhasilsplit = new List<string>(ciphertext.Split(',')); List<Int32> ci = listhasilsplit.convertall(x => Convert.ToInt32(x)); List<char> lichar = new List<char>(ci.ConvertAll(x => Convert.ToChar(x))); string chartostring = string.join("", lichar.toarray()); ciphertext = chartostring; string plaintext = runpythondekripsi(ciphertext); catch{ //MessageBox.Show("Ciphertext harus berupa angka yang dipisah dengan koma.", "Kesalahan melakukan dekripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); string ciphertext = ctotp.text.tostring(); string plaintext = runpythondekripsi(ciphertext); public string ConvertStringArrayToStringJoin(string[] array){ string result = string.join(",", array); return result; string[] ubahkeint(){ string C = ctotp.text.tostring(); char[] chararr = C.ToCharArray(); int val; string[] buffers = new string[chararr.length]; for(int i = 0; i < chararr.length; i++){ val = Convert.ToInt32(charArr[i]); buffers[i] = Convert.ToString(val);
80 return buffers; public string runpythondekripsi(string strintc){ string hasil; string hasil2; int kuncip = int.parse(kp.text); int kunciq = int.parse(kq.text); ProcessStartInfo p = new ProcessStartInfo(); p.filename = "c:\\python33\\python.exe"; p.redirectstandardoutput = true; p.useshellexecute = false; // make sure we can read the output from stdout p.arguments = "c:\\skrip\\gate.py "+ "dek " + kuncip + " " + kunciq + " " + "\"" + strintc + "\" 'x'"; // start the python program with two parameters try{ using(process exeproc = Process.Start(p)){ StreamReader s = exeproc.standardoutput; String output = s.readtoend(); string r = output; // get the parameter hasil = r.tostring(); string[] parts = hasil.split(' '); parts[parts.length - 2]; string elapsedtime = hasil2 = hasil.remove((hasil.length - elapsedtime.length), elapsedtime.length); hasil2 = hasil2.remove(hasil2.length-1,1); hasil2 = hasil2.remove(hasil2.length-1,1); // menghilangkan spasi di akhir kalimat kotp.text = hasil2.tostring(); int pjgpesanasli = hasil2.length; MessageBox.Show("Berhasil melakukan dekripsi (" + elapsedtime + " detik)", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information);
81 catch{ //throw; strintc = ctotp.text.tostring(); p.filename = "c:\\python33\\python.exe"; p.redirectstandardoutput = true; p.useshellexecute = false; // make sure we can read the output from stdout p.arguments = "c:\\skrip\\gate.py "+ "dek2 " + kuncip + " " + kunciq + " " + "\"" + strintc + "\" 'x'"; // start the python program with two parameters try{ using(process exeproc = Process.Start(p)){ StreamReader s = exeproc.standardoutput; String output = s.readtoend(); string r = output; // get the parameter hasil = r.tostring(); '); parts[parts.length - 2]; string[] parts = hasil.split(' string elapsedtime = hasil2 = hasil.remove((hasil.length - elapsedtime.length), elapsedtime.length); hasil2 = hasil2.remove(hasil2.length-1,1); hasil2 = hasil2.remove(hasil2.length-1,1); // menghilangkan spasi di akhir kalimat hasil2.length; kotp.text = hasil2; int pjgpesanasli = MessageBox.Show("Berhasil melakukan dekripsi (" + elapsedtime + " detik)", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information); catch{ //throw; strintc = kotp.text.tostring();
82 p.filename = "c:\\python33\\python.exe"; p.redirectstandardoutput = true; p.useshellexecute = false; // make sure we can read the output from stdout p.arguments = "c:\\skrip\\gate.py "+ "dek2 " + kuncip + " " + kunciq + " " + "\"" + strintc + "\" 'x'"; // start the python program with two parameters try{ using(process exeproc = Process.Start(p)){ StreamReader s = exeproc.standardoutput; String output = s.readtoend(); string r = output; // get the parameter hasil = r.tostring(); hasil.split(' '); parts[parts.length - 2]; string[] parts = string elapsedtime = hasil2 = hasil.remove((hasil.length - elapsedtime.length), elapsedtime.length); hasil2 = hasil2.remove(hasil2.length-1,1); hasil2 = hasil2.remove(hasil2.length-1,1); // menghilangkan spasi di akhir kalimat hasil2.length; kotp.text = hasil2; int pjgpesanasli = MessageBox.Show("Berhasil melakukan dekripsi (" + elapsedtime + " detik)", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information); catch{ //throw;
83 MessageBox.Show("Kesalahan melakukan dekripsi.", "Kesalahan", MessageBoxButtons.OK, MessageBoxIcon.Error); hasil2 = ""; return hasil2; 2.6. Perogram dekripsi pesan void Button2dekripsiClick(object sender, EventArgs e) { if(string.isnullorwhitespace(textbox1cipher.text) string.isnullorwhitespace(textbox1cipherkey.text)){ MessageBox.Show("Kunci OTP dan Pesan Cipher tidak boleh kosong.", "Kesalahan Dekripsi", MessageBoxButtons.OK, MessageBoxIcon.Error); else{ //ambil cipher string cipher=textbox1cipher.text; //panjang cipher int panjang= textbox1cipher.text.length; //ambil kunci string kunci = kotp.text; string pesan=""; DateTime waktuawal = DateTime.Now; //algoritma otp for(int i=0; i<panjang;i++){ pesan += (char)(cipher[i]-kunci[i]); //MessageBox.Show(pesan.ToString()); MessageBox.Show("panjang : "+panjang.tostring()); MessageBox.Show("tes"); DateTime waktuakhir = DateTime.Now; /*MessageBox.Show("Time : " + elapsed.hours.tostring("00") + ":" +elapsed.minutes.tostring("00") + ":" + elapsed.seconds.tostring("00") + "." +elapsed.milliseconds.tostring("000"));*/ pesanbox.text=pesan; TimeSpan selisihwaktu = waktuakhir.subtract(waktuawal); MessageBox.Show("Time : " +selisihwaktu.hours.tostring()+" :"+selisihwaktu.minutes.tostring()+" : " + selisihwaktu.seconds.tostring()+" : " +selisihwaktu.milliseconds.tostring());
84 CURRICULUM VITAE Nama : Alfrid Iskandar Ramadhany Panggabean Alamat Sekarang : Jln. Umar Said No.1C Binjai Alamat Orang Tua : Jln. Umar Said No.1C Binjai Telp/ Hp : 087768644343 Email : Alfridiskandar@yahoo.com Riwayat Pendidikan 2010 2014 : S-1 Ilmu Komputer, Medan 2007 2010 : SMA Negeri 1, Binjai 2004 2007 : SMP Negeri 2, Binjai 1998 2004 : SD 020261, Binjai Keahlian Bahasa : Indonesia, Inggris Bahasa Pemrograman : C#.NET, Python. Database : Microsoft Access. Design : Photoshop, Corel Draw, Ilustrator Pengalaman Organisasi [2008 2009] OSIS SMA Negeri 1 Binjai [2007 2009] Paskibraka SMA Negeri 1 Binjai [2012 2013] Anggota Kemahasiswaan IMILKOM 2012-2013 [2013 2014] Kepala Bidang Kemahasiswaan IMILKOM 2013 2014
85 Pengalaman Kepanitiaan [2010] Anggota Dokumentasi Seminar Teknologi Informasi The Development Of Modern Operating System Technology [2012] Ketua Bidang Dana dan Usaha PORSENI IMILKOM 2012 [2012] Ketua Bidang Acara PMB IMILKOM 2012