• Tidak ada hasil yang ditemukan

Adapun saran-saran yang dapat dipertimbangkan untuk mengembangkan penelitian ini lebih lanjut adalah sebagai berikut:

a. Aplikasi yang dibuat dalam penelitian ini hanya dapat mengenkripsi dan mendekripsi file teks, untuk penelitian selanjutnya diharapkan dapat juga mengenkripsi file yang lain.

b. Pada penelitian selanjutnya agar dapat mengimplementasikan algoritma lain seperti Index Calculus Algorithm sebagai pengganti algoritma Silver-Pohlig-Hellman dalam memecahkan kunci privat ElGamal.

DAFTAR PUSTAKA

Andrian, Y. 2013. Analisis Penggunaan Bilangan Prima Aman dan Komposit pada Algoritma ElGamal. Makalah No : KNSI-240. Konferensi Nasional Sistem Informasi. Mataram : STMIK Bumigora.

Asmar, N. D. 2008. Perancangan Sistem Keamanan Data Menggunakan Algoritma Kriptografi ElGamal Berdasarkan Masalah Logaritma Diskret pada Grup Pergandaan Zp. Skripsi. Medan: Universitas Sumatera Utara.

Booch, G. 2000. The Unified Modelling Language User Guide. Addison Weasley Professional.

Dooley. John F. 2013. A Brief History of Cryptology and Cryptographic Algorithms. Springer: New York.

Galbraith, S. 2012. Mathematics of Public Key Cryptography. Cambridge University Press.

Henk C. A. 2011. Encyclopedia of Cryptography and Security. Springer: New York. Mollin, R. A. 2003. RSA and Public Key Cryptography. Florida: Chapman &

Hall/CRC.

Mollin, R. A. 2007. An Introduction to Cryptography. Florida: Chapman & Hall/CRC. Mollin, R. A. 2008. Fundamental Number Theory with Applications. Edisi ke-2.

Florida: Chapman & Hall/CRC.

Pressman, R. S. Ph.D. 2010. Rekayasa Perangkat Lunak – Buku Satu, Pendekatan Praktisi. Edisi 7. Yogyakakarta: ANDI.

Putra. E. 2013. Implementasi Kriptografi Kurva Eliptik Dengan Algoritma ElGamal Dan Metode Pembangkitan Bilangan Prima Rabin-Miller Untuk Pengamanan File Teks. Skripsi. Medan: Universitas Sumatera Utara.

Riesel, H. 2011. Prime Number and Computer Methods for Factorization. 2nd Edition. Springer: New York.

Ramrudin. 2013. SimulasiPencarian KunciPrivat dengan Metode Modifikasi Pollard Rho pada Algoritma Kriptografi RSA. Skripsi. Universitas Sumatera Utara. Sadikin, R. 2012. Kriptografi untuk Keamanan Jaringan. Yogyakarta: ANDI. Schneier, B. 1996. Applied Cryptography. United States: Peachpit Press. Smart, N. 2004. Cryptography An Introductions. New York: McGraw-Hill.

Wijayanti, R. Y. 2013. Analisis dan Perbandingan Penggunaan Metode Pembangkitan Bilangan Prima Fermat dan Lucas-Lehmer dalam Kriptografi ElGamal. Skripsi. Medan: Universitas Sumatera Utara.

LISTING PROGRAM

1. lib/elgamal.py import random import base64

from .myprime import MyPrime from .dlpModule import DLP class ElGamal:

delimeter = 100

def bangkitkanKunci(self, panjang): my = MyPrime() a = 0 b = 0 p = 0 d = 0

#1. tentukan bilangan prima p dengan batas min dan max p = my.primeGenerateLen(panjang)

print('prime: ', p)

#2. Temukan primitive root a = self.findPrimitiveRoot(p)

#3. ambil d dengan syarat 1 <= d <= p - 2 d = random.randint(2, p-2)

#4. Hitung b = a pangkat d mod p. b = my.modExp(a, d, p)

key = ElGamalKey(a, b, p, d) return key

def enkripsi(self, message, pubKeyA, pubKeyB, pubKeyP): delimeter = chr(self.delimeter) my = MyPrime() #z dipilih acak # z = random.randint(2, pubKeyP-1) z = 143 C1 = my.modExp(pubKeyA, z, pubKeyP) C2 = ''

#ubah ke kode ascii for item in message: print(item)

message = message.encode('ascii') for item in message:

print(item) for c in message:

print('plainchar: ', c) # enkripsi

cipchar = my.modExp(c * my.modExp(pubKeyB, z, pubKeyP), 1, pubKeyP) print('cipchar: ', cipchar) #print('cipchar: ', cipchar) # jadikan list C2 = C2 + str(cipchar) + delimeter cipherText = ElGamalCipherText(C2, C1) return cipherText

def dekripsi(self, C1, C2, pubKeyP, privKeyD): delimeter = chr(self.delimeter)

my = MyPrime() plainText = ''

myCiphList = C2.split(delimeter) for cipChar in myCiphList:

if(cipChar == ''): continue

myint = int(cipChar)

#print('cipchar code: ', myint)

