18 acc = acc + 2**(n-i-1)
23 """Convertit un nombre en binaire"""
25 res = [0 for i in xrange(n)]
38 return 1 if a != b else 0
41 e1b,e2b = bin(e1,h),bin(e2,h)
42 d = dec([xorb(e1b[j],e2b[j]) for j in xrange(h)],h)
45 def lit(d,(indx,indy)):
54 def forward(H_hat,x,message,lnm,rho):
55 (h,w) = int(log(max(H_hat),2))+1, len(H_hat)
58 wght = [infinity for _ in xrange(int(2**h))]
60 newwght = [0 for _ in xrange(int(2**h))]
62 # rho= [1 for _ in xrange(len(x))]
65 while i < nbblock: # pour chaque bit du message
66 for j in xrange(w): # pour chaque colonne de H_hat
67 print indx, "en entrant",wght
69 while k < int(2**h): # pour chaque ligne de H
70 w0 = wght[k] + x[indx]*rho[indx]
71 w1 = wght[xor(k,H_hat[j],h)] + (1-x[indx])*rho[indx]
77 newwght[k] = min(w0,w1)
80 wght = [t for t in newwght]
81 print " apres calcul",wght
83 for j in xrange(int(2**(h-1))): # pour chaque colonne de H
84 wght[j] = wght[2*j + message[indm]]
85 wght = wght[:int(pow(2,h-1))] + [infinity for _ in xrange(int(pow(2,h)-pow(2,h-1)))]
89 reste_a_faire = len(x) % w
90 if reste_a_faire != 0 :
91 for j in xrange(reste_a_faire): # pour chaque colonne de H_hat qui reste
92 #print indx, "en entrant",wght
94 while k < int(2**h): # pour chaque ligne de H
95 w0 = wght[k] + x[indx]*rho[indx]
96 w1 = wght[xor(k,H_hat[j],h)] + (1-x[indx])*rho[indx]
102 newwght[k] = min(w0,w1)
105 wght = [t for t in newwght]
106 #print " apres calcul",wght
108 for j in xrange(int(2**(h-1))): # pour chaque colonne de H
109 wght[j] = wght[2*j + message[indm]]
110 wght = wght[:int(pow(2,h-1))] + [infinity for _ in xrange(int(pow(2,h)-pow(2,h-1)))]
114 start = np.argmin(wght)
118 def backward(start,H_hat,x,message,lnm,path):
119 (h,w) = int(log(max(H_hat),2))+1, len(H_hat)
120 indx,indm = len(x)-1,lnm-1
121 state = 2*start + message[indm]
123 # l'initialisation de state n'est pas optimale...
128 reste_a_faire = len(x) % w
129 if reste_a_faire != 0 :
130 l = range(reste_a_faire)
132 for j in l: # pour chaque colonne qui reste a faire
133 y[indx] = lit(path,(indx,state))
134 state = xor(state,y[indx]*H_hat[j],h)
136 state = 2*state + message[indm]
142 for j in l: # pour chaque colonne de H_hat
143 y[indx] = lit(path,(indx,state))
144 state = xor(state,y[indx]*H_hat[j],h)
146 state = 2*state + message[indm]
149 return [int(t) for t in y]
156 def trouve_H_hat(n,m,h):
160 index = min(int(alpha),9)
164 4 : [81, 95, 107, 121],
165 5 : [75, 95, 97, 105, 117],
166 6 : [73, 83, 95, 103, 109, 123],
167 7 : [69, 77, 93, 107, 111, 115, 121],
168 8 : [69, 79, 81, 89, 93, 99, 107, 119],
169 9 : [69, 79, 81, 89, 93, 99, 107, 119, 125]
172 if index not in matr:
179 def stc(x,rho,message):
181 mat = trouve_H_hat(len(x),len(message),7)
184 (start,path) = forward(mat,x_b,message,lnm,rho)
185 return (x_b,backward(start,mat,x_b,message,lnm,path),mat)
205 def prod(H_hat,lnm,y):
206 (h,w) = int(log(max(H_hat),2))+1, len(H_hat)
209 V=[0 for _ in range(len(y))]
212 while i < lnm: # pour chaque ligne
213 V=[0 for _ in range(len(y))]
214 k = max([(i-h+1)*w,0])
216 for j in xrange(min([i+1,h])): #nbre de blocks presents sur la ligne i
217 for l in xrange(w): # pour chaque collone de H_hat
219 V[k] = bin(H_hat[l],h)[h-i-1+j+dec]
221 sol.append(np.dot(np.array(V),np.array(y)))
226 return np.dot(Vp,np.array(y))
234 if x[i] % 2 != y[i]%2 :
242 x = [randint(0,1) for _ in xrange(65000)]
243 rho = [randint(1,9) for _ in xrange(65000)]
244 message = [randint(0,1) for _ in xrange(26000)]
246 x = [0, 0, 1, 0, 0, 1]
247 rho = [1 for _ in xrange(100)]
248 message = [0, 1, 0, 1]
252 (x_b,y,H_hat) = stc(x,rho,message)
253 print "message", message
260 # x_b est la sous partie de x qui va etre modifiee
261 # y est le vecteur des bits modifies
262 # H_hat est la sous-matrice retenue qui est embarquee dans H
264 print "avec stc :", nbdif(x_b,y)
265 print "sans stc :", nbdif(message,x[:len(message)])
271 message2 = [x%2 for x in prod(H_hat,len(message),y)]
272 print "messag2", message2
275 print equiv(message,message2)