Beruflich Dokumente
Kultur Dokumente
def toBinary(str):
li=list(str)
bin=[]
for x in li:
num= ord(x)
bi='{0:08b}'.format(num)
bin.append(bi)
return bin
mybin=toBinary(st)
def appendBits(binary):
bin=binary
numBits=len(bin)*8
length=numBits
count=1
while length%1024 != 896%1024:
if count==1:
bin.append('10000000')
else:
bin.append('00000000')
count=count+1
length=len(bin)*8
endBits = '{0:0128b}'.format(numBits)
count1 = 1
for x in range(len(endBits)):
if count1 % 8 == 0:
bin.append(endBits[count1 - 8:count1])
count1 = count1 + 1
return bin
messageBinary=appendBits(mybin)
def convertToHex(messageProcess):
hexWords=[]
words=[]
count=0
wordCount=0
for x in range(len(messageProcess)):
count = count + 1
if count == 1:
# hex1 = hex(int(messageProcess[x], 2))
words.append(messageProcess[x])
elif count>1 and count<8:
words[wordCount] += messageProcess[x]
elif count == 8:
words[wordCount] += messageProcess[x]
count = 0
wordCount = wordCount+1
# print(words)
# print(len(words[15]))
# for i in range(len(words)):
# hex1 = hex(int(words[i], 2))
# hexWords.append(hex1)
return words
def phi0(word):
original=word
rotr1 = rightShift(original, 1)
rotr8 = rightShift(original, 8)
shr7 = LeftShift(original, 7)
temp= xor(rotr1,rotr8)
result= xor(temp,shr7)
return result
def LeftShift(message,n):
message1 = list(message)
for i in range(n):
for x in range(len(message1)-1):
message1[x]=message1[x+1]
message1[len(message1)-1] = '0'
return message1
def rightShift(message,n):
message1=list(message)
# print(message1)
for i in range(n):
# print(i)
x = len(message1) - 1
last = message1[x]
# y=1
for y in range(len(message1)-1):
if x-y-1 >= 0:
message1[x-y]=message1[x-y-1]
message1[0] = last
return message1
def EightyWord(hexWords):
for i in range(16,80):
sigma1= phi1(hexWords[i-2])
temp=list(hexWords[i-7])
sigma2=phi0(hexWords[i-15])
temp2=list(hexWords[i-16])
result=add(sigma1,temp)
result2=add(result,sigma2)
finalResult=add(result2,temp2)
word=''.join(finalResult)
hexWords.append(word)
return hexWords
def hexToBinary64(li):
#
hex=['0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','
1011','1100','1101','1110','1111']
scale = 16 ## equals to hexadecimal
k = []
num_of_bits = 64
for x in li:
r = bin(int(x, scale))[2:].zfill(num_of_bits)
k.append(r)
return k
def convertBuffersToBinary():
bufferInital = ["6A09E667F3BCC908","BB67AE8584CAA73B", "3C6EF372FE94F82B",
"A54FF53A5F1D36F1", "510E527FADE682D1", "9B05688C2B3E6C1F"
,"1F83D9ABFB41BD6B", "5BE0CD19137E2179"]
buffer_binary= hexToBinary64(bufferInital)
# buffer.a_bin= buffer_binary[0]
# buffer.b_bin = buffer_binary[1]
# buffer.c_bin = buffer_binary[2]
# buffer.d_bin = buffer_binary[3]
# buffer.e_bin = buffer_binary[4]
# buffer.f_bin = buffer_binary[5]
# buffer.g_bin = buffer_binary[6]
# buffer.h_bin = buffer_binary[7]
return buffer_binary
def saveIntialBuffer(buffer):
temp=[]
for t in buffer:
temp.append(t)
return temp
def andBinary(l_m1, l_m2):
resultAnd=[]
for g in range(len(l_m1)):
if (l_m1[g] == '1' and l_m2[g] == '1'):
resultAnd.append('1')
elif (l_m1[g] == '1' and l_m2[g] == '0'):
resultAnd.append('0')
elif (l_m1[g] == '0' and l_m2[g] == '1'):
resultAnd.append('0')
elif (l_m1[g] == '0' and l_m2[g] == '0'):
resultAnd.append('0')
return resultAnd
def notBinary(l_m):
resultNot=[]
for s in range(len(l_m)):
if l_m[s] == "1":
resultNot.append("0")
elif l_m[s] == "0":
resultNot.append("1")
return resultNot
def Ch(e,f,g):
temp1=list(e)
temp2=list(f)
temp3 = list(g)
eAndF= andBinary(temp1, temp2)
notE=notBinary(temp1)
notE_AndG= andBinary(notE, temp3)
result = xor(eAndF,notE_AndG)
return result
def sigmaE(e):
sigE=e
# print('e: ',sigE)
rotr14 = rightShift(sigE,14)
rotr18 = rightShift(sigE,18)
rotr41 = rightShift(sigE,41)
result = xor(rotr14,rotr18)
finalResult= xor(result,rotr41)
return finalResult
def sigmaA(a):
rotr28 = rightShift(a, 28)
rotr34 = rightShift(a, 34)
rotr39 = rightShift(a, 39)
result = xor(rotr28, rotr34)
finalResult = xor(result, rotr39)
return finalResult
def Maj(a,b,c):
temp1=list(a)
temp2=list(b)
temp3=list(c)
aAndB= andBinary(temp1,temp2)
aAndC= andBinary(temp1,temp3)
bAndC= andBinary(temp2,temp3)
result=xor(aAndB,aAndC)
finalResult= xor(result,bAndC)
return finalResult
def T1(s_h,l_ch,l_sigE,word,Kt):
l_h=list(s_h)
l_word=list(word)
l_K= list(Kt)
hPlusCh = add(l_h,l_ch)
hPlusChPlusE = add(hPlusCh,l_sigE)
tempWt = add(hPlusChPlusE,l_word)
tempK_final = add(tempWt,l_K)
return tempK_final
def SHA(message):
count = 0
messageProcess = []
binary_constants = hexToBinary64(constants)
buffer = convertBuffersToBinary()
for i in range(len(message)):
count = count + 1
if count <=127:
messageProcess.append(message[i])
elif count== 128:
messageProcess.append(message[i])
#proceess message. make count=0
count=0
Words=convertToHex(messageProcess)
wordsEighty=EightyWord(Words)
temp=saveIntialBuffer(buffer)
for z in range(80):
Ch1=Ch(buffer[4],buffer[5],buffer[6])
sigmaE1= sigmaE(buffer[4])
sigmaA1 = sigmaA(buffer[0])
Maj1 = Maj(buffer[0],buffer[1],buffer[2])
l_t1 = T1(buffer[7],Ch1,sigmaE1,wordsEighty[z],binary_constants[z])
l_t2 = T2(sigmaA1,Maj1)
buffer[7]=buffer[6] #h=g
buffer[6]=buffer[5] #g=f
buffer[5]=buffer[4] #f=e
temp_buff3=list(buffer[3])
l_temp_buff3=add(l_t1,temp_buff3) #e=d+T1
str_l_temp_buff3=''.join(l_temp_buff3)
buffer[4]=str_l_temp_buff3
buffer[3]=buffer[2] #d=c
buffer[2]=buffer[1] #c=b
buffer[1]=buffer[0] #b=a
l_tempT1_T2=add(l_t1,l_t2)
str_tempT1_T2=''.join(l_tempT1_T2)
buffer[0]=str_tempT1_T2
SHA(messageBinary)