plainchar = my.modExp(myint * my.modExp(C1, (pubKeyP - 1 - privKeyD), pubKeyP), 1, pubKeyP)

#print('plainchar code: ', plainchar) plainchar = chr(plainchar)

plainText = plainText + plainchar return plainText

def findPrimitiveRoot(self, prime): myp = MyPrime()

dlp = DLP() s = prime - 1

distinctPrimes = dlp.findDistinctPrimes(s)

# Hasil distinct primes dimasukkan ke dalam Array p = getattr(distinctPrimes, "pj")

power = getattr(distinctPrimes, "aj")

print('berikut ini adalah faktor bilangan prima berbeda dari p-1') for item in p: print(item, '^', power[item]) testlist = [] for item in p: testlist.append(s // item) print('elemen di dalam testlist: ') for item in testlist:

print(item) pr = 2 passed = False while(not passed): passed = True

for item in testlist:

temp = myp.modExp(pr, item, prime) if(temp == 1): pr = pr + 1 passed = False break return pr class ElGamalKey: pubKeyA = 0 pubKeyB = 0 pubKeyP = 0 privKeyD = 0 def __init__(self, a, b, p, d):

self.pubKeyA = a self.pubKeyB = b self.pubKeyP = p self.privKeyD = d class ElGamalConverter:

def stringToPubKey(self, mystring): keyList = mystring.split(';') keyDict = {}

for key in keyList: if key[0] == 'p': keyDict['p'] = key[1:] if key[0] == 'a': keyDict['a'] = key[1:] if key[0] == 'b': keyDict['b'] = key[1:] return keyDict

def stringToPrivKey(self, mystring): keyList = mystring.split(';') keyDict = {}

for key in keyList: if key[0] == 'p':

keyDict['p'] = key[1:] if key[0] == 'd':

keyDict['d'] = key[1:] return keyDict

def stringToMessage(self, mystring): messageList = mystring.split(chr(95)) return messageList class ElGamalCipherText: cipherText1 = '' cipherText2 = 0 def __init__(self, c1, c2): self.cipherText1 = c1 self.cipherText2 = c2 2. lib/myprime.py import random class MyPrime:

# men-generate bilangan prima antara batasmin dan batasmax def primeGenerate(self, batasMin, batasMax):

x = random.randint(batasMin, batasMax) #Belum selesai

while(not self.rabinMillerPrimeTest(x)): x = random.randint(batasMin, batasMax) return x

# men-generate bilangan prima dengan panjang tertentu def primeGenerateLen(self, length):

x = self.getRandomByLen(length) #Belum selesai

while(not self.rabinMillerPrimeTest(x)): x = self.getRandomByLen(length)

# print('x: ', x) return x

# pengetesan bilangan prima menggunakan # algoritma miller rabin

def rabinMillerPrimeTest(self, n): nmin1 = n-1 s = self.getSForEksponen(nmin1) d = nmin1 / (2 ** s) d = int(d) certainty = int(len(str(n))) for i in range (0, certainty): nmin2 = n - 2 if(nmin2 < 2): nmin2 = 2 a = random.randint(2, nmin2) x = self.modExp(a, d, n) if((x == 1) or (x == n-1)): continue for j in range (0, s - 1): x = (x ** 2) % n if(x == 1): return False if(x == n-1): continue return False return True

# mencari gcd dua buah bilangan # menggunakan euclidean algorithm def gcdEuclidean(self, a, b): x = 0 while(b != 0): x = a % b a = b b = x return a

# Mencari inversi modulo # m adalah pemodulo def inversMod(self, x, m): i = 1 while(((x * i) % m) != 1): i = i + 1 return i

# Fast Modular Exponentiation -vyn

# dihitung dengan cara memecah pangkat menjadi basis 2 # kemudian menjumlahkan hasil perkaliannya.

def modExp(self, x, e, p): binb = bin(e)[2:] bin1 = []

index = 0

# dapatkan index yang bernilai 1 dari binary for item in binb:

if (int(item) == 1):

temp = len(binb) - 1 - index bin1.append(temp)

index = index + 1

# mendapatkan list a^x mod p dengan x mulai dari 1 sampai panjang binary

modpowbin = []

modpowbin.append(x % p)

for i in range(1, len(binb) + 1):

temp = (modpowbin[i - 1] * modpowbin[i - 1]) % p modpowbin.append(temp)

# Menghitung hasil akhir. result = 1

for item in bin1:

result = result * modpowbin[item] result = result % p

return result

#langkah pertama dalam algoritma miller rabin #adalah mencari nilai d * 2^s untuk n-1

#method ini untuk mencari nilai s. def getSForEksponen(self, xmin1): x = 0

while(((xmin1 % 2) == 0) and (xmin1 > 0)): xmin1 = xmin1 / 2

x = x + 1 return x

# Men-generate bilangan random dengan panjang digit # yang ditetapkan

# Parameter: length = panjang digit def getRandomByLen(self, length): length = int(length)

x = ''

for i in range(0, length):

randnum = random.randint(0, 9) if(i == 0):

# bilangan paling kiri tidak boleh 0 while(randnum == 0):

randnum = random.randint(0,9) if(i == (length - 1)):

# bilangan random yang diminta tidak boleh ganjil while ((randnum%2) == 0):

randnum = random.randint(1,9) x = x + str(randnum)

return int(x) 3. lib/dlpModule.py

from .myprime import MyPrime class DLP:

# dengan algoritma Silver-Pohlig-Hellman def shpDiscreteLog(self, base, B, prime): myPrime = MyPrime()

primeMin1 = prime - 1

#print('start to find distinct primes') # temukan faktor distinct primes

# Hasil distinct primes dimasukkan ke dalam Array pj = getattr(distinctPrimes, "pj") aj = getattr(distinctPrimes, "aj") ''' for item in pj: print(item, ' : ', aj[item]) print('distinct primes found') '''

# parameter index untuk iterasi j = 0

# hitung nilai e untuk setiap pj ej = []

# indeks j sebagai acuan index = 0

j = 1

for item in pj:

#input('Menghitung nilai e, press enter..')

ejtemp = self.finde(base, item, aj[item], B, prime, j) ej.append(ejtemp)

#print('++++++++++++++++++++++++')

#print('e', j, ' ditemukan: ', ej[index]) #print('++++++++++++++++++++++++')

j = j + 1

index = index + 1 # deret e telah didapat

#print('pencarian e selesai')

# deret pemodulo dari e yang akan digunakan dalam perhitungan CRT

# pada akhir perhitungan SHP ejm = []

for i in range(0, len(pj)): ejmtemp = pj[i] ** aj[pj[i]] ejm.append(ejmtemp)

# list untuk mencari lcm ejmcrt = []

for item in ejm:

ejmcrt.append(item) e = self.chineseRT(ej, ejm)

e = e % self.lcm(ejmcrt)

reval = HasilSHP(ej, ejm, e)

return reval

def finde(self, base, pj, aj, B, prime, j):

# deret b akan digunakan dalam perhitungan mencari deret nilai e b = [] B0 = B # ini adalah b0 b0 = self.findbzero(base, B0, pj, prime) b.append(b0)

# Lakukan iterasi untuk setiap item mulai dari b[1] dst. for i in range(1, aj):

bi = self.findb(base, B, pj, aj, prime, b, i, j) b.append(bi)

# deret b telah didapat

# Cari nilai e dengan men-sum kan deret b e = 0

for i in range(0, aj):

e = e + (b[i]) * (pj ** i) e = e % (pj ** aj)

return e

def findbzero(self, base, B0, pj, prime): myPrime = MyPrime()

k = 0

pangkatBase = (prime - 1) * k // pj pangkatB0 = (prime - 1) // pj

# Pengecekan apakah pembagian pangkat berupa # bilangan bulat, jika tidak, maka cari bilangan # bulat yang setara

tempBase = (prime - 1) * k % pj tempB0 = (prime - 1) % pj

# jaga2 saja, jika tidak habis dibagi if(tempBase != 0):

# jika hasil pembagian tidak 0 maka harus menemukan bilangan x yang

# kongruen terhadap ((prime - 1) * k) % item pangkatBase = 1

m = (prime - 1) * k % prime n = pj % prime

# selama masih belum kongruen, temukan x yang memenuhi while(m != n):

pangkatBase = pangkatBase + 1 n = (item * pangkata) % prime if(tempB0 != 0):

# jika hasil pembagian tidak 0 maka harus menemukan bilangan x yang

# kongruen terhadap ((prime - 1) * k) % item pangkatB0 = 1

m = (prime - 1) * k % prime n = pj % prime

# selama masih belum kongruen, temukan x yang memenuhi while(m != n):

pangkatB0 = pangkatB0 + 1

n = (pj * pangkatB0) % prime

# pada tahap ini, pangkat alpha dan B0 yang sesuai telah ditemukan

# selanjutnya lakukan iterasi sampai didapati k yang tepat m = myPrime.modExp(base, pangkatBase, prime)

# Jika masih belum sama, maka ganti pangkat dengan # menaikkan nilai k

while(m != n): k = k + 1

# pastikan terlebih dahulu bahwa pangkat masing-masing # sisi (alpha dan BO) berupa bilangan bulat

pangkatBase = (prime - 1) * k // pj tem = ((prime - 1) * k) % pj

if (tem != 0):

# jika hasil pembagian tidak 0

# maka harus menemukan bilangan x yang

# kongruen terhadap ((prime - 1) * k) % item x = 1

p = (prime-1) * k % prime q = (pj * x) % prime

#selama masih belum kongruen, temukan x yang memenuhi

while(p != q): x = x + 1

q = (pj * x) % prime

# setelah ditemukan x yang tepat, maka pangkatBase adalah x

pangkatBase = x

m = myPrime.modExp(base, pangkatBase, prime) #k adalah b0

return k

''' Parameter: deret b, pj, dan indeks i ''' def findb(self, base, B, pj, aj, prime, b, i, j): myPrime = MyPrime()

'''Temukan B[i]'''

# Tentukan pangkat dari alpha sigma = 0

for k in range(0, i):

sigma = sigma + (b[k]) * (pj ** k) # untuk mencari invers, pangkat harus 1 tempBase = base

if(sigma != 1):

tempBase = base ** sigma sigma = -1

invTempBase = myPrime.inversMod(tempBase, prime) Bi = (B * invTempBase) % prime

'''Bi didapat''' k = 0

'''Cari nilai k yang berarti bi''' pangkatBase = (prime - 1) * k // pj

pangkatBi = (prime - 1) // (pj ** (i + 1))

# DISINI HARUSNYA DIBERI KONDISI JIKA PEMBAGIAN PANGKAT # TIDAK HABIS

tempBase = (prime - 1) * k % pj

tempBi = (prime - 1) % (pj ** (i + 1)) if(tempBase != 0):

if(tempBi != 0):

input('PANGKAT Bi TIDAK HABIS DIBAGI')

m = myPrime.modExp(base, pangkatBase, prime) n = myPrime.modExp(Bi, pangkatBi, prime) while(m != n):

k = k + 1

pangkatBase = ((prime - 1) * k) // pj tempBase = ((prime - 1) * k) % pj if(tempBase != 0):

input('PANGKAT BASE TIDAK HABIS DIBAGI') if (tempBase != 0): x = 1 p = ((prime-1) * k) % prime q = (item * x) % prime while(p != q): x = x + 1 q = (item * x) % prime pangkatBase = x m = myPrime.modExp(base, pangkatBase, prime) '''bi pangkat j didapat'''

return k

# mencari faktorisasi distinct primes def findDistinctPrimes(self, primeMin1): # pj dan aj akan diisi pada atribut reval pj = [] # list aj = {} # dictionary # metode trivial pembagi = 2 eksponen = 0

# coba pembagian 2, selanjutnya dimulai dari 3 # dengan increment 2

if(((primeMin1 % pembagi) == 0) and (pembagi < (primeMin1 / 2))):

pj.append(pembagi)

while((primeMin1 % pembagi) == 0): primeMin1 = primeMin1 // pembagi eksponen = eksponen + 1

aj[pembagi] = eksponen

# mulai dari sini pembagi dimulai dari 3 pembagi = pembagi + 1

lastpembagi = pembagi # reset eksponen eksponen = 0

# selama pembagi masih < primeMin1 / 2 while(pembagi < (primeMin1 / 2)): while((primeMin1 % pembagi) == 0): primeMin1 = primeMin1 // pembagi lastpembagi = pembagi eksponen = eksponen + 1 if(eksponen > 0): pj.append(pembagi) aj[pembagi] = eksponen #restart eksponen

eksponen = 0

# setelah tidak bisa dibagi lagi,

# pembagi dinaikkan valuenya dengan range 2 pembagi = pembagi + 2 if(primeMin1 > 1): pj.append(primeMin1) aj[primeMin1] = 1 reval = DistinctPrimes() # Set attribute setattr(reval, 'pj', pj) setattr(reval, 'aj', aj) return reval

def chineseRT(self, listA, listMod): myPrime = MyPrime()

M = 1

# hitung LCM dari setiap pemodulo # BELOM DISINI

# hitung nilai M for item in listMod: M = M * item listM = []

# hitung nilai M/m untuk setiap nilai m for item in listMod:

temp = M // item listM.append(temp) # hitung inversi modulo listInvM = []

for i in range(0, len(listM)):

temp = myPrime.inversMod(listM[i], listMod[i]) listInvM.append(temp)

# hitung x x = 0

for i in range(0, len(listA)):

temp = listA[i] * listM[i] * listInvM[i] x = x + temp

return x

def lcm(self, listNumber): a = 1

b = 1

for item in listNumber: b = a * item

a = b // self.gcdEuclidean(a, item) return a

# mencari gcd dua buah bilangan # menggunakan euclidean algorithm def gcdEuclidean(self, a, b): x = 0

while(b != 0): x = a % b a = b b = x return a

def findKongruen(item, k, prime):

# jika hasil pembagian tidak 0 maka harus menemukan bilangan x yang

# kongruen terhadap ((prime - 1) * k) % item pangkatBase = 1

m = (prime - 1) * k % prime n = (item * pangkatBase) % prime

# selama masih belum kongruen, temukan x yang memenuhi while(m != n):

pangkatBase = pangkatBase + 1 n = (item * pangkatBase) % prime

# setelah ditemukan x yang tepat, maka pangkatBase adalah x return pangkatBase

class DistinctPrimes: pj = [] #basis

aj = {} #eksponen (pangkat), dengan tipe dictionary def showInfo(self):

for item in self.pj:

print(item, "^", self.aj[item]) def hitungProduct(self):

hasil = 1

for item in self.pj:

hasil = hasil * (item * self.aj[item]) return hasil

class HasilSHP: ej = {} ejM = {} d = 0

def __init__(self, initej, initejM, initd): self.ej = initej self.ejM = initejM self.d = initd def showInfo(self): print("Hasil SHP") print("d:", self.d) 4. lib/splashscreen.py import tkinter as tk class SplashScreen(tk.Toplevel):

def __init__(self, master, image=None, timeout=1000): """

create a splash screen from a specified image file

keep splash screen up for timeout milliseconds """

tk.Toplevel.__init__(self, master, relief='raised', borderwidth=5)

self.main = master

# don't show main window self.main.withdraw() self.overrideredirect(1)

# use Tkinter's PhotoImage for .gif files

self.image = tk.PhotoImage(file=image)

self.after_idle(self.centerOnScreen) self.update()

self.after(timeout, self.destroySplash) def centerOnScreen(self):

self.update_idletasks()

self.width, self.height = self.image.width(), self.image.height()

xmax = self.winfo_screenwidth() ymax = self.winfo_screenheight() x0 = self.x0 = xmax/2 - self.width/2 y0 = self.y0 = ymax/2 - self.height/2

self.geometry("%dx%d+%d+%d" % (self.width, self.height, x0, y0))

self.createSplash() def createSplash(self): # show the splash image

self.canvas = tk.Canvas(self, height=self.height, width=self.width)

self.canvas.create_image(0,0, anchor='nw', image=self.image)

self.canvas.pack() def destroySplash(self):

# bring back main window and destroy splash screen self.main.update()

self.main.deiconify() self.withdraw()

5. elgamalshp.py

from tkinter import *

from tkinter import filedialog

import Pmw import time import os

from lib.elgamal import * from lib.dlpModule import * from lib.splashscreen import * class ElGamalSHP(Frame):

def __init__(self, parent):

Frame.__init__(self, parent) self.parent = parent self.inisialisasi()

self.parent.title("Elgamal Cryptosistem") # Inisialisasi Python Mega Widget

Pmw.initialise()

# Buat objek notebook, dengan root sebagai rootnya notebook = Pmw.NoteBook()

self.bookgenkey(notebook) self.bookenkripsi(notebook) self.bookdekripsi(notebook) self.bookHack(notebook)

# Pengaturan posisi dengan method pack.

notebook.pack(fill = 'both', expand = 1, padx = 10, pady = 10)

# Objek elgamal

self.elGamal = ElGamal() #========================

# Method untuk mengenerate tab 'generate key' # Parameter berupa objek notebook.

def bookgenkey(self, notebook):

# Menambahkan sebuah tab

pageGenkey = notebook.add('Bangkitkan Kunci') # BEGIN GROUP

++++++++++++++++++++++++++++++++++++++++++++++++

# Membuat grup yang berisi content halaman, parent nya berupa tab pageGenKey

group1 = Pmw.Group(pageGenkey, tag_pyclass=None) # Frame 1 - baris 1.

frame = Frame(group1.interior()) # Membuat label di dalam frame

Label(frame, text='Panjang kunci: ').pack(padx=5, pady=5, side=LEFT)

# List panjangkey

listpanjangkey = (4,5,6,7,8,9,10,11,12,13,14,15,16) # Membat combobox dari Pmw

self.cbpjkey = Pmw.ComboBox(frame, dropdown=1,

scrolledlist_items=listpanjangkey) self.cbpjkey.pack(fill='both', padx=5, pady=5, side=LEFT) self.cbpjkey.selectitem(0)

# Membuat objek button, dari tkinter, rootnya adalah frame btngenerate = Button(frame, text="Bangkitkan!", command = self.generateKunci)

btngenerate.pack(side=LEFT, padx=5, pady=5)

# Menampilkan frame dan mengatur properti tampilan frame.pack(fill=BOTH)

# Frame baru untuk label lama pembangkitan kunci frame = Frame(group1.interior())

# Membuat label, dengan frame sebagai root self.labelInfoVar = StringVar()

self.labelInfo = Label(frame, textvariable=self.labelInfoVar)

self.labelInfo.pack(padx=5, pady=5)

self.labelInfoVar.set('Lama waktu pembangkitan kunci: ') # Tampilkan frame lama waktu

frame.pack(side=LEFT) # END GROUP

++++++++++++++++++++++++++++++++++++++++++++++++

group1.pack(fill=BOTH, padx = 5, pady = 5, ipadx = 5, ipady = 5)

# BEGIN GROUP

++++++++++++++++++++++++++++++++++++++++++++++++

# Membuat grup yang berisi content Kunci publik, parent nya page pageGenkey

group2 = Pmw.Group(pageGenkey, tag_text='Kunci Publik') # BEGIN FRAME =========================================== # Membuat frame penampung frame lain

frameluar = Frame(group2.interior()) # Membuat frame untuk baris p

frame = Frame(frameluar)

Label(frame, text='p ').pack(side=LEFT, padx=5, pady=5) self.entryGenKeypVar = StringVar()

self.entryGenKeyp = Entry(frame, textvariable = self.entryGenKeypVar)

self.entryGenKeyp.pack(side=LEFT, expand=1, fill=X, padx=10)

frame.pack(fill=X, expand=1) # Membuat frame untuk baris a frame = Frame(frameluar)

Label(frame, text='a ').pack(side=LEFT, padx=5, pady=5) self.entryGenKeyaVar = StringVar()

self.entryGenKeya = Entry(frame, textvariable = self.entryGenKeyaVar)

self.entryGenKeya.pack(side=LEFT, expand=1, fill=X, padx=10)

frame.pack(fill=X, expand=1) # Membuat frame untuk baris b frame = Frame(frameluar)

Label(frame, text='b ').pack(side=LEFT, padx=5, pady=5) self.entryGenKeybVar = StringVar()

self.entryGenKeyb = Entry(frame, textvariable = self.entryGenKeybVar)

self.entryGenKeyb.pack(side=LEFT, expand=1, fill=X, padx=10)

frame.pack(fill=X, expand=1)

# Membuat frame untuk tombol export frame = Frame(frameluar)

btnexportpubk = Button(frame, text="Eksport", command=self.exportKunciPublik)

btnexportpubk.pack(side=LEFT, padx=5, pady=5) frame.pack()

frameluar.pack(fill=X) # END GROUP

++++++++++++++++++++++++++++++++++++++++++++++++

group2.pack(side = LEFT, expand=1, fill=BOTH, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

# BEGIN GROUP

++++++++++++++++++++++++++++++++++++++++++++++++

# Membuat grup yang berisi content Kunci privat, parent nya page pageGenkey

group3 = Pmw.Group(pageGenkey, tag_text='Kunci Privat') frameluar = Frame(group3.interior())

# BEGIN FRAME =========================================== frame = Frame(frameluar)

Label(frame, text='p ').pack(padx=5, pady=5, side=LEFT) self.entryGenKeyPrivp = Entry(frame, width=25,

textvariable = self.entryGenKeypVar)

self.entryGenKeyPrivp.pack(side=LEFT, expand=1, fill=X, padx=10)

frame.pack(fill=X, expand=1) frame = Frame(frameluar)

Label(frame, text='d ').pack(padx=5, pady=5, side=LEFT) self.entryGenKeyPrivdVar = StringVar()

self.entryGenKeyPrivd = Entry(frame, width=25, textvariable = self.entryGenKeyPrivdVar)

self.entryGenKeyPrivd.pack(side=LEFT, expand=1, fill=X, padx=10)

frame.pack(fill=X, expand=1) frame = Frame(frameluar)

btnexportprivk = Button(frame, text="Eksport", command=self.exportKunciPrivat)

btnexportprivk.pack(side=LEFT, padx=5, pady=5) frame.pack()

# END FRAME =========================================== frameluar.pack(fill=X)

# END GROUP

++++++++++++++++++++++++++++++++++++++++++++++++

group3.pack(side=LEFT, expand=1, fill=BOTH, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

notebook.setnaturalsize() def bookenkripsi(self, notebook):

pageEnkripsi = notebook.add('Enkripsi')

# Membuat grup yang berisi content page, parent nya page pageGenkey

groupKey = Pmw.Group(pageEnkripsi, tag_text='Kunci Publik') frame = Frame(groupKey.interior())

btnexportpubk = Button(frame, text="Import", command = self.importKunciPublik)

btnexportpubk.pack(side=LEFT, padx=5, pady=5) frame.pack(side=LEFT, padx=5, pady=5)

frame = Frame(groupKey.interior())

Label(frame, text='p ').pack(padx=5, pady=5, side=LEFT) self.entryEncryptpVar = StringVar()

self.entryEncryptp = Entry(frame, width=25, textvariable = self.entryEncryptpVar)

self.entryEncryptp.pack(side=LEFT) frame.pack(side=LEFT, padx=5, pady=5) frame = Frame(groupKey.interior())

Label(frame, text='a ').pack(padx=5, pady=5, side=LEFT) self.entryEncryptaVar = StringVar()

self.entryEncrypta = Entry(frame, width=25, textvariable = self.entryEncryptaVar)

self.entryEncrypta.pack(side=LEFT) frame.pack(side=LEFT, padx=5, pady=5) frame = Frame(groupKey.interior())

Label(frame, text='b ').pack(padx=5, pady=5, side=LEFT) self.entryEncryptbVar = StringVar()

self.entryEncryptb = Entry(frame, width=25, textvariable = self.entryEncryptbVar)

self.entryEncryptb.pack(side=LEFT) frame.pack(side=LEFT, padx=5, pady=5)

groupKey.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

# Membuat grup yang berisi content page, parent nya page pageEnkripsi

groupPT = Pmw.Group(pageEnkripsi, tag_text='Plaintext') frame = Frame(groupPT.interior())

btnexportpubk = Button(frame, text="Import", command = self.importPlainText)

btnexportpubk.pack(side=LEFT, padx=5, pady=5) frame.pack(fill=BOTH, padx=5, pady=5)

frame = Frame(groupPT.interior())

self.encryptPlainText = Text(frame, height=4) scrollTp = Scrollbar(frame,

command=self.encryptPlainText.yview)

self.encryptPlainText.configure(yscrollcommand=scrollTp.set)

self.encryptPlainText.pack(side=LEFT, fill=BOTH, expand=1) scrollTp.pack(side=LEFT, fill=Y)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5) frame = Frame(groupPT.interior())

btnenkripsi = Button(frame, text="Enkripsi", command = self.enkripsi)

btnenkripsi.pack(padx=5, pady=5)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5)

groupPT.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

groupCT = Pmw.Group(pageEnkripsi, tag_text='Cipher Text') # ============ frame = Frame(groupCT.interior()) frame1 = Frame(frame)

self.encryptCipherText1 = Text(frame1, height=4) scrollC1 = Scrollbar(frame1, command=self.encryptCipherText1.yview) self.encryptCipherText1.configure(yscrollcommand=scrollC1.set) self.encryptCipherText1.pack(fill=BOTH, side=LEFT, expand=1) scrollC1.pack(side=LEFT, fill=Y)

frame1.pack(fill=X, expand=1, padx = 5, pady = 5)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5) frame = Frame(groupCT.interior())

