from Crypto.Util.number import * from sage.allimport * from functools import reduce
defxor(a,b): return a^b
defright_reduce(a,b): return reduce(xor,[ a[i]&b[i] for i inrange(len(a))])
mask = '1010010000001000000010001001010010100100000010000000100010010100' xor_output = '00100110001000110001101010101001001' and_output = '01111101111010111000010010111001101' message = '' #可以证明,message的前34位就是xor_output的1-34位 for i inrange(1,35): message += str(int(xor_output[i]))
and_output=and_output[:-5] #矩阵方程等号左边系数矩阵 r_and=[int(i) for i in and_output] r_xor=[int(i) for i in xor_output[1:35]] A = [int(i) for i in mask[34:]] AA = [] for i inrange(30): A = [int(i) for i in mask[(34-i):(64-i)]] AA.append(A) print(AA) AA=matrix(GF(2),AA)
r = [] for i inrange(30): a = [r_xor[j] for j inrange(i,34)] b = [int(mask[k]) for k inrange(0,34-i)] if i == 0: c = [0] d = [0] else: c = [r_and[l] for l inrange(0,i)] d = [int(mask[p]) for p inrange(63,63-i,-1)] r.append(right_reduce(a,b) ^ right_reduce(c,d) ^ r_and[i])
rr = vector(GF(2),r) print(rr) ans = AA.solve_right(rr) print(ans)
ans = list(ans) low_bit = '' for i in ans: low_bit += str(i) message = message + low_bit print(long_to_bytes(int(message,2))) #LF5Rsuk!