CTF-RSA 技巧总结
1.直接给出p,q
e = 65537
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194
解法:
考察RSA的基本概念,以及gmpy2库函数的基本应用。
import gmpy2
import binascii
p=gmpy2.mpz(104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179)
q=gmpy2.mpz(140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501)
c=gmpy2.mpz(4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194)
n=p*q
e=65537
d=gmpy2.invert(e,(p-1)*(q-1))
m=pow(c,d,n)
print(binascii.unhexlify(hex(m)[2:]))
2.n可以被分解
e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009
解法:
采用factordb网站对n进行分解。得到以下结果:
p=1201147059438530786835365194567
q=1212112637077862917192191913841
import gmpy2
import binascii
e=65537
p=gmpy2.mpz(1201147059438530786835365194567)
q=gmpy2.mpz(1212112637077862917192191913841)
c=gmpy2.mpz(69380371057914246192606760686152233225659503366319332065009)
d=gmpy2.invert(e,(p-1)*(q-1))
m=pow(c,d,p*q)
print(binascii.unhexlify(hex(m)[2:]))
3.采用相同公钥
e = 65537
n = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815
e = 65537
n = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062
解法:
这里给出了两组数据, n 1 n_1 n1, c 1 c_1 c1, n 2 n_2 n2, c 2 c_2 c2,同时发现两条性质
- n 1 n_1 n1, n 2 n_2 n2不互素
- 两组数据公钥e相同
根据性质1:
n 1 n_1 n1= p 1 p_1 p1* q 1 q_1 q1
n 2 n_2 n2= p 2 p_2 p2* q 2 q_2 q2
因为 n 1 n_1 n1与 n 2 n_2 n2不互素,因此存在一个p=gcd( n 1 n_1 n1, n 2 n_2 n2),我们可以求得 n 1 n_1 n1, n 2 n_2 n2的最大公约数作为p,进而求解q,可以破译RSA
import gmpy2
import binascii
e=65537
n1=gmpy2.mpz(23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747)
c1=gmpy2.mpz(1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815)
n2=gmpy2.mpz(22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711)
c2=gmpy2.mpz(2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062)
p=gmpy2.gcd(n1,n2)
q1=n1//p
d1=gmpy2.invert(e,(p-1)*(q1-1))
m1=pow(c1,d1,n1)
print(binascii.unhexlify(hex(m1)[2:]))
4.共模数攻击
e = 797
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930
e = 521
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849
解法:
观察到两组数据当中的n是相同的,使用了相同的模数n,用不同的秘钥e加密同一信息m,考虑使用共模数攻击。
基本原理:
c
1
=
m
e
1
m
o
d
(
n
)
c
2
=
m
e
2
m
o
d
(
n
)
c_1=m^{e_1}mod(n)\\ c_2=m^{e_2}mod(n)
c1=me1mod(n)c2=me2mod(n)
同时,对于互素的
e
1
e_1
e1,
e
2
e_2
e2,根据扩展欧几里得定理
e
1
e_1
e1
s
1
s_1
s1+
e
2
e_2
e2
s
2
s_2
s2=gcd(
e
1
e_1
e1,
e
2
e_2
e2)=1
(
m
e
1
)
s
1
∗
(
m
e
2
)
s
2
=
(
m
)
e
1
∗
s
1
+
e
2
∗
s
2
=
m
1
=
c
1
s
1
∗
c
2
s
2
{(m^{e_1})}^{s_1}*{(m^{e_2})}^{s_2}={(m)}^{e_1*s_1+e_2*s_2}=m^1={c_1}^{s_1}*{c_2}^{s_2}
(me1)s1∗(me2)s2=(m)e1∗s1+e2∗s2=m1=c1s1∗c2s2
因此,我们可以利用扩展欧几里得求得 s 1 s_1 s1, s 2 s_2 s2,然后计算 c 1 s 1 ∗ c 2 s 2 {c_1}^{s_1}*{c_2}^{s_2} c1s1∗c2s2得到答案
import gmpy2
import binascii
n=gmpy2.mpz(15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571)
c1=gmpy2.mpz(11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930)
c2=gmpy2.mpz(6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849)
e1=797
e2=521
s=gmpy2.gcdext(e1,e2)
m1=pow(c1,s[1],n)
m2=pow(c2,s[2],n)
m=(m1*m2)%n
print(binascii.unhexlify(hex(m)[2:]))
5.低加密指数攻击
e = 3
n = 18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661
解答:
观察到公钥e非常小,考虑使用低加密指数攻击的方法
基本原理:
c
=
m
e
m
o
d
(
n
)
c=m^e mod(n)
c=memod(n)
因此,
m
e
=
k
∗
n
+
c
m^e=k*n+c
me=k∗n+c
因此可以遍历k,使得m是一个整数即可得到答案
import gmpy2
import binascii
n=gmpy2.mpz(18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761)
e=3
c=gmpy2.mpz(150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661)
k=0
while True:
res=gmpy2.iroot(k*n+c,e)
if(res[1]==True):
print(binascii.unhexlify(hex(res[0])[2:]))
break
k+=1
6.低解密指数攻击(维纳攻击)
e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827
解法:
连分数分解, e d m o d p h i = 1 ed\ mod\ phi=1 ed mod phi=1,即 e d = k ∗ p h i + 1 ed\ =\ k*phi+1 ed = k∗phi+1,进一步 e d ≈ k ∗ p h i ed\approx k*phi ed≈k∗phi
因为 n n n比较大,所以 p h i ≈ n phi \approx n phi≈n
由条件进一步可得: e d ≈ k n , e / n ≈ k / d ed \approx kn,e/n \approx k/d ed≈kn,e/n≈k/d
e / n e/n e/n分解中的各阶段的连分数中可以有一个能够满足条件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sy5CGyAF-1675655590843)(file:///C:\Users\26520\AppData\Roaming\Tencent\Users\2652040808\TIM\WinTemp\RichOle\B$S5UTYL(I5JJ}O@(M{)]7K.png)
from Crypto.Util.number import *
from gmpy2 import *
# wiener attack连分数攻击 e较大
def gen_con(x,y):
q=[]
while y:
q.append(x//y)
x,y=y,x%y
return q
def gen_frac(q):
x,y=0,1
for qi in q[::-1]:
x,y=y,x+qi*y
return (x,y)
def solve_force(q):
fs=[]
for i in range(1,len(q)):
fs.append(gen_frac(q[:i]))
return fs
def solve_p_q(n,phi):
# 已知 n,phi求p,q
'''
已知phi=(p-q)(q-1)=p*q-q-p+1
已知n=pq
推出x=p+q=n-phi+1
设y=(p-q)^2=(p+q)^2-4pq
设z=q-p=sqrt(y)
则q=(x+z)//2
则p=(x-z)//2
return p,q
'''
x=n-phi+1
y=x*x-4*n
z=iroot(y,2)[0]
q=(x+z)//2
p=(x-z)//2
# assert(p*q==n)
# assert((p-1)*(q-1)==phi)
return p,q
def wiener_attack(e,n):
q=gen_con(e,n)
phi=[]
for (di,ki) in solve_force(q):
if di!=0 and ki!=0:
# phi=(ed-1)//k
p,q=solve_p_q(n,(e*di-1)//ki)
if p*q==n:
return p,q
e = 14058695417015334071588010346586749790539913287499707802938898719199384604316115908373997739604466972535533733290829894940306314501336291780396644520926473
n = 33608051123287760315508423639768587307044110783252538766412788814888567164438282747809126528707329215122915093543085008547092423658991866313471837522758159
p,q=wiener_attack(e,n)
print(p)
print(q)
7.低解密指数攻击变形(【羊城杯2022RRRRRRRRRRSA】)
8.p,q很接近(费马分解)
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-11 13:46:24
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 13:46:32
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
# D0_U_kn0w_wh4t_1s_double_p_q?
from Crypto.Util.number import *
import gmpy2
from secret import flag
m = bytes_to_long(flag)
p1 = getPrime(256)
p2 = gmpy2.next_prime(p1)
q1 = getPrime(256)
q2 = gmpy2.next_prime(q1)
n = p1*p2*q1*q2
e = 65537
c = pow(m, e, n)
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
'''
n = 32481415283829255738340971974996440308678927230347135108620374939715138530763511922162670183907243606574444169915409791604348383760619870966025875897723568019791384873824917630615306169399783499416450554084947937964622799112489092007113967359069561646966430880857626323529067736582503070705981530002918845439
e = 65537
c = 13000287388412632836037240605681731720629565122285665653580432791960428695510699983959843546876647788034949392762752577597448919397451077080119543495058705350347758604475392673242110787093172219487592930482799866421316089027633497253411081184454114601840835490688775466505809830410778091437211186254631834255
'''
解法:
由题意知, p 1 p_1 p1和 p 2 p_2 p2比较接近。同理, q 1 q_1 q1和 q 2 q_2 q2也比较接近。
又因为 n = p 1 ∗ p 2 ∗ q 1 ∗ q 2 n=p_1*p_2*q_1*q_2 n=p1∗p2∗q1∗q2
即 n = ( p 1 ∗ q 2 ) ∗ ( q 1 ∗ p 2 ) n=(p_1*q_2)*(q_1*p_2) n=(p1∗q2)∗(q1∗p2)
n = ( p 1 ∗ q 1 ) ∗ ( q 2 ∗ p 2 ) n=(p_1*q_1)*(q_2*p_2) n=(p1∗q1)∗(q2∗p2)
1.分解n
import gmpy2
import binascii
n = 32481415283829255738340971974996440308678927230347135108620374939715138530763511922162670183907243606574444169915409791604348383760619870966025875897723568019791384873824917630615306169399783499416450554084947937964622799112489092007113967359069561646966430880857626323529067736582503070705981530002918845439
e = 65537
c = 13000287388412632836037240605681731720629565122285665653580432791960428695510699983959843546876647788034949392762752577597448919397451077080119543495058705350347758604475392673242110787093172219487592930482799866421316089027633497253411081184454114601840835490688775466505809830410778091437211186254631834255
#p=a+b,q=a-b,n=a^2-b^2
ans=[]
a=gmpy2.iroot(n,2)[0]+1
while True:
b2=a*a-n
#print(gmpy2.iroot(b2,2)[0])
if gmpy2.iroot(b2,2)[1]==True:
b=gmpy2.iroot(b2,2)[0]
ans.append([a+b,a-b])
a+=1
if len(ans)==2:
print(ans)
break
[[mpz(5699246904971678425935835978967730683053746753322705895180191447969728265035020472266992407975855125072633444384093225307109561110398055672642726431721163), mpz(5699246904971678425935835978967730683053746753322705895180191447969728265025247276681778627531476656173207631026907020540308151842202933710872179910202653)], [mpz(5699246904971678425935835978967730683053746753322705895180191447969728265036160979353775677974812804022929074658237963921179583021255070041703347394990169), mpz(5699246904971678425935835978967730683053746753322705895180191447969728265024106769594995357532518977222912000752762281926238129931345919341811558946935831)]]
x1=ans[0][0] #p1*q2
y1=ans[0][1] #q1*p2
x2=ans[1][0] #p1*q1
y2=ans[1][1] #q2*p2
p1=gcd(x1,x2)
q1=x2//p1
p2=gcd(y1,y2)
q2=y2//p2
完整脚本
import gmpy2
import binascii
n = 32481415283829255738340971974996440308678927230347135108620374939715138530763511922162670183907243606574444169915409791604348383760619870966025875897723568019791384873824917630615306169399783499416450554084947937964622799112489092007113967359069561646966430880857626323529067736582503070705981530002918845439
e = 65537
c = 13000287388412632836037240605681731720629565122285665653580432791960428695510699983959843546876647788034949392762752577597448919397451077080119543495058705350347758604475392673242110787093172219487592930482799866421316089027633497253411081184454114601840835490688775466505809830410778091437211186254631834255
#p=a+b,q=a-b,n=a^2-b^2
ans=[]
a=gmpy2.iroot(n,2)[0]+1
while True:
b2=a*a-n
#print(gmpy2.iroot(b2,2)[0])
if gmpy2.iroot(b2,2)[1]==True:
b=gmpy2.iroot(b2,2)[0]
ans.append([a+b,a-b])
a+=1
if len(ans)==2:
#print(ans)
break
x1=ans[0][0]
y1=ans[0][1]
x2=ans[1][0]
y2=ans[1][1]
p1=gmpy2.gcd(x1,x2)
q1=x2//p1
p2=gmpy2.gcd(y1,y2)
q2=y2//p2
phi=(p1-1)*(q1-1)*(p2-1)*(q2-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,p1*q1*p2*q2)
print(binascii.unhexlify(hex(m)[2:]))
8.Square Eyes
题意
It was taking forever to get a 2048 bit prime, so I just generated one and used it twice.
n = 535860808044009550029177135708168016201451343147313565371014459027743491739422885443084705720731409713775527993719682583669164873806842043288439828071789970694759080842162253955259590552283047728782812946845160334801782088068154453021936721710269050985805054692096738777321796153384024897615594493453068138341203673749514094546000253631902991617197847584519694152122765406982133526594928685232381934742152195861380221224370858128736975959176861651044370378539093990198336298572944512738570839396588590096813217791191895941380464803377602779240663133834952329316862399581950590588006371221334128215409197603236942597674756728212232134056562716399155080108881105952768189193728827484667349378091100068224404684701674782399200373192433062767622841264055426035349769018117299620554803902490432339600566432246795818167460916180647394169157647245603555692735630862148715428791242764799469896924753470539857080767170052783918273180304835318388177089674231640910337743789750979216202573226794240332797892868276309400253925932223895530714169648116569013581643192341931800785254715083294526325980247219218364118877864892068185905587410977152737936310734712276956663192182487672474651103240004173381041237906849437490609652395748868434296753449
e = 65537
ct = 222502885974182429500948389840563415291534726891354573907329512556439632810921927905220486727807436668035929302442754225952786602492250448020341217733646472982286222338860566076161977786095675944552232391481278782019346283900959677167026636830252067048759720251671811058647569724495547940966885025629807079171218371644528053562232396674283745310132242492367274184667845174514466834132589971388067076980563188513333661165819462428837210575342101036356974189393390097403614434491507672459254969638032776897417674577487775755539964915035731988499983726435005007850876000232292458554577437739427313453671492956668188219600633325930981748162455965093222648173134777571527681591366164711307355510889316052064146089646772869610726671696699221157985834325663661400034831442431209123478778078255846830522226390964119818784903330200488705212765569163495571851459355520398928214206285080883954881888668509262455490889283862560453598662919522224935145694435885396500780651530829377030371611921181207362217397805303962112100190783763061909945889717878397740711340114311597934724670601992737526668932871436226135393872881664511222789565256059138002651403875484920711316522536260604255269532161594824301047729082877262812899724246757871448545439896
解法:
分解n,发现n是一个素数的平方
n = p 2 n=p^2 n=p2
p h i = n ∗ ( 1 / p ) = n − p phi=n*(1/p)=n-p phi=n∗(1/p)=n−p
代码:
from Crypto.Util import *
from gmpy2 import *
import binascii
n = 535860808044009550029177135708168016201451343147313565371014459027743491739422885443084705720731409713775527993719682583669164873806842043288439828071789970694759080842162253955259590552283047728782812946845160334801782088068154453021936721710269050985805054692096738777321796153384024897615594493453068138341203673749514094546000253631902991617197847584519694152122765406982133526594928685232381934742152195861380221224370858128736975959176861651044370378539093990198336298572944512738570839396588590096813217791191895941380464803377602779240663133834952329316862399581950590588006371221334128215409197603236942597674756728212232134056562716399155080108881105952768189193728827484667349378091100068224404684701674782399200373192433062767622841264055426035349769018117299620554803902490432339600566432246795818167460916180647394169157647245603555692735630862148715428791242764799469896924753470539857080767170052783918273180304835318388177089674231640910337743789750979216202573226794240332797892868276309400253925932223895530714169648116569013581643192341931800785254715083294526325980247219218364118877864892068185905587410977152737936310734712276956663192182487672474651103240004173381041237906849437490609652395748868434296753449
e = 65537
ct = 222502885974182429500948389840563415291534726891354573907329512556439632810921927905220486727807436668035929302442754225952786602492250448020341217733646472982286222338860566076161977786095675944552232391481278782019346283900959677167026636830252067048759720251671811058647569724495547940966885025629807079171218371644528053562232396674283745310132242492367274184667845174514466834132589971388067076980563188513333661165819462428837210575342101036356974189393390097403614434491507672459254969638032776897417674577487775755539964915035731988499983726435005007850876000232292458554577437739427313453671492956668188219600633325930981748162455965093222648173134777571527681591366164711307355510889316052064146089646772869610726671696699221157985834325663661400034831442431209123478778078255846830522226390964119818784903330200488705212765569163495571851459355520398928214206285080883954881888668509262455490889283862560453598662919522224935145694435885396500780651530829377030371611921181207362217397805303962112100190783763061909945889717878397740711340114311597934724670601992737526668932871436226135393872881664511222789565256059138002651403875484920711316522536260604255269532161594824301047729082877262812899724246757871448545439896
p=23148667521998097720857168827790771337662483716348435477360567409355026169165934446949809664595523770853897203103759106983985113264049057416908191166720008503275951625738975666019029172377653170602440373579593292576530667773951407647222757756437867216095193174201323278896027294517792607881861855264600525772460745259440301156930943255240915685718552334192230264780355799179037816026330705422484000086542362084006958158550346395941862383925942033730030004606360308379776255436206440529441711859246811586652746028418496020145441513037535475380962562108920699929022900677901988508936509354385660735694568216631382653107
phi=p*(p-1)
d=invert(e,phi)
m=pow(ct,d,n)
print(binascii.unhexlify(hex(m)[2:]))
#crypto{squar3_r00t_i5_f4st3r_th4n_f4ct0r1ng!}
9.Crossed Wires
题意
I asked my friends to encrypt our secret flag before sending it to me, but instead of using my key, they've all used their own! Can you help?
from Crypto.Util.number import getPrime, long_to_bytes, bytes_to_long, inverse
import math
from gmpy2 import next_prime
FLAG = b"crypto{????????????????????????????????????????????????}"
p = getPrime(1024)
q = getPrime(1024)
N = p*q
phi = (p-1)*(q-1)
e = 0x10001
d = inverse(e, phi)
my_key = (N, d)
friends = 5
friend_keys = [(N, getPrime(17)) for _ in range(friends)]
cipher = bytes_to_long(FLAG)
for key in friend_keys:
cipher = pow(cipher, key[1], key[0])
print(f"My private key: {my_key}")
print(f"My Friend's public keys: {friend_keys}")
print(f"Encrypted flag: {cipher}")
My private key: (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 2734411677251148030723138005716109733838866545375527602018255159319631026653190783670493107936401603981429171880504360560494771017246468702902647370954220312452541342858747590576273775107870450853533717116684326976263006435733382045807971890762018747729574021057430331778033982359184838159747331236538501849965329264774927607570410347019418407451937875684373454982306923178403161216817237890962651214718831954215200637651103907209347900857824722653217179548148145687181377220544864521808230122730967452981435355334932104265488075777638608041325256776275200067541533022527964743478554948792578057708522350812154888097)
My Friend's public keys: [(21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 106979), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 108533), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 69557), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 97117), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 103231)]
Encrypted flag: 20304610279578186738172766224224793119885071262464464448863461184092225736054747976985179673905441502689126216282897704508745403799054734121583968853999791604281615154100736259131453424385364324630229671185343778172807262640709301838274824603101692485662726226902121105591137437331463201881264245562214012160875177167442010952439360623396658974413900469093836794752270399520074596329058725874834082188697377597949405779039139194196065364426213208345461407030771089787529200057105746584493554722790592530472869581310117300343461207750821737840042745530876391793484035024644475535353227851321505537398888106855012746117
解法:
方法一:
题意是给定一个明文m用不同的e进行加密即 c = m e 1 e 2 . . . e 5 m o d ( N ) c=m^{e_1e_2...e_5}\ mod(N) c=me1e2...e5 mod(N)
已知 e d − 1 = k ∗ p h i ed-1=k*phi ed−1=k∗phi,首先假设 m x = c m o d ( N ) m^x=c\ mod(N) mx=c mod(N),我们计算 y = x − 1 m o d ( k ∗ p h i ) y=x^{-1}mod(k*phi) y=x−1mod(k∗phi)
所以 x ∗ y = 1 ( m o d p h i ) x*y=1(mod\ phi) x∗y=1(mod phi)因此 c y = m x ∗ y = m ( m o d p h i ) c^y=m^{x*y}=m\ (mod\ phi) cy=mx∗y=m (mod phi)
解释: x ∗ y = k ∗ p h i + 1 x*y=k*phi+1 x∗y=k∗phi+1,所以 m x ∗ y = m k ∗ p h i + 1 ( m o d p h i ) m^{x*y}=m^{k*phi+1}\ (mod\ phi) mx∗y=mk∗phi+1 (mod phi)
m k ∗ p h i ( m o d p h i ) = 1 m^{k*phi}\ (mod\ phi)=1 mk∗phi (mod phi)=1所以 m x ∗ y = 1 ∗ m ( m o d p h i ) = m m^{x*y}=1*m(mod\ phi)=m mx∗y=1∗m(mod phi)=m
from Crypto.Util.number import long_to_bytes, inverse
e = 0x10001
N, d = (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 2734411677251148030723138005716109733838866545375527602018255159319631026653190783670493107936401603981429171880504360560494771017246468702902647370954220312452541342858747590576273775107870450853533717116684326976263006435733382045807971890762018747729574021057430331778033982359184838159747331236538501849965329264774927607570410347019418407451937875684373454982306923178403161216817237890962651214718831954215200637651103907209347900857824722653217179548148145687181377220544864521808230122730967452981435355334932104265488075777638608041325256776275200067541533022527964743478554948792578057708522350812154888097)
keys = [106979, 108533, 69557, 97117, 103231]
enc_flag = 20304610279578186738172766224224793119885071262464464448863461184092225736054747976985179673905441502689126216282897704508745403799054734121583968853999791604281615154100736259131453424385364324630229671185343778172807262640709301838274824603101692485662726226902121105591137437331463201881264245562214012160875177167442010952439360623396658974413900469093836794752270399520074596329058725874834082188697377597949405779039139194196065364426213208345461407030771089787529200057105746584493554722790592530472869581310117300343461207750821737840042745530876391793484035024644475535353227851321505537398888106855012746117
prod = 1
for k in keys:
prod *= k
dd = inverse(prod, e*d-1)
print(long_to_bytes(pow(enc_flag, dd, N)))
方法二:
已知e,d分解N
e ∗ d − 1 = k ∗ ( p − 1 ) ∗ ( q − 1 ) e*d-1=k*(p-1)*(q-1) e∗d−1=k∗(p−1)∗(q−1),这里任取一个小于n的数g
g e d − 1 = g k ( p − 1 ) ( q − 1 ) g^{ed-1}=g^{k(p-1)(q-1)} ged−1=gk(p−1)(q−1),在mod n 的条件下 g e d − 1 = g k ∗ p h i = 1 m o d ( n ) g^{ed-1}=g^{k*phi}=1\ mod(n) ged−1=gk∗phi=1 mod(n),因此 p ∗ q = g e d − 1 − 1 m o d ( n ) p*q=g^{ed-1}-1\ mod(n) p∗q=ged−1−1 mod(n)
令 k = e d − 1 k=ed-1 k=ed−1
则:
p ∗ q = g k − 1 = ( g k / 2 − 1 ) ( g k / 2 + 1 ) = 0 m o d ( n ) p*q=g^k-1=(g^{k/2}-1)(g^{k/2}+1)=0\ mod(n) p∗q=gk−1=(gk/2−1)(gk/2+1)=0 mod(n)
我们可以发现如果 g k / 2 − 1 g^{k/2}-1 gk/2−1在modn下如果等于p或者q(即与n有非1的最大公因子)就可以分解n了,反之则不断分解 g k − 1 g^k-1 gk−1
如果直到不能再分解都没找到,则换下一个g
代码:
from gmpy2 import *
import binascii
import random
a=(21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 2734411677251148030723138005716109733838866545375527602018255159319631026653190783670493107936401603981429171880504360560494771017246468702902647370954220312452541342858747590576273775107870450853533717116684326976263006435733382045807971890762018747729574021057430331778033982359184838159747331236538501849965329264774927607570410347019418407451937875684373454982306923178403161216817237890962651214718831954215200637651103907209347900857824722653217179548148145687181377220544864521808230122730967452981435355334932104265488075777638608041325256776275200067541533022527964743478554948792578057708522350812154888097)
n=a[0]
d=a[1]
e=65537
key=[(21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 106979), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 108533), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 69557), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 97117), (21711308225346315542706844618441565741046498277716979943478360598053144971379956916575370343448988601905854572029635846626259487297950305231661109855854947494209135205589258643517961521594924368498672064293208230802441077390193682958095111922082677813175804775628884377724377647428385841831277059274172982280545237765559969228707506857561215268491024097063920337721783673060530181637161577401589126558556182546896783307370517275046522704047385786111489447064794210010802761708615907245523492585896286374996088089317826162798278528296206977900274431829829206103227171839270887476436899494428371323874689055690729986771, 103231)]
c=20304610279578186738172766224224793119885071262464464448863461184092225736054747976985179673905441502689126216282897704508745403799054734121583968853999791604281615154100736259131453424385364324630229671185343778172807262640709301838274824603101692485662726226902121105591137437331463201881264245562214012160875177167442010952439360623396658974413900469093836794752270399520074596329058725874834082188697377597949405779039139194196065364426213208345461407030771089787529200057105746584493554722790592530472869581310117300343461207750821737840042745530876391793484035024644475535353227851321505537398888106855012746117
def getpq(n,e,d):
while True:
k=e*d-1
g=random.randint(0,n)
while k%2==0:
temp=pow(g,k,n)-1
k=k//2
if gcd(temp,n)>1 and temp!=0:
return gcd(temp,n)
p=getpq(n,e,d)
q=n//p
rd=1
phi=(p-1)*(q-1)
for i in key:
#print(i)
rd*=invert(i[1],phi)
m=pow(c,rd,n)
print(binascii.unhexlify(hex(m)[2:]))
#crypto{3ncrypt_y0ur_s3cr3t_w1th_y0ur_fr1end5_publ1c_k3y}*
10.RSA中CRT的应用
题意
from Crypto.Util.number import bytes_to_long, getPrime
import socketserver
import json
FLAG = b'HTB{--REDACTED--}'
class TimeCapsule():
def __init__(self, msg):
self.msg = msg
self.bit_size = 1024
self.e = 5
def _get_new_pubkey(self):
while True:
p = getPrime(self.bit_size // 2)
q = getPrime(self.bit_size // 2)
n = p * q
phi = (p - 1) * (q - 1)
try:
pow(self.e, -1, phi)
break
except ValueError:
pass
return n, self.e
def get_new_time_capsule(self):
n, e = self._get_new_pubkey()
m = bytes_to_long(self.msg)
m = pow(m, e, n)
return {"time_capsule": f"{m:X}", "pubkey": [f"{n:X}", f"{e:X}"]}
def challenge(req):
time_capsule = TimeCapsule(FLAG)
while True:
try:
req.sendall(
b'Welcome to Qubit Enterprises. Would you like your own time capsule? (Y/n) '
)
msg = req.recv(4096).decode().strip().upper()
if msg == 'Y' or msg == 'YES':
capsule = time_capsule.get_new_time_capsule()
req.sendall(json.dumps(capsule).encode() + b'\n')
elif msg == 'N' or msg == "NO":
req.sendall(b'Thank you, take care\n')
break
else:
req.sendall(b'I\'m sorry I don\'t understand\n')
except:
# Socket closed, bail
return
class MyTCPRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
req = self.request
challenge(req)
class ThreadingTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
def main():
socketserver.TCPServer.allow_reuse_address = True
server = ThreadingTCPServer(("0.0.0.0", 1337), MyTCPRequestHandler)
server.serve_forever()
if __name__ == '__main__':
main()
根据题目代码分析,所选取的e比较小,最先考虑低加密指数攻击,多次测试没有得出正确的结果。
另外注意到,每次选取的公钥e不变,因此考虑多次加密之后采用中国剩余定理求解。
详细思路
m e = c 1 m o d ( n 1 ) m e = c 2 m o d ( n 2 ) m e = c 3 m o d ( n 3 ) m^e=c_1\ mod(n_1) \\ m^e=c_2\ mod(n_2) \\ m^e=c_3\ mod(n_3) me=c1 mod(n1)me=c2 mod(n2)me=c3 mod(n3)
根据中国剩余定理求解出 m e m^e me,然后对其开5次根号得到flag
解题代码
from sympy.ntheory.modular import crt
from sympy import integer_nthroot
from Crypto.Util.number import long_to_bytes
##加密输出 1
c1 = 0x284C49D57F9B6589E32632E4221CE06EB9893794609A0CE8484317F87BF695A1AF938533CE292E5D6FC3A94BE1587C6F3D0B9C63FFCB08DC9D3406C428F5398A62CB9362F50A57F1A15AA9F291955DC87B597EE8FCF47D1E95B7D77668C1041457CDCAD6116D5B3895CE11088479CC62E19DE7260F2B21098BD971EF0151CE21
n1 = 0xEBC238B14DBA3DCCDA59EE85F189DF049F93D57CE4686C6DE5EC7B618AA315784227C498D64B11F2D804B52A5855D4B9806D5EBBF3610AC641DA84A39EECB94CFFE8574F6424656C8E60B04ADE87391AF7D1DB33ED7FCB4C17A07A05D3B32309557D24E8D1C7E2193AE4FE10107F5914ADC33192DFA8E684B447F3523916E129
##加密输出 2
c2= 0x8F0CAB681FFEC55BD664E33D2EB2B51D64C404E84B2D96D8FC5D18D36643E7F2AF9FCAF76D008CDB2A1CB1A1F48C8E6555B3D9909D7EFE7B886ABA67021F1B6D12EEC46AC9AB5A868EA7F677DC1E7322D72DC2D9460887348E72F43C4268268D16DE501B13A20072DCE7DB9B9A2DD8868408A40530F574B395DAB6EDB1487564
n2=0x90EFDD26C9F14F76FC9439F964044D0BB5AE973C9ADFE2E74CFCBBFB76DB992A2A93D47C9A79ECF3E4D6ADD576EC396057DA3D9B2426E92B55F8DC7E9C3330A70A21EF366CA00AFA90988A88D308B458A89C58191E7B74A38680898B06C97955A9430C39CC1D0C2A644152FED5D85820D28331D47839C337866CCB331D4A7845
##加密输出 3
c3 = 0x12E3112FADB4279CF7936781AFD179E39F7B3848F0C0313B49E015B651890A178C791AF5A295A2E21801BB23197EB945617E0707462127463B793CF18E2AB4D1A13FA27A53FE4FF92154067456DA1378A9C5A1E704031D2FF8E3CF9DEC6E8E34F22D70CE356FF9CD4E2D8BF57A2F7660AAAA92A87E9E352F2CB3760F478B966F
n3 = 0xC456D31C4B04E68BE0A143196EA313DB2BB9E49C0270D290B905C3D407E65D2E47EF98CDAF3225DF93B159EB203B4D6D6B89E07BD6536CC5C46120668D0A9C272C15FCC86D2AA4AC7457A57CB730D530F1B5D45B8B18CB41E737D605A09EBBC4016089634F3BE96E228BE3823D48C85857E8C1F35BC083B8190FA46B801B1EB5
##使用中国余数定理计算m的e次方
x = crt([n1, n2, n3], [c1, c2, c3], check=True)
print("x=", x)
##开e次方求解m
m = integer_nthroot(x[0], 5)
print("m=", m)
##输出明文
flag = long_to_bytes(m[0])
print("flag=", flag)
#HTB{t3h_FuTUr3_15_bR1ghT_1_H0p3_y0uR3_W34r1nG_5h4d35!}
泄露dp
import gmpy2 as gp
n= 12308543373374311860115195114269947739026255098864232126071500623399852788903738569949462616714391748269539072128882946132686996592089735285396762634029371785959865779256901123369306119124563405765293657606975290441243965513640680841871955014230301486214824204887945375140818283280272607903500556306646445508386218951500563603482945071727344737690804338144982687000734071274618240408238519378280819162796749148066754028700125846348589164721591354555019608871411236973606149388257533629388508942271702742078883636357856776193846813894734271905070538713351614750057245897158615891962167410053552739441195871000310777649
e= 65537
dp= 28196759050232165736649945458463681080421101473761579424309687746007021074159564720195299959516638110870101025657932732247788828322476803386736345945717104030991724584628153257976163663460034720811420324255626233108130037584679035250792445830510130682783638394418531763109219293027733347554816808577799709553
c= 1855798257044238280327042455832785889763141234883180404158555071443088630113034033050409259513632343742665544043437830959750873431928980910236398026670945184328950692568113819821699696418438157336263799808404698795433243968536256780396910914692949484556950491722527661706255009863481905590371725089587377065000354109396062360440021447607401687082247775453369117424848927386857425051097931983703966253652921113920387008048024308793686643944404541941182997963873579988680965558581885273185721576668001462817150245955628293258512024323515581063235248627223179117549540541642185815489978089367061102920114395871329023208
for i in range(1, e):
if (dp * e - 1) % i == 0:
if n % (((dp * e - 1) // i) + 1) == 0:
p = ((dp * e - 1) // i) + 1
q = n // (((dp * e - 1) // i) + 1)
phi = (q - 1) * (p - 1)
d = gp.invert(e, phi)
m = pow(c, d, n)
print(bytes.fromhex(hex(m)[2:]))
#FSCTF{Cheese_snow_1eop@rd}