0%

因为你不会,所以你才会

2024-07-29 02:45By
ZMJ4396
CRYPTO

Problem: [Imaginary CTF 2024]pacap

[[toc]]

思路

手动挡 coppersmith

至于为什么最后一行除以模是一个小整数的那么多次方,我他妈也不知道,试出来的

EXP

from params import * from Crypto.Util.number import * import itertools from tqdm import trange N, e = pubkey x, y, z = enc ''' c * v^3 = (1 - u^3) * v^6 v^6 * x^3 + c* v^6 * y^3 + c^2*v^6*z^3 - 3*c*x*y*z*v^6 - v^6 v^6 * x^3 + (1-u^3)*v^3*y^3 + (1-u^3)^2 * z^3 - 3*x*y*z*v^3*(1-u^3) - v^6 denote u' = 1 - u^3, v' = v^3 u, v small u^3, v^3 small 1 - u^3 small A u^2 + B u v + C v^2 ''' A = z^3 B = y^3 - 3 * x * y * z C = x^3 - 1 t = 5 l = len(flag) PR.<u, v> = PolynomialRing(ZZ) f = A * u^2 + B * u * v + C * v^2 M = N^t monomials = [u^i *v^(2*t-i) for i in range(2*t+1)] L = [] for i in range(t + 1): prod_pow = t - i for j in range(2 * prod_pow+1): k = 2 * prod_pow - j f_ = f^i * u^j * v^k * N^prod_pow Li = [] for monomial_index in range(2*t+1): Li.append(f_.coefficient({u: monomial_index, v: 2*t-monomial_index})) L.append(Li) def show_lattice(L): M = [] for i in range(L.nrows()): Mi = [] for j in range(L.ncols()): Mi.append('X0'[L[i, j] == 0]) M.append(' '.join(Mi)) M = '\n'.join(M) print(M) L = matrix(ZZ, L) show_lattice(L) L_ = L.LLL() coeff_ = L_[0] print() show_lattice(L_) flist = [] for coeff_ in L_[-(2*t+1):]: # build f = sum([coeff_[i] * monomials[i] for i in range(2*t+1)]) if f != 0: flist.append(f.change_ring(QQ)) for i in trange(1, 30): for si in [-1, 1]: # Monkey patch flist_ = [f for f in flist] flist_[-1] += si * i^(2*t) * M V = Ideal(flist_).variety() for sol_ in V: u_, v_ = sol_[u], sol_[v] try: u_ = (1 - u_).nth_root(3) v_ = v_.nth_root(3) msg = long_to_bytes(int(u_)) + long_to_bytes(int(v_)) print(msg) print(len(msg)) except: pass

总结

一下子就……

还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

加载失败
广告
×
评论区
添加新评论