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