p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073 q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451 c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057
#最终解决方法: from Crypto.Util.number import long_to_bytes, inverse e = 65537 n = p * q t = (p - 1) * (q - 1) d = inverse(e, t) m = pow(c, d, n)
flag = long_to_bytes(m) print(flag.decode())
· 来源:spc学长xc
题目提示:大数N的分解
题目:
from Crypto.Util.number import * from gmpy2 import * from serct import flag p = getPrime(512) q = getPrime(512) n = p*q m = bytes_to_long(flag) e = 65537 c = powmod(m, e, n)#加密结果 print(n) print(c)
from Crypto.Util.number import * from gmpy2 import *
n = 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153 c = 48757373363225981717076130816529380470563968650367175499612268073517990636849798038662283440350470812898424299904371831068541394247432423751879457624606194334196130444478878533092854342610288522236409554286954091860638388043037601371807379269588474814290382239910358697485110591812060488786552463208464541069 e = 65537
p = 72224896773450610791657349018700642791668283264384520670702825479122904864127 q = 72224896773450610791657349018700642791668283264384520670702825479122904864239
assert p * q == n #校验等式是否成立
phi = (p - 1) * (q - 1)#欧拉函数 d = invert(e, phi)#e*d≡1mod phi m = pow(c, d, n) print(long_to_bytes(m))
e = getPrime(64) # 生成一个 64 bit 的随机素数 e,用作 RSA 公钥指数。
a_big_prime = getPrime( 512 ) # 再生成一个 512 bit 的随机素数,起名叫 `a_big_prime`。 # 注意:这个名字有误导性,它并不是 RSA 模数 N 的因子,只是额外生成的一个素数,用来产生另一条“hint”(?什么鬼
hint = pow(a_big_prime,e,2**512) #计算 # pow(a,b,c)=(a^b)%c # 在 CTF 语境里,这往往暗示“partial key exposure”——低 512 位泄漏 # 攻击者可用 Coppersmith/Howgrave-Graham lattice 方法恢复完整私钥。 # 不过本题真正解密不需要它,因为 e 很小且 n 的因子我们已能求出。
print( "the big prime is: " , a_big_prime ) print( "hint is:" , hint )
n = p*q*r # 构造一个 3 素数 RSA 模数 n,长度 3×512 = 1536 bit。 c = pow( m , e , n ) print( "c=" , c ) # 输出密文 c
''' hint_of_pqr= 26205997351166240405785097231436009350807507606268828636742615246287109077466822241186639293389573242216311668227098054599788791116215571416316140409352427 66860315641471130491119218972922785980480599406983109647358601581641695642878472456945137024883369147959034865118793676633880997281324220353834323524635144 213473629205254382083617791480463504155040467378518856042962121442859026373709762896295778597714884481459316375098621436229734548467857563069831689551454946 the big prime is: 11557301053448817361014126921662226367639845395602185765021724910056663884113570410496382266851427507275779260616871464855286322325118092388982283547918921 hint is: 10271913433365953528187318472631779008104540530202414129752768330046395509900224800993688431964630907432047820727638055487310601524087956924122431108238505 c= 116569284047193403361251336983936346094224289856857789287062750599584928427772025697885153355908857327470083147465892652988245017837819503727301904206404536314951181113506280048949514352483259762138034268916332027429633274027588317302925270485836816591363962835119659624022139707163858477460375467148571163549410771927644341667962740112294140641187548649921303016157469076294782957230926056116058301134087751871726212821846406513780951057663400249479830993970711 '''
自己解出来了但方法过于复杂,无参考价值,所以只保留学长wp作为存档。
from Cryptodome.Util.number import long_to_bytes as l2b import sympy
h1 = 26205997351166240405785097231436009350807507606268828636742615246287109077466822241186639293389573242216311668227098054599788791116215571416316140409352427 h2 = 66860315641471130491119218972922785980480599406983109647358601581641695642878472456945137024883369147959034865118793676633880997281324220353834323524635144 h3 = 213473629205254382083617791480463504155040467378518856042962121442859026373709762896295778597714884481459316375098621436229734548467857563069831689551454946 a_big_prime = 11557301053448817361014126921662226367639845395602185765021724910056663884113570410496382266851427507275779260616871464855286322325118092388982283547918921 hint = 10271913433365953528187318472631779008104540530202414129752768330046395509900224800993688431964630907432047820727638055487310601524087956924122431108238505 c= 116569284047193403361251336983936346094224289856857789287062750599584928427772025697885153355908857327470083147465892652988245017837819503727301904206404536314951181113506280048949514352483259762138034268916332027429633274027588317302925270485836816591363962835119659624022139707163858477460375467148571163549410771927644341667962740112294140641187548649921303016157469076294782957230926056116058301134087751871726212821846406513780951057663400249479830993970711 #解方程 p = 3*h1 - h2 r = (9*h1 - h3)//3 q = h1 - p -r
#解e e = sympy.discrete_log(2**512,hint,a_big_prime)
#rsa算法 n = p*q*r fain = (p-1)*(q-1)*(r-1) d = pow(e,-1,fain) m = pow(c,d,n) print(l2b(m))