n = 150624321883406825203208223877379141248303098639178939246561016555984711088281599451642401036059677788491845392145185508483430243280649179231349888108649766320961095732400297052274003269230704890949682836396267905946735114062399402918261536249386889450952744142006299684134049634061774475077472062182860181893 e = 65537 c = 22100249806368901850308057097325161014161983862106732664802709096245890583327581696071722502983688651296445646479399181285406901089342035005663657920475988887735917901540796773387868189853248394801754486142362158369380296905537947192318600838652772655597241004568815762683630267295160272813021037399506007505
from sage.all import * from Crypto.Util.number import long_to_bytes
# Given data e = 65537 p = 8147594556101158967571180945694180896742294483544853070485096002084187305007965554901340220135102394516080775084644243545680089670612459698730714507241869 B = Matrix(GF(p), [ [2155477851953408309667286450183162647077775173298899672730310990871751073331268840697064969968224381692698267285466913831393859280698670494293432275120170, 4113196339199671283644050914377933292797783829068402678379946926727565560805246629977929420627263995348168282358929186302526949449679561299204123214741547], [3652128051559825585352835887172797117251184204957364197630337114276860638429451378581133662832585442502338145987792778148110514594776496633267082169998598, 2475627430652911131017666156879485088601207383028954405788583206976605890994185119936790889665919339591067412273564551745588770370229650653217822472440992] ])
# Step 1: Compute eigenvalues of B tr_B = B.trace() det_B = B.det() print(f"Trace(B) = {tr_B}") print(f"Det(B) = {det_B}")
# Step 2: Compute e-th roots of eigenvalues (μ = λ^{1/e} mod p) d = inverse_mod(e, p-1) # Since p is prime, ϕ(p) = p-1 mu1 = pow(lambda1, d, p) mu2 = pow(lambda2, d, p) print(f"μ1 = {mu1}") print(f"μ2 = {mu2}")
# Step 3: Diagonalize B and reconstruct A # Find eigenvectors of B (columns of P) # Solve (B - λI)v = 0 def find_eigenvector(B, lambda_, p): M = B - diagonal_matrix([lambda_, lambda_]) # Find kernel (nullspace) ker = M.right_kernel() if ker.dimension() == 0: print("No eigenvector found!") exit() return ker.basis()[0]
from Crypto.Util.number import * import gmpy2 from sage.all import *
def small_roots(f, bounds, m=1, d=None): if not d: d = f.degree()
R = f.base_ring() N = R.cardinality()
f /= f.coefficients().pop(0) f = f.change_ring(ZZ)
G = Sequence([], f.parent()) for i in range(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)
factors = [monomial(*bounds) for monomial in monomials] for i, factor in enumerate(factors): B.rescale_col(i, factor)
B = B.dense_matrix().LLL()
B = B.change_ring(QQ) for i, factor in enumerate(factors): B.rescale_col(i, 1 / factor)
H = Sequence([], f.parent().change_ring(QQ)) for h in filter(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 []
# 给定参数 e = 1915595112993511209389477484497 n = 12058282950596489853905564906853910576358068658769384729579819801721022283769030646360180235232443948894906791062870193314816321865741998147649422414431603039299616924238070704766273248012723702232534461910351418959616424998310622248291946154911467931964165973880496792299684212854214808779137819098357856373383337861864983040851365040402759759347175336660743115085194245075677724908400670513472707204162448675189436121439485901172477676082718531655089758822272217352755724670977397896215535981617949681898003148122723643223872440304852939317937912373577272644460885574430666002498233608150431820264832747326321450951 c = 5408361909232088411927098437148101161537011991636129516591281515719880372902772811801912955227544956928232819204513431590526561344301881618680646725398384396780493500649993257687034790300731922993696656726802653808160527651979428360536351980573727547243033796256983447267916371027899350378727589926205722216229710593828255704443872984334145124355391164297338618851078271620401852146006797653957299047860900048265940437555113706268887718422744645438627302494160620008862694047022773311552492738928266138774813855752781598514642890074854185464896060598268009621985230517465300289580941739719020511078726263797913582399 hint = 10818795142327948869191775315599184514916408553660572070587057895748317442312635789407391509205135808872509326739583930473478654752295542349813847128992385262182771143444612586369461112374487380427668276692719788567075889405245844775441364204657098142930
if not roots: print("Failed to find small roots") exit()
dh, k = roots[0] print(f"Found roots: dh={dh}, k={k}")
# 计算 p temp = hint*2**180 + dh p = gcd(n, (e*temp - 1)//k + 1) if p == 1 or p == n: print("Failed to factor n") exit()
print(f"[+] p = {p}")
# 计算 q q = n // p print(f"[+] q = {q}")
# 计算私钥 d phi = (p-1)*(q-1) d = inverse_mod(e, phi)
# 解密 m = pow(c, d, n)
# 将整数转换为字节 try: flag = long_to_bytes(int(m)) print(f"[+] Flag: {flag.decode()}") except: print(f"[+] Potential flag (hex): {hex(int(m))}")
得到参数
1 2 3
dh = 65896927127248703649075923727600295339399985548824769 k = 324800176449536031183192318821 p = 97783500611645627628363615144874245627549896553481517603574634315501226729930389880172770040137063681263797751912201252509958779889945190533928725323930943229630615511472288612007184943613793256091687845325238049521808907664348233978943581917142000317506951466661992732144605135104306188100331104846791807313
from Crypto.Util.number import long_to_bytes from sage.all import *
# 已计算出的值 dh = 65896927127248703649075923727600295339399985548824769 k = 324800176449536031183192318821 p = 97783500611645627628363615144874245627549896553481517603574634315501226729930389880172770040137063681263797751912201252509958779889945190533928725323930943229630615511472288612007184943613793256091687845325238049521808907664348233978943581917142000317506951466661992732144605135104306188100331104846791807313
# 原始参数 n = 12058282950596489853905564906853910576358068658769384729579819801721022283769030646360180235232443948894906791062870193314816321865741998147649422414431603039299616924238070704766273248012723702232534461910351418959616424998310622248291946154911467931964165973880496792299684212854214808779137819098357856373383337861864983040851365040402759759347175336660743115085194245075677724908400670513472707204162448675189436121439485901172477676082718531655089758822272217352755724670977397896215535981617949681898003148122723643223872440304852939317937912373577272644460885574430666002498233608150431820264832747326321450951 e = 1915595112993511209389477484497 c = 5408361909232088411927098437148101161537011991636129516591281515719880372902772811801912955227544956928232819204513431590526561344301881618680646725398384396780493500649993257687034790300731922993696656726802653808160527651979428360536351980573727547243033796256983447267916371027899350378727589926205722216229710593828255704443872984334145124355391164297338618851078271620401852146006797653957299047860900048265940437555113706268887718422744645438627302494160620008862694047022773311552492738928266138774813855752781598514642890074854185464896060598268009621985230517465300289580941739719020511078726263797913582399
# 计算q q = n // p print(f"[+] q = {q}")
# 验证p*q是否等于n assert p * q == n, "Factorization failed!"
# 计算φ(n) phi = (p-1)*(q-1)
# 计算私钥d try: d = inverse_mod(e, phi) print(f"[+] d = {d}") except: print("Failed to compute private key") exit()