btnexportciph = Button(frame, text="Eksport", command = self.eksportCipherText)

btnexportciph.pack(padx=5, pady=5)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5)

# ---

groupCT.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

notebook.setnaturalsize() def bookdekripsi(self, notebook):

pageDekripsi = notebook.add('Dekripsi')

# Membuat grup yang berisi content page, parent nya page pageGenkey

group1 = Pmw.Group(pageDekripsi, tag_text='Kunci Privat') frame = Frame(group1.interior())

btnexportpubk = Button(frame, text="Import", command = self.importKunciPrivat)

btnexportpubk.pack(side=LEFT, padx=5, pady=5) frame.pack(side=LEFT, padx=5, pady=5)

frame = Frame(group1.interior())

Label(frame, text='p ').pack(padx=5, pady=5, side=LEFT) self.entryDecryptpVar = StringVar()

self.entryDecryptp = Entry(frame, width=25, textvariable =self.entryDecryptpVar)

self.entryDecryptp.pack(side=LEFT) frame.pack(side=LEFT, padx=5, pady=5) frame = Frame(group1.interior())

Label(frame, text='d ').pack(padx=5, pady=5, side=LEFT) self.entryDecryptdVar = StringVar()

self.entryDecryptd = Entry(frame, width=25, textvariable = self.entryDecryptdVar)

