• Tidak ada hasil yang ditemukan

1. libelgamal.py - Simulasi Pencarian Kunci Privat dengan Algoritma Silver-Pohlig-Hellaman pada Algoritma Kriptografi Elgamal

N/A
N/A
Protected

Academic year: 2019

Membagikan "1. libelgamal.py - Simulasi Pencarian Kunci Privat dengan Algoritma Silver-Pohlig-Hellaman pada Algoritma Kriptografi Elgamal"

Copied!
24
0
0

Teks penuh

(1)

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

(2)

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

(3)

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

(4)

# 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):

(5)

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

(6)

# 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

(7)

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

(8)

# 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):

(9)

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

(10)

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

(11)

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 """

(12)

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

(13)

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

(14)

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

(15)

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)

(16)

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.

(17)

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)

(18)

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)

(19)

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

(20)

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

(21)

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

(22)

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:

return

myText = myFile.read()

elGamalCon = ElGamalConverter()

myPrivKey = elGamalCon.stringToPrivKey(myText) self.entryDecryptpVar.set(myPrivKey['p']) self.entryDecryptdVar.set(myPrivKey['d'])

def importPlainText(self):

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

if myFile is None:

return

self.encryptPlainText.delete(1.0, END)

self.encryptPlainText.insert(END, myFile.read())

def importCipherText(self):

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

if myFile is None:

return

self.myCipherText = myFile.read()

print(self.myCipherText)

self.decryptCipherText1.delete(1.0, END)

self.decryptCipherText1.insert(END, self.myCipherText)

def enkripsi(self):

pubKeyA = int(self.entryEncryptaVar.get()) pubKeyB = int(self.entryEncryptbVar.get()) pubKeyP = int(self.entryEncryptpVar.get()) message = self.encryptPlainText.get("1.0",END) message = message[:len(message) - 1]

for char in message: print('char: ', char)

cipherText = self.elGamal.enkripsi(message, pubKeyA, pubKeyB, pubKeyP)

self.myCiphertext = getattr(cipherText, 'cipherText1') + chr(95) + str(getattr(cipherText, 'cipherText2'))

self.encryptCipherText1.delete(1.0, END)

self.encryptCipherText1.insert(END, self.myCiphertext)

def dekripsi(self):

pubKeyP = int(self.entryDecryptpVar.get()) privKeyD = int(self.entryDecryptdVar.get())

egc = ElGamalConverter()

myct = self.decryptCipherText1.get("1.0",END) cipherText = egc.stringToMessage(myct)

C1 = cipherText[0] C2 = int(cipherText[1])

plainText = self.elGamal.dekripsi(C2, C1, pubKeyP, privKeyD)

self.decryptPlainText.delete(1.0, END)

(23)

def eksportCipherText(self):

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

if myFile is None:

return

myFile.write(self.myCiphertext)

def eksportPlainText(self):

message = self.decryptPlainText.get("1.0",END) myFile = filedialog.asksaveasfile(mode='w')

if myFile is None:

return

myFile.write(message)

def importKunciPublikHack(self):

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

if myFile is None:

return

myText = myFile.read()

elGamalCon = ElGamalConverter()

myPubKey = elGamalCon.stringToPubKey(myText) self.entryHackpVar.set(myPubKey['p'])

self.entryHackaVar.set(myPubKey['a']) self.entryHackbVar.set(myPubKey['b'])

def eksportHackedKunciPrivat(self):

myPrivKey = 'p' + self.entryHackpVar.get() + ';'

myPrivKey = myPrivKey + 'd' + self.entryHackdVar.get() myFile = filedialog.asksaveasfile(mode='w')

if myFile is None:

return

myFile.write(myPrivKey)

def hack(self):

a = int(self.entryHackaVar.get()) b = int(self.entryHackbVar.get()) p = int(self.entryHackpVar.get()) dlp = DLP()

start_time = time.time()

mylist = dlp.shpDiscreteLog(a, b, p) timeelapsed = time.time() - start_time

self.lblpjkeyVar.set('Panjang Kunci: ' + str(len(str(p))) + ' digit')

infostring = 'Lama waktu pemecahan kunci: ' + str("%.4f" % timeelapsed) + ' s'

self.lbltimehackVar.set(infostring)

print('HACK time elapsed: ', timeelapsed) self.entryHackdVar.set(getattr(mylist, "d"))

#Code tetap, inisialisasi root = Tk()

# splash screen >;)

image_file = "lib/splash.gif"

assert os.path.exists(image_file)

s = SplashScreen(root, timeout=3000, image=image_file)

# Membuat objek notebook dengan method inisialisasi ex = ElGamalSHP(root)

(24)

CURRICULUM VITAE

Nama

: Arifin

Alamat

: Jl. Paku. Gg Family, no. 20, Kec. Medan Marelan, Medan.

Alamat Orang Tua

: Jl. Paku. Gg Family, no. 20, Kec. Medan Marelan, Medan.

No. Handphone

: 0878 6722 3126

Pendidikan

1997-2003

: SD N 031 Kec. Siak Hulu, Kab. Kampar, Riau.

2003-2006

: SMP N 4 Kec. Siak Hulu, Kab. Kampar, Riau.

2006-2009

: SMA S. Sinar Husni, Kec. Medan Helvetia, Medan.

2010-2015

: Universitas Sumatera Utara (S1 Ilmu Komputer Fasilkom-TI)

Riwayat Organisasi

2011-2012

: Anggota Bidang Kaderisasi UKMI Al-Khuwarizmi

2012

: Kepala Bidang Kaderisasi UKMI Al-Khuwarizmi

2012-2014

: Asisten Laboratorium Pemrograman

2012-2013

: Divisi Penjadwalan IKLC

2013-2014

: Ketua Unit IKLC

Keahlian

Web Development

Bahasa Pemrograman : HTML, Javascript, CSS, PHP.

Framework

: CodeIgniter, Wordpress, Bootstrap.

Referensi

Dokumen terkait

Berdasarkan data yang dikumpulkan, ditemukan bahwa iklim organisasi berpengaruh positif dan signifikan terhadap organizational citizenship behavior, dimana

semua kegiatan atau program yang telah direncanakan tersebut adalah ada... keterkaitan dan saling menunjang antara program satu dengan program

Begitu pula dengan hasil penelitian yang dilakukan oleh Zeinabadi dan Salehi (2011) yang menunjukkan bahwa keadilan organisasi memiliki pengaruh terhadap

Selanjutnya apabila kita berbi- cara dengan berbahasa dengan tumpuan pada la- wan tutur misalnya agar orang yang kita ajak berbicara tidak tersinggung agar lawan bicara

Penelitian ini bermanfaat untuk mencari obat yang yang lebih efektif dalam mengurangi nyeri tenggorok dan suara serak akibat dari pemasangan pipa nafas selama operasi.. Adapun

3 Tahun adalah kesatuan masyarakat hukum adat di Provinsi Bali yang mempunyai satu kesatuan tradisi dan tata krama pergaulan hidup masyarakat umat Hindu secara turun-temurun

Penelitian ini telah mengukur tekanan darah pada penderita hipertensi di PSTW unit Abiyoso tahun 2012 yang diadakan pada kelompok eksperimen yang diberikan jus tomat selama 7

Hasil penelitian untuk aspek kognitif yang diukur dengan tes mengalami peningkatan dari siklus 1 (77,42%) ke siklus 2 (87,50%) akan tetapi menurun pada siklus 3 (56,25%),