n = 7494062703769887703668081866565274579333132167014632821313548612356114287792191446305040778987677683423969025588609780586722302041792065732461222120206217 x = 176589407974509728660827257088337183280645510941533692756437851307282715528543669659120503474533510718918949406280646936944629296899342927397139761503564 enc = [] x_inv=inverse(x,n) P.<d> = PolynomialRing(Zmod(n)) y0=enc[0]*x_inv % n f="1" for c in tqdm(enc[1:]): A=c*x_inv -y0% n
defbuild_system(L, c_list, l_list): T = len(c_list) A = [[0]*L for _ inrange(T)] b = [0]*T for i inrange(T): c = c_list[i] cbits = bit_list(c, L) wc = sum(cbits) b[i] = l_list[i] - wc for j inrange(L): coeff = 1 - 2*cbits[j] # 1 if cbit=0, -1 if cbit=1 idx = (j + i) % L # m 循环左移对应原始 m 的索引 A[i][idx] = coeff print(idx) return A, b
defsolve_ilp(A, b): T = len(A) L = len(A[0]) prob = LpProblem("m") m_vars = [LpVariable(f"m_{j}", cat=LpBinary) for j inrange(L)] for i inrange(T): prob += (lpSum(A[i][j]*m_vars[j] for j inrange(L)) == b[i]) prob.solve() return [int(v.varValue) for v in m_vars]
defbits_to_int(bits): x = 0 for b in bits: x = (x << 1) | b return x
defmain():
A, b = build_system(LENGTH, c_list, l_list) sol = solve_ilp(A, b) m_int = bits_to_int(sol) m_bytes = long_to_bytes(m_int) print("flag:", m_bytes)