self.entryDecryptd.pack(side=LEFT) frame.pack(side=LEFT, padx=5, pady=5)

group1.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

# Membuat grup yang berisi content page, parent nya page pageEnkripsi

group2 = Pmw.Group(pageDekripsi, tag_text='Ciphertext') framebtn = Frame(group2.interior())

btnexportC1 = Button(framebtn, text="Import", command = self.importCipherText)

btnexportC1.pack(side=LEFT, padx=10, pady=5) framebtn.pack(fill=X) # ============ frame = Frame(group2.interior()) frame1 = Frame(frame)

self.decryptCipherText1 = Text(frame1, height=4) scrollC1 = Scrollbar(frame1, command=self.decryptCipherText1.yview) self.decryptCipherText1.configure(yscrollcommand=scrollC1.set) self.decryptCipherText1.pack(fill=BOTH, side=LEFT, expand=1) scrollC1.pack(side=LEFT, fill=Y)

frame1.pack(fill=X, expand=1, padx = 5, pady = 5)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5) # ============

frame = Frame(group2.interior())

btnexportpubk = Button(frame, text="Dekripsi", command = self.dekripsi)

btnexportpubk.pack(padx=5, pady=5)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5)

group2.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

# ===========

groupPT = Pmw.Group(pageDekripsi, tag_text='Plaintext')

