Teknik Pemecahan Kunci Algoritma ElGamal Menggunakan Metode Index Calculus

A-1

Lampiran Listing Program
1. ElGamal.py
from random import randint
import akarPrimitifGauss as primitiveRoot
from java.math import BigInteger as nonExshaustingPrimeGenerator
import pengujianMillerSelfridgeRabin as primality
def keyGenerating(primeBit, A):
myPK = [0,0,0]
batasBawah = pow(2, (primeBit-1))
up = primeBit
batasAtas = (pow(2, up))
batasAtas = batasAtas-1
prime = randint(batasBawah, batasAtas)
prime = nonExshaustingPrimeGenerator.valueOf(prime)
while(primality.pengujianMSR(prime)==False):
prime =
nonExshaustingPrimeGenerator.nextProbablePrime(prime)
prime = int(prime)
alpha = primitiveRoot.GaussForPrimitiveRoot(prime)

alpha_a = pow(alpha, A)
alpha_a = alpha_a%prime
myPK[0] = alpha
myPK[1] = alpha_a
myPK[2] = prime
return myPK
def Enkripsi(publicKey, M):
print M
C = [[0 for j in range(2)] for i in range(len(M))]
a = publicKey[0]
aA = publicKey[1]
p = publicKey[2]
for i in range(0, len(M)):
k = randint(2,p-2)
C[i][0] = (pow(a,k))%p
C[i][1] = (((pow(aA,k))%p)*(M[i]))%p
print "C = ",C
return C
def Dekripsi(publicKey, C, A):
p = int(publicKey[2])

print p
M =range(len(C))

Universitas Sumatera Utara

A-2

print "C.length =", len(C)
for i in range(0, len(C)):
exp = p-1-A
mytemp = pow(C[i][0], exp) % p
M[i] = (mytemp * C[i][1])%p
return M

2. PengujianMillerSelfridgeRabin.py
from random import randint
import timeit
global k
def pengujianMSR(n):
msrTimer1 = timeit.default_timer()

t=1
k=0
m = n - 1
while(m%2==0):
t=t+1
m = m/2
MSRlist =[]
for k in range(0,20):
a = randint(2,n-2)
MSRlist.append(a)
while(MSRlist.count(a)>0):
a = randint(2,n-2)
x = (pow(a,m))%n
if(t==1 and (x!=1 or x != n-1)): return False
elif(x==1 or x == n-1):
continue
else:
j=1
while(j0):
b = randint(2,p-2)

u = OrderCounter(b, p)
print "u =",u
if(u==p-1):
gaussTimer2 = timeit.default_timer()
return b
else:
v = lcm(t, u)
a = brent(v)
c = v/a
if(v==p-1):
ap = pow(m,(t/a))%p
ap = (ap*(pow(b,(u/c)[p])))%p
gaussTimer2 = timeit.default_timer()
return ap
else:
del thisList
m = ((pow(m,(t/a))%p)*(pow(b,(u/c))%p))%p
print "m",diekonter," yang baru =",m
pass
pass

pass
continue
def OrderCounter(alpha, p):
order=1
while((pow(alpha,order))%p!=1):
order+=1
return order
def gcd(x,y):
while y > 0:
x, y = y, x % y
return x

Universitas Sumatera Utara

A-4

def lcm(x, y):
return (x*y)/(gcd(x, y))
def FaktorisasiFermat(N):
global factor1

global factor2
s = ceil(sqrt(N))
u = (s*2)+1
v = 1
r = (s*s)-N
while(r!=0):
if(r>0):
while(r>0):
r = r - v
v = v + 2
continue
else:
r = r + u
u = u + 2
continue
factor1 = ((u + v) - 2)/2
factor2 = (u - v)/2

4. Step1.py (Index Calculus)
from random import randint, random

