1-
21class RandCrack :
32
43 def __init__ (self ):
@@ -12,8 +11,8 @@ def submit(self, num):
1211 return
1312 bits = self ._to_bitarray (num )
1413
15- assert (all ([x == 0 or x == 1 for x in bits ]))
16- self .counter += 1
14+ assert (all ([x == 0 or x == 1 for x in bits ]))
15+ self .counter += 1
1716 self .mt .append (self ._harden_inverse (bits ))
1817 if self .counter == 624 :
1918 self ._regen ()
@@ -27,26 +26,26 @@ def _predict_32(self):
2726 self ._regen ()
2827 self .counter += 1
2928
30- return self ._harden (self .mt [self .counter - 1 ])
29+ return self ._harden (self .mt [self .counter - 1 ])
3130
32- def predict_getrandbits (self ,k ):
31+ def predict_getrandbits (self , k ):
3332 if not self .state :
3433 print ("Didn't recieve enough bits to predict" )
3534 return 0
3635 if k == 0 :
3736 return 0
38- words = (k - 1 ) // 32 + 1
37+ words = (k - 1 ) // 32 + 1
3938 res = []
4039 for i in range (words ):
4140 r = self ._predict_32 ()
4241 if k < 32 :
43- r = [0 ]* (32 - k ) + r [:k ]
42+ r = [0 ] * (32 - k ) + r [:k ]
4443 res = r + res
4544 k -= 32
4645 return self ._to_int (res )
4746
4847 def predict_randbelow (self , n ):
49- k = n .bit_length ()
48+ k = n .bit_length ()
5049 r = self .predict_getrandbits (k )
5150 while r >= n :
5251 r = self .predict_getrandbits (k )
@@ -87,10 +86,10 @@ def predict_randrange(self, start, stop=None, step=1, _int=int):
8786 if n <= 0 :
8887 raise ValueError ("empty range for randrange()" )
8988
90- return istart + istep * self .predict_randbelow (n )
89+ return istart + istep * self .predict_randbelow (n )
9190
92- def predict_randint (self , a ,b ):
93- return self .predict_randrange (a , b + 1 )
91+ def predict_randint (self , a , b ):
92+ return self .predict_randrange (a , b + 1 )
9493
9594 def predict_choice (self , seq ):
9695 try :
@@ -101,75 +100,71 @@ def predict_choice(self, seq):
101100
102101 def _to_bitarray (self , num ):
103102 k = [int (x ) for x in bin (num )[2 :]]
104- return [0 ] * (32 - len (k )) + k
103+ return [0 ] * (32 - len (k )) + k
105104
106- def _to_int (self , bits ):
105+ def _to_int (self , bits ):
107106 return int ("" .join (str (i ) for i in bits ), 2 )
108107
109108 def _or_nums (self , a , b ):
110109 if len (a ) < 32 :
111- a = [0 ]* (32 - len (a ))+ a
110+ a = [0 ] * (32 - len (a )) + a
112111 if len (b ) < 32 :
113- b = [0 ]* (32 - len (b ))+ b
112+ b = [0 ] * (32 - len (b )) + b
114113
115114 return [x [0 ] | x [1 ] for x in zip (a , b )]
116115
117116 def _xor_nums (self , a , b ):
118117 if len (a ) < 32 :
119- a = [0 ]* (32 - len (a ))+ a
118+ a = [0 ] * (32 - len (a )) + a
120119 if len (b ) < 32 :
121- b = [0 ]* (32 - len (b ))+ b
120+ b = [0 ] * (32 - len (b )) + b
122121
123122 return [x [0 ] ^ x [1 ] for x in zip (a , b )]
124123
125124 def _and_nums (self , a , b ):
126125 if len (a ) < 32 :
127- a = [0 ]* (32 - len (a ))+ a
126+ a = [0 ] * (32 - len (a )) + a
128127 if len (b ) < 32 :
129- b = [0 ]* (32 - len (b ))+ b
128+ b = [0 ] * (32 - len (b )) + b
130129
131130 return [x [0 ] & x [1 ] for x in zip (a , b )]
132131
133-
134-
135-
136132 def _decode_harden_midop (self , enc , and_arr , shift ):
137-
133+
138134 NEW = 0
139135 XOR = 1
140- OK = 2
136+ OK = 2
141137 work = []
142138 for i in range (32 ):
143- work .append ((NEW ,enc [i ]))
139+ work .append ((NEW , enc [i ]))
144140 changed = True
145141 while changed :
146142 changed = False
147143 for i in range (32 ):
148144 status = work [i ][0 ]
149145 data = work [i ][1 ]
150- if i >= 32 - shift and status == NEW :
151- work [i ] = (OK ,data )
146+ if i >= 32 - shift and status == NEW :
147+ work [i ] = (OK , data )
152148 changed = True
153- elif i < 32 - shift and status == NEW :
149+ elif i < 32 - shift and status == NEW :
154150 if and_arr [i ] == 0 :
155151 work [i ] = (OK , data )
156152 changed = True
157153 else :
158154 work [i ] = (XOR , data )
159155 changed = True
160156 elif status == XOR :
161- i_other = i + shift
157+ i_other = i + shift
162158 if work [i_other ][0 ] == OK :
163159 work [i ] = (OK , data ^ work [i_other ][1 ])
164160 changed = True
165161
166162 return [x [1 ] for x in work ]
167163
168-
169164 def _harden (self , bits ):
170165 bits = self ._xor_nums (bits , bits [:- 11 ])
171- bits = self ._xor_nums (bits , self ._and_nums (bits [7 :] + [0 ] * 7 , self ._to_bitarray (0x9d2c5680 )))
172- bits = self ._xor_nums (bits , self ._and_nums (bits [15 :] + [0 ] * 15 , self ._to_bitarray (0xefc60000 )))
166+ bits = self ._xor_nums (bits , self ._and_nums (bits [7 :] + [0 ] * 7 , self ._to_bitarray (0x9d2c5680 )))
167+ bits = self ._xor_nums (bits , self ._and_nums (bits [15 :] + [0 ] * 15 , self ._to_bitarray (0xefc60000 )))
173168 bits = self ._xor_nums (bits , bits [:- 18 ])
174169 return bits
175170
@@ -181,12 +176,11 @@ def _harden_inverse(self, bits):
181176 # inverse for: bits = _xor_nums(bits, _and_nums(bits[7:] + [0] * 7 , _to_bitarray(0x9d2c5680)))
182177 bits = self ._decode_harden_midop (bits , self ._to_bitarray (0x9d2c5680 ), 7 )
183178 # inverse for: bits = _xor_nums(bits, bits[:-11])
184- bits = self ._xor_nums (bits , [0 ] * 11 + bits [:11 ]+ [0 ] * 10 )
179+ bits = self ._xor_nums (bits , [0 ] * 11 + bits [:11 ] + [0 ] * 10 )
185180 bits = self ._xor_nums (bits , bits [11 :21 ])
186181
187182 return bits
188183
189-
190184 def _regen (self ):
191185 # C code translated from python sources
192186 N = 624
@@ -198,17 +192,17 @@ def _regen(self):
198192
199193 l_bits = self ._to_bitarray (LOWER_MASK )
200194 u_bits = self ._to_bitarray (UPPER_MASK )
201-
202- for kk in range (0 ,N - M ):
203- y = self ._or_nums (self ._and_nums ( self .mt [kk ], u_bits ), self ._and_nums (self .mt [kk + 1 ],l_bits ))
204- self .mt [kk ] = self ._xor_nums (self ._xor_nums ( self .mt [kk + M ] , y [:- 1 ]) , mag01 [y [- 1 ] & 1 ])
205195
206- for kk in range (N - M - 1 , N - 1 ):
207- y = self ._or_nums (self ._and_nums ( self .mt [kk ], u_bits ), self ._and_nums (self .mt [kk + 1 ],l_bits ))
208- self .mt [kk ] = self ._xor_nums (self ._xor_nums ( self .mt [kk + (M - N )] , y [:- 1 ]) , mag01 [y [- 1 ] & 1 ])
196+ for kk in range (0 , N - M ):
197+ y = self ._or_nums (self ._and_nums (self .mt [kk ], u_bits ), self ._and_nums (self .mt [kk + 1 ], l_bits ))
198+ self .mt [kk ] = self ._xor_nums (self ._xor_nums (self .mt [kk + M ], y [:- 1 ]), mag01 [y [- 1 ] & 1 ])
199+
200+ for kk in range (N - M - 1 , N - 1 ):
201+ y = self ._or_nums (self ._and_nums (self .mt [kk ], u_bits ), self ._and_nums (self .mt [kk + 1 ], l_bits ))
202+ self .mt [kk ] = self ._xor_nums (self ._xor_nums (self .mt [kk + (M - N )], y [:- 1 ]), mag01 [y [- 1 ] & 1 ])
209203
210- y = self ._or_nums (self ._and_nums ( self .mt [N - 1 ], u_bits ), self ._and_nums (self .mt [0 ],l_bits ))
211- self .mt [N - 1 ] = self ._xor_nums (self ._xor_nums ( self .mt [M - 1 ] , y [:- 1 ]) , mag01 [y [- 1 ] & 1 ])
204+ y = self ._or_nums (self ._and_nums (self .mt [N - 1 ], u_bits ), self ._and_nums (self .mt [0 ], l_bits ))
205+ self .mt [N - 1 ] = self ._xor_nums (self ._xor_nums (self .mt [M - 1 ] , y [:- 1 ]), mag01 [y [- 1 ] & 1 ])
212206
213207 self .counter = 0
214208
@@ -223,11 +217,7 @@ def _regen(self):
223217 random .seed (time .time ())
224218
225219 for i in range (624 ):
226- cracker .submit (random .randint (0 ,4294967294 ))
220+ cracker .submit (random .randint (0 , 4294967294 ))
227221
228222 print ("Guessing next 32000 random bits success rate: {}%"
229- .format (sum ([random .getrandbits (32 )== cracker .predict_getrandbits (32 ) for x in range (1000 )])/ 10 ))
230-
231-
232-
233-
223+ .format (sum ([random .getrandbits (32 ) == cracker .predict_getrandbits (32 ) for x in range (1000 )]) / 10 ))
0 commit comments