frame = Frame(groupPT.interior())

self.decryptPlainText = Text(frame, height=4) scrollTp = Scrollbar(frame,

command=self.decryptPlainText.yview)

self.decryptPlainText.configure(yscrollcommand=scrollTp.set)

self.decryptPlainText.pack(side=LEFT, fill=BOTH, expand=1) scrollTp.pack(side=LEFT, fill=Y)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5) frame = Frame(groupPT.interior())

btnexportPT = Button(frame, text="Eksport", command = self.eksportPlainText)

frame.pack(fill=BOTH, expand=1, padx=5, pady=5)

groupPT.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

notebook.setnaturalsize() def bookHack(self, notebook):

pageHack = notebook.add('Hack')

# Membuat grup yang berisi content page, parent nya page pageGenkey

groupPubKey = Pmw.Group(pageHack, tag_text='Kunci Publik') frame = Frame(groupPubKey.interior())

btnImportPubKey = Button(frame, text="Import", command = self.importKunciPublikHack)

btnImportPubKey.pack(side=LEFT, padx=5, pady=5) frame.pack(side=LEFT, padx=5, pady=5)

frame = Frame(groupPubKey.interior())

Label(frame, text='p ').pack(padx=5, pady=5, side=LEFT) self.entryHackpVar = StringVar()

