Skip to content

Commit b75e41a

Browse files
authored
Add files via upload
1 parent 22218ef commit b75e41a

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

Sha-1.py

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
#!/usr/bin/env python
2+
#-*- coding:utf-8 -*-
3+
4+
5+
class Sha1:
6+
7+
def __init__(self,inputText):
8+
9+
self.inputText = inputText
10+
11+
self.WtList = []
12+
13+
def FillBin(self,bin,num):
14+
15+
need = num - len(bin)
16+
17+
if need != 0:
18+
19+
bin = '0'*need + bin
20+
21+
return bin
22+
23+
def FillInitialBin(self,firstText):
24+
25+
need = 448 - len(firstText)
26+
27+
if need >= 1:
28+
29+
firstText = firstText + '1' + (need-1)*'0' + self.FillBin(bin(len(self.inputText)*8)[2:],64)
30+
31+
return firstText
32+
33+
def InitialText(self):
34+
35+
return self.FillInitialBin(''.join([self.FillBin(bin(int(ord(i)))[2:],8) for i in self.inputText]))
36+
37+
def ReturnKt(self):
38+
39+
return ['5a827999','6ed9eba1','8f1bbcdc','ca62c1d6']
40+
41+
def InitialRegister(self):
42+
43+
return ['67452301','efcdab89','98badcfe','10325476','c3d2e1f0']
44+
45+
def HexToBin(self,hexString):
46+
47+
return ''.join([self.FillBin(bin(int(i,16))[2:],4) for i in hexString])
48+
49+
def BinToHex(self,binString):
50+
51+
return ''.join([hex(int(binString[4*i:4*(i+1)],2))[2:] for i in range(len(binString)/4)])
52+
53+
def LeftMove(self,bin,num):
54+
55+
for i in range(num):
56+
57+
bin = bin[1:] + bin[0]
58+
59+
return bin
60+
61+
def OperatorF(self,BCD,t):
62+
63+
BCD = int((BCD),2)
64+
65+
f = [[0,1,0,1,0,0,1,1],[0,1,1,0,1,0,0,1],[0,0,0,1,0,1,1,1],[0,1,1,0,1,0,0,1]]
66+
67+
return str(f[t/20][BCD])
68+
69+
def GetMod(self,number,mod):
70+
71+
return number%mod
72+
73+
74+
def EToA(self,f,E,LeftMoveA,w,k):
75+
76+
first = self.GetMod(int(f,2)+int(E,2),2**32)
77+
78+
second = self.GetMod(first+int(LeftMoveA,2),2**32)
79+
80+
third = self.GetMod(second+int(w,2),2**32)
81+
82+
forth = self.GetMod(third+int(k,2),2**32)
83+
84+
return self.FillBin(bin(forth)[2:],32)
85+
86+
def Wt(self,num):
87+
88+
allInitialText = self.InitialText()
89+
90+
if num <= 15:
91+
92+
return allInitialText[num*32:(num+1)*32]
93+
94+
else:
95+
96+
number = ''.join([str(int(a)^int(b)^int(c)^int(d)) for a,b,c,d in zip(self.WtList[num-16],self.WtList[num-14],self.WtList[num-8],self.WtList[num-3])])
97+
98+
return self.LeftMove(number,1)
99+
100+
def Kt(self,num):
101+
102+
return self.HexToBin(self.ReturnKt()[num/20])
103+
104+
def Control(self):
105+
106+
getInitialRegister = [self.HexToBin(i) for i in self.InitialRegister()]
107+
108+
A,B,C,D,E = getInitialRegister[0],getInitialRegister[1],getInitialRegister[2],getInitialRegister[3],getInitialRegister[4]
109+
110+
initalA,initalB,initalC,initalD,initalE = A,B,C,D,E
111+
112+
for num in range(80):
113+
114+
print '-'*50
115+
116+
w = self.Wt(num)
117+
118+
print num
119+
120+
self.WtList.append(w)
121+
122+
k = self.Kt(num)
123+
124+
f = ''.join([self.OperatorF(b+c+d,num) for b,c,d in zip(list(B),list(C),list(D))])
125+
126+
A,B,C,D,E = self.EToA(f,E,self.LeftMove(A,5),w,k),A,self.LeftMove(B,30),C,D
127+
128+
print 'A:' + self.BinToHex(A)
129+
130+
print 'B:' + self.BinToHex(B)
131+
132+
print 'C:' + self.BinToHex(C)
133+
134+
print 'D:' + self.BinToHex(D)
135+
136+
print 'E:' + self.BinToHex(E)
137+
138+
139+
140+
A = self.BinToHex(self.FillBin(bin(self.GetMod(int(A,2)+int(initalA,2),2**32))[2:],32))
141+
142+
B = self.BinToHex(self.FillBin(bin(self.GetMod(int(B,2)+int(initalB,2),2**32))[2:],32))
143+
144+
C = self.BinToHex(self.FillBin(bin(self.GetMod(int(C,2)+int(initalC,2),2**32))[2:],32))
145+
146+
D = self.BinToHex(self.FillBin(bin(self.GetMod(int(D,2)+int(initalD,2),2**32))[2:],32))
147+
148+
E = self.BinToHex(self.FillBin(bin(self.GetMod(int(E,2)+int(initalE,2),2**32))[2:],32))
149+
150+
151+
print '-'*50
152+
153+
print 'The secrect text is:' + A+B+C+D+E
154+
155+
156+
def main():
157+
158+
159+
sha1 = Sha1('abc')
160+
161+
sha1.Control()
162+
163+
164+
if __name__ == '__main__':
165+
166+
main()

0 commit comments

Comments
 (0)