from Crypto.Util.number import * import string #爆破
n = c_list = ans = '' for i inrange(len(c_list)): for j in string.printable: ifpow(ord(j), e, n) == c_list[i]: print(f"Found char: {j}") ans += j break print(ans)
#中国剩余定理 from Crypto.Util.number import * import gmpy2
n_list=[...] c_list=[...] e =
n = 1 n_list_2 = [] n_list_2_inv = [] for i in n_list: n *= i for i in n_list: tmp = n // i tmp_inv = inverse(tmp,i) n_list_2.append(tmp) n_list_2_inv.append(tmp_inv) c = 0 for i inrange(len(c_list)): c += c_list[i]*n_list_2[i]*n_list_2_inv[i] % n c = c % n
m = gmpy2.iroot(c,e)[0] ''' for k in range(1000) #自定义爆破k的范围 c = c + k*n t = gmpy2.iroot(c,e) if t[1]: m = t[0] ''' ans = long_to_bytes(m) print(ans)
defwiener(N:int, e:int, debug = True): N = Integer(N) e = Integer(e) cf = (e / N).continued_fraction().convergents() for f in cf: k = f.numer() d = f.denom() if k == 0or d == 0: continue if (e*d - 1) % k != 0: continue phi = (e*d - 1) // k s = n + 1 - phi # p + q D = s^2 - 4*n if D < 0: continue sqrt_D = sqrt(D) ifnot sqrt_D.is_integer(): continue p = (s + sqrt_D)/2 q = (s - sqrt_D)/2 if p.is_integer() and q.is_integer(): p, q = ZZ(p), ZZ(q) if p*q == n: d = inverse_mod(e, (p-1)*(q-1)) m = pow(c, d, n) print("Decrypted flag:", long_to_bytes(int(m))) break
p = p_bar + x*mod_num #因为低位以及知道,x是中间的数,因此向左移265位 p = p.monic() #转换成首一多项式,small_roots只能处理首一多项式 print(i) roots = p.small_roots(X = 2^kbits,beta = 0.4) if roots: p = p_bar + int(roots[0])*mod_num print(p) if n%p == 0: q = n // p phi = (p-1)*(q-1) d = inverse(e,phi) m = pow(c,d,n) ans = long_to_bytes(m) print(ans)
from Crypto.Util.number import * import gmpy2 import itertools
defsmall_roots(f, bounds, m=1, d=None): ifnot d: d = f.degree() print(d) R = f.base_ring() N = R.cardinality() f /= f.coefficients().pop(0) f = f.change_ring(ZZ) G = Sequence([], f.parent()) for i inrange(m + 1): base = N ^ (m - i) * f ^ i for shifts in itertools.product(range(d), repeat=f.nvariables()): g = base * prod(map(power, f.variables(), shifts)) G.append(g) B, monomials = G.coefficient_matrix() monomials = vector(monomials) factors = [monomial(*bounds) for monomial in monomials] for i, factor inenumerate(factors): B.rescale_col(i, factor) B = B.dense_matrix().LLL() B = B.change_ring(QQ) for i, factor inenumerate(factors): B.rescale_col(i, 1 / factor) H = Sequence([], f.parent().change_ring(QQ)) for h infilter(None, B * monomials): H.append(h) I = H.ideal() if I.dimension() == -1: H.pop() elif I.dimension() == 0: roots = [] for root in I.variety(ring=ZZ): root = tuple(R(root[var]) for var in f.variables()) roots.append(root) return roots return []
n = c = e = #hint=dp >> kbits hint = kbits = leak = hint << kbits
R.<x,y> = PolynomialRing(Zmod(n)) f = e * (leak + x) + (y - 1) res = small_roots(f,(2^kbits,2^kbits),m=1,d=4) #求不出时调整m,d的参数值 for root in res: print(root) dp_low = root[0] dp = leak + dp_low tmp = pow(2,e*dp,n) - 2 p = gmpy2.gcd(tmp,n) q = n // p d = inverse(e,(p-1)*(q-1)) m = pow(c,d,n) print(long_to_bytes(m))