self.entryHackp = Entry(frame, width=25,

textvariable = self.entryHackpVar) self.entryHackp.pack(side=LEFT)

frame.pack(side=LEFT, padx=5, pady=5) frame = Frame(groupPubKey.interior())

Label(frame, text='a ').pack(padx=5, pady=5, side=LEFT) self.entryHackaVar = StringVar()

self.entryHacka = Entry(frame, width=25,

textvariable = self.entryHackaVar) self.entryHacka.pack(side=LEFT)

frame.pack(side=LEFT, padx=5, pady=5) frame = Frame(groupPubKey.interior())

Label(frame, text='b ').pack(padx=5, pady=5, side=LEFT) self.entryHackbVar = StringVar()

self.entryHackb = Entry(frame, width=25,

textvariable = self.entryHackbVar) self.entryHackb.pack(side=LEFT)

frame.pack(side=LEFT, padx=5, pady=5)

groupPubKey.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

groupHackButton = Pmw.Group(pageHack, tag_pyclass=None) frame = Frame(groupHackButton.interior())

btnHack = Button(frame, text="Hack!",

command = self.hack) btnHack.pack(side=LEFT, padx=5, pady=5) frame.pack(side=LEFT, padx=5, pady=5)

groupHackButton.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

# Membuat grup yang berisi content page, parent nya page pageGenkey

