from Crypto.Util.number import * flag = b'paluctf{******************}' p = getPrime(512) q = getPrime(512) m = bytes_to_long(flag) n = p * q e = 0x10001 c = pow(m, e, n) leak1 = p & q leak2 = p | q print(n) print(leak1) print(leak2) print(c) # 116117067844956812459549519789301338092862193317140117457423221066709482979351921356314593636327834899992321545232613626111009441254302384449742843180876494341637589103640217194070886174972452908589438599697165869525189266606983974250478298162924187424655566019487631330678770727392051485223152309309085945253 # 8605081049583982438298440507920076587069196185463800658188799677857096281403951362058424551032224336538547998962815392172493849395335237855201439663804417 # 13407373154151815187508645556332614349998109820361387104317659096666170318961881115942116046384020162789239054091769561534320831478500568385569270082820389 # 77391898018025866504652357285886871686506090492775075964856060726697268476460193878086905273672532025686191143120456958000415501059102146339274402932542049355257662649758904431953601814453558068056853653214769669690930883469679763807974430229116956128100328073573783801082618261383412539474900566590518020658
for i inrange(n.bit_length()//kbits): if n%(pbar+i) == 0: p =pbar+i q = n//p print("[+] p =",p) print("[+] q =",q) break
(更好套一点,原博客的别的题不能直接套)
例题
DASCTF 2023 & 0X401七月暑期挑战赛 ezRSA
from Crypto.Util.number import * from secret import secret, flag defencrypt(m): returnpow(m, e, n) assert flag == b"dasctf{" + secret + b"}" e = 11 p = getPrime(512) q = getPrime(512) n = p * q P = getPrime(512) Q = getPrime(512) N = P * Q gift = P ^ (Q >> 16) print(N, gift, pow(n, e, N)) print(encrypt(bytes_to_long(secret)), encrypt(bytes_to_long(flag)))
N = 75000029602085996700582008490482326525611947919932949726582734167668021800854674616074297109962078048435714672088452939300776268788888016125632084529419230038436738761550906906671010312930801751000022200360857089338231002088730471277277319253053479367509575754258003761447489654232217266317081318035524086377 gift = 8006730615575401350470175601463518481685396114003290299131469001242636369747855817476589805833427855228149768949773065563676033514362512835553274555294034 c1 = 14183763184495367653522884147951054630177015952745593358354098952173965560488104213517563098676028516541915855754066719475487503348914181674929072472238449853082118064823835322313680705889432313419976738694317594843046001448855575986413338142129464525633835911168202553914150009081557835620953018542067857943 c2 = 69307306970629523181683439240748426263979206546157895088924929426911355406769672385984829784804673821643976780928024209092360092670457978154309402591145689825571209515868435608753923870043647892816574684663993415796465074027369407799009929334083395577490711236614662941070610575313972839165233651342137645009 c3 = 46997465834324781573963709865566777091686340553483507705539161842460528999282057880362259416654012854237739527277448599755805614622531827257136959664035098209206110290879482726083191005164961200125296999449598766201435057091624225218351537278712880859703730566080874333989361396420522357001928540408351500991
for i inrange(N.bit_length()//kbits): if N%(pbar+i) == 0: p =pbar+i q = N//p d=gmpy2.invert(e,(p-1)*(q-1)) print("n=",pow(c1,d,N)) break #n= 8410363083727227985204019150296233995423906412694890252698371563789022268553444336554986979907257458547381598181369620318848637391220240378808211998052306324620364339595355706922325759625785590466818309839146408927226283350419069859849879835884942537531811470537915106995685907400782213608736735862576031042
defGCD(a,b): if b == 0: return a.monic() else: return GCD(b,a % b) PR.<x> = PolynomialRing(Zmod(n)) for i inrange(50): f1 = x ^ 11 - c2 f2 = (bytes_to_long(b'dasctf{' + b'\x00' * i + b'}') + 256 * x) ^ 11 - c3 if GCD(f1,f2)[0] != 1: print(long_to_bytes(int(n - GCD(f1,f2)[0]))) #b'C0pper_Sm1th_Mak3s_T1ng5_Bet4er'
nextprime剪枝
类似于这题
from sympy import * from Crypto.Util.number import * from secret import flag
defgen(): p = getPrime(512) q = nextprime(int(str(p)[::-1])) a = p&(10**6) b = q%(10**6) return p, q, a, b
p, q, a, b = gen() n = p * q e = 65537 c = pow(flag, e, n)
print('a =', a) print('b =', b) print('n =', n) print('c =', c)
''' a = 393792 b = 657587 n = 369861662178631957928245949770898273807810914183024109983427665445735262653137205864716795669578458854257293391751966280054435051199001813062804877555180285022533020724584142987601931508644551710279816508694942797383860411279321090090880184911983657558416043011288974643282183209071299542379616927857228873411 c = 71672159337725868237152385281240906653912972455699529924728534161923598107229667985188160316648005550663968313537597184857765083556920840254397949219027087098695062021613177519248117588571374167137534818793726427056016629301262986053118989821488864074425276527050110912787300008659230186841168308795745942580 '''
#条件三 mask = 10**len(pl) if(int(ql)*int(pl) % mask != n % mask): return for i inrange(10): if(n % int(ph+str(i)+pl) == 0): p = int(ph+str(i)+pl) q = n // p dec(p,q,c,n) exit()
#search for i inrange(10): for j inrange(10): find(ph + str(i), qh + str(j), str(j) + pl, str(i) + ql)