import sys
sys.path.append("C:\\jython2.7.0\\jama\\Jama-1.0.3.jar")
sys.path.append("C:\\java\jblas\\mikiobraun-jblas-8213dba\\jblas1.2.4.jar")
sys.path.append("C:\\jython2.7.0\\JyNI\\JyNI.jar")
sys.path.append('C:\\java\\apache common math\\commons-math33.6.1.jar')
sys.path.append('C:\\jython2.7.0\\SCPSolver.jar')
from Jama import Matrix, LUDecomposition ,
SingularValueDecomposition as svd, CholeskyDecomposition as chol
from org.apache.commons.math3.linear import DecompositionSolver,
Array2DRowFieldMatrix,\
RealMatrix, RealVector, ArrayRealVector, MatrixUtils,
Array2DRowRealMatrix, LUDecomposition,\
QRDecomposition, CholeskyDecomposition, EigenDecomposition as
myEigen
myFactorbase = [ , ,…,79 9]
global factor1, factor2
myReporter = ""
gFB = None
gIC = None
gGamma = None

gReductedIC = None
gRICsum = None
gRawIC = None
drx = None
randomPow = None
ohm = None

Universitas Sumatera Utara

A-5

randomB = None
gloc = None
primus = None
be = None
akP = None
def logFB(alpha, prima, fb):
#initiating
bound = prima-2
global expList

expList = [0]*len(fb)
LFB = [[0]*len(fb) for x in xrange(len(fb))]
fbLength = len(fb)
i=0
while(i0 or exp fb[fbLength-1]):
x=0
while(x1):
LFB[i][j]+=1
beta = beta/fb[j]
if(beta==1):
pass
else:
continue
return LFB
def IndexCalculusFinale(B, p, alpha, s):
global primus
global akP
global be
primus = p
akP = alpha

be = B
i=0
fb=[]
i=0
while(myFactorbase[i] 0) or
exp fb[len(fb)-1]):
x=0
while(x1):
LFB[i][j]+=1
beta = beta/fb[j]
if(beta==1):
myTemp = [0]*len(fb)
for k in range(0, len(myTemp)):
myTemp[k] = LFB[i][k]
if(myTemp.count(0) > len(fb)-2):
x=0
while(x1):
if(i==0 and gamma>fb[maX]):
GammaIndex = [0]*len(fb)
exp = randint(2,p-2)

gamma = pow(alpha, exp)
gamma = gamma%p
gamma = (gamma*B)%p
i=mylength-1
elif(gamma%fb[i]==0):
gamma = gamma/fb[i]
GammaIndex[i]+=1
else:
i-=1
continue
temp=0
global myReporter
myReporter =""
global gRICsum
gRICsum = GammaIndex
i=0
for i in range(0, len(FBlog)):
myReporter+=str(GammaIndex[i])
myReporter+="*log"
myReporter+=str(fb[i])
myReporter+=" = "
myReporter+=str(GammaIndex[i])
myReporter+="*"

Universitas Sumatera Utara

A-8

myReporter+=str(FBlog[i])
myReporter+=" = "
myReporter+=str(FBlog[i]*GammaIndex[i])
myReporter+="\n"
print
GammaIndex[i],"*log",fb[i],"=",GammaIndex[i],"*",FBlog[i],"=",FBlog[
i]*GammaIndex[i]
temp += (FBlog[i]*GammaIndex[i])
i+=1
if(i==len(fb)):
temp = (temp-exp)
temp = temp%newp
global gloc
gloc = temp
return temp

5. myIOControl.py
from java.io import FileReader, BufferedReader
from javax.swing import JFileChooser
from math import floor
import timeit
from __builtin__ import str
def myTimer():
start = timeit.timeit()
print "hello"
end = timeit.timeit()
return end - start
def expTester(a, b, p):
return pow(a, b)%p
def fileBrowser():
myFileChooser = JFileChooser()
rVal = int(myFileChooser.showOpenDialog(None))
print rVal
if(rVal == JFileChooser.APPROVE_OPTION):
theName = myFileChooser.getSelectedFile().getName()
thePath = myFileChooser.getCurrentDirectory().toString()
try:
myPath = theName + "/" + thePath
fileReader = FileReader(myPath)
bufferedReader = BufferedReader(fileReader)
inputFile=""
textFieldReadable = bufferedReader.readLine()
while(textFieldReadable!=None):
inputFile+=textFieldReadable
inputFile+="\n"
return inputFile
except(RuntimeError, TypeError, NameError):
print "eror"
def parseTxtToWords(path):
f = open(path, 'r')