frame = Frame(groupPrivKey.interior())

btnexportpubk = Button(frame, text="Eksport", command =

self.eksportHackedKunciPrivat)

btnexportpubk.pack(side=LEFT, padx=5, pady=5) frame.pack(side=LEFT, padx=5, pady=5)

frame = Frame(groupPrivKey.interior())

Label(frame, text='p ').pack(padx=5, pady=5, side=LEFT) self.entryHackPrivp = Entry(frame, width=25,

textvariable = self.entryHackpVar)

self.entryHackPrivp .pack(side=LEFT) frame.pack(side=LEFT, padx=5, pady=5) frame = Frame(groupPrivKey.interior())

Label(frame, text='d ').pack(padx=5, pady=5, side=LEFT) self.entryHackdVar = StringVar()

self.entryHackd = Entry(frame, width=25,

textvariable = self.entryHackdVar) self.entryHackd.pack(side=LEFT)

frame.pack(side=LEFT, padx=5, pady=5)

groupPrivKey.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup.

# Membuat grup yang berisi content page, parent nya page pageGenkey

groupTime = Pmw.Group(pageHack, tag_pyclass=None)

frame = Frame(groupTime.interior()) self.lblpjkeyVar = StringVar() self.lblpjkey = Label(frame,

textvariable=self.lblpjkeyVar).pack(padx=5, pady=5, side=LEFT) frame.pack(fill = X, padx=5, pady=5)

self.lblpjkeyVar.set('Panjang Kunci: ') frame = Frame(groupTime.interior()) self.lbltimehackVar = StringVar() self.lbltimehack = Label(frame,

textvariable=self.lbltimehackVar).pack(padx=5, pady=5, side=LEFT) frame.pack(side=LEFT, padx=5, pady=5)

self.lbltimehackVar.set('Waktu Pemecahan Kunci: ')

groupTime.pack(fill=X, padx = 5, pady = 5, ipadx = 5, ipady = 5) # packing grup. notebook.setnaturalsize() def centerWindow(self): w = 290 h = 150 sw = root.winfo_screenwidth() sh = root.winfo_screenheight() x = (sw - w)/2 y = (sh - h)/2 root.geometry('%dx%d+%d+%d' % (w, h, x, y))

def generateKunci(self):

panjang = self.cbpjkey.get() start_time = time.time()

key = self.elGamal.bangkitkanKunci(panjang) timeelapsed = time.time() - start_time print('p: ', getattr(key, 'pubKeyP')) print('a: ', getattr(key, 'pubKeyA')) print('b: ', getattr(key, 'pubKeyB')) print('d: ', getattr(key, 'privKeyD')) print('time elapsed: ', timeelapsed)

infostring = 'Lama waktu pembangkitan kunci: ' + str("%.4f" % timeelapsed) + ' s' self.labelInfoVar.set(infostring) self.entryGenKeypVar.set(getattr(key, 'pubKeyP')) self.entryGenKeyaVar.set(getattr(key, 'pubKeyA')) self.entryGenKeybVar.set(getattr(key, 'pubKeyB')) self.entryGenKeyPrivdVar.set(getattr(key, 'privKeyD')) # Hack a = int(getattr(key, 'pubKeyA')) b = int(getattr(key, 'pubKeyB')) p = int(getattr(key, 'pubKeyP')) dlp = DLP() start_time = time.time() mylist = dlp.shpDiscreteLog(a, b, p) hacked = getattr(mylist, "d")

dlptimeelapsed = time.time() - start_time print('hacked key: ', hacked)

print('HACK time elapsed: ', dlptimeelapsed)

def exportKunciPublik(self):

myPubKey = 'p' + self.entryGenKeypVar.get() + ';'

myPubKey = myPubKey + 'a' + self.entryGenKeyaVar.get() + ';'

myPubKey = myPubKey + 'b' + self.entryGenKeybVar.get()

myFile = filedialog.asksaveasfile(mode='w')

if myFile is None: return myFile.write(myPubKey) def exportKunciPrivat(self): myPrivKey = 'p' + self.entryGenKeypVar.get() + ';' myPrivKey = myPrivKey + 'd' + self.entryGenKeyPrivdVar.get()

myFile = filedialog.asksaveasfile(mode='w')

if myFile is None:

return

myFile.write(myPrivKey)

def importKunciPublik(self):

myFile = filedialog.askopenfile(mode='r')

if myFile is None:

return

myText = myFile.read()

elGamalCon = ElGamalConverter()

self.entryEncryptpVar.set(myPubKey['p']) self.entryEncryptaVar.set(myPubKey['a']) self.entryEncryptbVar.set(myPubKey['b']) def importKunciPrivat(self):

myFile = filedialog.askopenfile(mode='r')

if myFile is None:

Dokumen terkait