Universitas Sumatera Utara

A-9

for line_no, line in enumerate(f):
if len(line.strip()) != 32:
print line_no, line
for line in f:
for i in range(0, 3) and (line[i]!="
print line[i]
return line
f.close()

"):

def arraySplitter(M):
M2D = [[0 for j in range(2)] for i in range(len(M)/2)] # [[0
for j in range(2)] for i in range((len(M))/2)]#[[0] * (len(M)/2)] *
2
#print M2D
i=0
print len(M)
j=0
while i0):
dieString+=" + "
dieString+=str(coef[j])
dieString+="log"
dieString+=str(B[j])
j+=1
dieString+=" - "
dieString+=str(expo)
dieString+=" mod "
dieString+=str(gP-1)
dieString+="\n"

Universitas Sumatera Utara

A-11

dieString+="log Beta = "
#dieString+="= "
j=0
while(j0):
if(j>0):
dieString+=" + "
dieString+=str(coef[j])
dieString+="*"
dieString+=str(A[j])
j+=1
dieString+=" - "
dieString+=str(expo)
dieString+=" mod "
dieString+=str(gP-1)
dieString+="\n"
if(Ax!=int(Ax)):
Ax = round(Ax, 3)
else:
Ax = int(Ax)
dieString+="log Beta = "
dieString+=str(Ax)
return dieString
def derGMDdrucker(fBase, genMat, genGam):
toPrint = ""
toPrint+="\n"
toPrint+="factor base"
for i in range(0, len(genMat)):
toPrint+="\t"
toPrint+=str(fBase[i])
i+=1
if(i==len(genMat)):
toPrint+="\t"
toPrint+="Gamma"
i=0
toPrint+="\n"
for i in range(0, len(genGam)):
toPrint+="\n"
toPrint+="\t\t"
for j in range(0, len(genMat)):
toPrint+=str(genMat[i][j])
toPrint+="\t"
j+=1
if(j==len(genMat)):
toPrint+=str(genGam[i])
i+=1
return toPrint
def derReddrucker(fBase, gReductedIC):
toPrint = ""
for i in range(0, len(gReductedIC)):
toPrint+="log "
toPrint+=str(fBase[i])
toPrint+=" = "
toPrint+=str(gReductedIC[i])

Universitas Sumatera Utara

A-12

toPrint+="\n"
i+=1
return toPrint

Universitas Sumatera Utara

B-1

Curriculum Vitae

Data Pribadi
Nama

:

Erwin M H Sinaga

Tempat, Tanggal lahir :

Buhit, 5 Januari 1994

Agama

:

Kristen Protestan

Alamat rumah

:

Jl. Sembada Gg. Mawar 2
No.1, Medan

Nomor telepon

:

082364763238

Email

:

erwin_sinaga@aol.com

Riwayat Pendidikan
2011 – 2017

:

S-1 Ilmu Komputer Universitas Sumatera
Utara, Medan

2008 – 2011

:

SMA Negeri 1 Pangururan

2005 – 2008

:

SMP Negeri 1 Pangururan

1999 – 2004

:

SD Negeri 3 Pangururan

2004 – 2005

:

SD Negeri 28 Desa Parlondut

Pengalaman
Periode 30 Juli s/d 16 Agustus 2014 :

Praktik Kerja Lapangan (PKL) di Balai
Meteorologi dan Geofisika Indonesia
Medan

Keahlian Komputer


Microsoft Office Word dan Excel



Trouble Shooting Windows



Menguasai bahasa pemrograman : C++, Java, Python

Universitas Sumatera Utara