做到两道有点像的题,由此记录一下
EasyRSA
题目描述:
from Crypto.Util.number import *
from gmpy2 import *
from random import *
flag = b'DASCTF{xxxxx}'
m = bytes_to_long(flag)
while True:
try:
p = getPrime(512)
q = next_prime(p+2**520)
n = p*q
phi = (p-1)*(q-1)
d = randint(0,n**0.32)
e = inverse(d,phi)
c = pow(m,e,n)
break
except:
continue
print("e = %d"%e)
print("n = %d"%n)
print("c = %d"%c)
'''
e = 22406617662992657889189996038164778072134256533643932957015006754647822578958941307848612281469431201991306481890996110372419319706474785730441458621818413195157394408942556272495727435704953347478158553946953413179163328976215167865874464655775410591847016921402275945868909242077897959037348916785120117461655
n = 24060380804148316574301133150703936973811513337391019200164987960874105848921375758959945881263552336035571494502139825591685175642839368578283761865745224459787280066739212098720274347746524677894359534493555854937925590705524983104059677695973201044287743440388194064688873456047929476158165843812125976675193
c = 6224246192773369488536745056540125828918816255225886951931770916428603800143493592040760978737512689281802769927712229089196097571495191027802589192805135838831322474642230511392667306908597027184532769940279896145161482936674583102879507860488435333891036563479618834572359715411724343814117656984603501647779
'''
题目分析:
构建一个等式:
n
≈
p
∗
(
p
+
2
520
)
n \approx p * (p + 2^{520})
n≈p∗(p+2520),求出p的一个大概值,在此基础上往上加直至 n % p = 0得到准确的p
这里构建一个实数域对象RealField(1024)
,此对象具有精度为1024位的浮点数计算能力
from Crypto.Util.number import *
from gmpy2 import *
e = 22406617662992657889189996038164778072134256533643932957015006754647822578958941307848612281469431201991306481890996110372419319706474785730441458621818413195157394408942556272495727435704953347478158553946953413179163328976215167865874464655775410591847016921402275945868909242077897959037348916785120117461655
n = 24060380804148316574301133150703936973811513337391019200164987960874105848921375758959945881263552336035571494502139825591685175642839368578283761865745224459787280066739212098720274347746524677894359534493555854937925590705524983104059677695973201044287743440388194064688873456047929476158165843812125976675193
c = 6224246192773369488536745056540125828918816255225886951931770916428603800143493592040760978737512689281802769927712229089196097571495191027802589192805135838831322474642230511392667306908597027184532769940279896145161482936674583102879507860488435333891036563479618834572359715411724343814117656984603501647779
P.<x> = PolynomialRing(RealField(1024))
f = x * (x + 2 ** 520) - n
f = f.monic()
a = int(f.roots()[1][0])
for i in range(1000):
p = a + i
if n % p == 0:
q = n // p
d = inverse(e,(p - 1) * (q - 1))
print(long_to_bytes(int(pow(c,d,n))))
# DASCTF{24ce231dcbc-08aa5-4ba28-8ef5-231dcb00sd2ed}
[SHCTF 2023] easyrsa
题目描述:
from Crypto.Util.number import *
from flag import flag
p1 = getPrime(512)
q1 = getPrime(512)
n1 = p1 * q1
e = 65537
p2 = getPrime(1024)
q2 = getPrime(1024)
n2 = p2 * q2
leak1 = (p2+q2) >> 400
leak2 = (p1 & ((1 << 350) - 1)) >> 5
enc = pow(leak2,e,n2)
c = pow(bytes_to_long(flag),e,n1)
f = open(f'output.txt','w')
f.write(f'n1 = {n1}\n')
f.write(f'n2 = {n2}\n')
f.write(f'leak1 = {leak1}\n')
f.write(f'enc = {enc}\n')
f.write(f'c = {c}')
f.close()
'''
n1 = 105813626754830369767796578799226643889033227412658130226893708851110720416468059965713264658478299377654212587044247669928410442281831382577490105352633718272894531572352233211881056495752193201866649055622358234888531194346296702453105176147272971386928767457928148705433435309063146652094354833396307613911
n2 = 20369481027961668058257949652346266097405331865071244844827896944882851755421021125005038786750268341013032202394581223828526073179263634639721089663050687773353438686984875196973012077948955566738301337866191557952973517042420660699281973702694965572488938789954679350791243570953680441483360036599350550534192027759384675611155970913348616382186229565994100357427843446265863186624731991521034305958565644266001622849342042747046352413268149901263629515623929619659379883036239511300563910486156582808698915297257307692017642458823600500445082987244477251123335410633989767118317681371314078169733374888688620813839
leak1 = 110733171993470709195465104383246525062178362778220972191726705114514369848757940664883819735824778128179586221599072975207093223575285541338555960658178287486722693023393688158120847028382
enc = 3724360314735337348015983350518926695244720487101059718828225257324872465291143851090607580822961202894850524395217010317254775500983396154162166500198523991652838543842978138662752717532358799622372813160573374563924704242911344052149200174619645796187521459916955545794017698320367273671936314947729523150627463505338870024421481261166504454532278895870561732979282672259730923724762173494886613682487373643406390205027508946750313076817576295795818790961232101069994823561840743308871216879655652136743807002025483269687509388947008928281179566366429525183899914275273098400627187051739816901887290337980735995613
c = 38127787578353827234498259231834082660893046004292279030517959465543348558091033172704284501791369355347078715874056471582324178524957666710131669794646539355849074198396968523041568909435662208846480656877184197877122598569708545477705274221697660270808685794034776172296500330563270867517390911486555286886
'''
题目分析:
逻辑很简单,要由leak2求出p2,q2,然后解第一层rsa得到leak1,之后对leak1爆破低位并进行copper求出高位从而得到完整p1,然后解第二层rsa得到flag
所以接下来主要是由leak2求出p2,q2
解法和上题挺像的,先构建一个实数域对象RealField(1024),然后利用等式f = p2 * ((leak1 << 400) - p2) - n2
求得一个大概的p2,此p2的高位和准确的p2的高位是一样的,低位会不同,分界点那里可能会有进位误差,所以之后small_roots界那里可以放大一些。
exp:
from Crypto.Util.number import *
from gmpy2 import *
e = 65537
n1 = 105813626754830369767796578799226643889033227412658130226893708851110720416468059965713264658478299377654212587044247669928410442281831382577490105352633718272894531572352233211881056495752193201866649055622358234888531194346296702453105176147272971386928767457928148705433435309063146652094354833396307613911
n2 = 20369481027961668058257949652346266097405331865071244844827896944882851755421021125005038786750268341013032202394581223828526073179263634639721089663050687773353438686984875196973012077948955566738301337866191557952973517042420660699281973702694965572488938789954679350791243570953680441483360036599350550534192027759384675611155970913348616382186229565994100357427843446265863186624731991521034305958565644266001622849342042747046352413268149901263629515623929619659379883036239511300563910486156582808698915297257307692017642458823600500445082987244477251123335410633989767118317681371314078169733374888688620813839
leak1 = 110733171993470709195465104383246525062178362778220972191726705114514369848757940664883819735824778128179586221599072975207093223575285541338555960658178287486722693023393688158120847028382
enc = 3724360314735337348015983350518926695244720487101059718828225257324872465291143851090607580822961202894850524395217010317254775500983396154162166500198523991652838543842978138662752717532358799622372813160573374563924704242911344052149200174619645796187521459916955545794017698320367273671936314947729523150627463505338870024421481261166504454532278895870561732979282672259730923724762173494886613682487373643406390205027508946750313076817576295795818790961232101069994823561840743308871216879655652136743807002025483269687509388947008928281179566366429525183899914275273098400627187051739816901887290337980735995613
c = 38127787578353827234498259231834082660893046004292279030517959465543348558091033172704284501791369355347078715874056471582324178524957666710131669794646539355849074198396968523041568909435662208846480656877184197877122598569708545477705274221697660270808685794034776172296500330563270867517390911486555286886
P.<x> = PolynomialRing(RealField(1024))
f = x * ((leak1 << 400) - x) - n2
f = f.monic()
pp = int(f.roots()[1][0])
P.<x> = PolynomialRing(Zmod(n2))
f = pp + x
x0 = f.small_roots(X = 2 ^ 405,beta = 0.4)[0]
p2 = pp + int(x0)
q2 = n2 // p2
d2 = inverse(e,(p2 - 1) * (q2 - 1))
leak2 = int(pow(enc,d2,n2))
P.<x> = PolynomialRing(Zmod(n1))
for i in range(2**5):
p1_low = (leak2 << 5) + i
f = x * 2 ** 350 + p1_low
f = f.monic()
x0 = f.small_roots(2 ^ 162,0.4)
if x0:
p1 = int(x0[0]) * 2 ** 350 + p1_low
print(i) # 7
q1 = n1 // p1
d1 = inverse(e,(p1 - 1) * (q1 - 1))
print(long_to_bytes(int(pow(c,d1,n1))))
# flag{9995eae8acaac286c7b72e50e5258dc3}
于2023-12-14记录:
dp高位攻击
题目描述:
#!/usr/bin/python3
from Crypto.Util.number import getPrime
from Crypto.Util.number import bytes_to_long
def egcd(a, b):
x, y, u, v = 0, 1, 1, 0
while a != 0:
q, r = b // a, b % a
m, n = x - u * q, y - v * q
b, a, x, y, u, v = a, r, u, v, m, n
gcd = b
return gcd, x, y
def main():
plaintext = b'flag{*****************************}'
m = bytes_to_long(plaintext)
p = getPrime(2048)
q = getPrime(2048)
while p == q:
q = getPrime(2048)
e = 65537
n = p * q
phi = (p - 1) * (q - 1)
gcd, a, b = egcd(e, phi)
d = a
dp = d % (p-1)
c = pow(m,e,n)
print("leak =" + str(int(bin(dp)[2:-450]+'0'*450, 2)))
print("e =" + str(e))
print("n =" + str(n))
print("c =" + str(c))
'''
leak = 1929045653304800345053639184075855232706991842279029383640338486673109989332523825625343006096438858444452461748642786460495185078913482845376566962821322881915149153760007572347957061631195943260228595755767467385129233323383481921899664247618040624704613946431769573471819186085057639982606056825345730666408689507052681889167988224238556066143523010140881897216540695480382125162186544062405455314633824977671169946595038002604956088853800472782501736044780310029410765373299483016434736247751245978938259847736094998162084144114124434050948029558518522405563808822161163788782137022666595937858931570610603556864
e = 65537
n = 301681534086225853103220507001279231093730582675506561947459605354253737517241946044407332158900431647474176872198974350226312230145636976480559372244823643097598013843867482602661276798884347209444062813956392800095662229339108938207648431303245994249324904844697627734321893357806296104372614846467320680240967506864873259664331926507908255357668409820271634292542730585421130426987557725463327083068489568024523727863434352106243373637004299227545950878234688157830245110475983498764824830931829678941264443477353560537026353110405944767040802621276898931598923771954930044613561443544242138253288324122967330897668483576064893285942072247170222391527389362658820789681784488721323152371898013729892530836484698102404942006046338769242696700563307357684980783856202260692959895880785496534433699266107355262413092534710727027626788130299015326555804101072612240176521283877559803756203426354552673981566601001981889401057625116005393365410414883889377488379071280060031265094218844997153947459634778716100195444823234404573127530516439955823700155954972945765299014243407798435306336220456398970152575345078388872352096354374873886168676641939508538254301706287518006399898056372836371043942864599051333839578453443550239962698119
c = 120042805874792672952041721763833188247415991672228397533116942305945379242876710841178554204779188899769022178637432266615520714726354816459588570205139710962196622402335717717968136050673556240655218602830926625818961012015795878954373815905394588457954052259895122535796733315511818090567234868293249290870135131779730870762675560227672971409194090418537823009613333252792219917783004337639124134323769029026727466495094203920308487036874417775508505871899281453759913463943051103414654618235344684930419172292693375890343999821883921550616090949363850929457532239791276060012884000918093802947815224797444889541724519416014208157745984413049210812693424738310103386066119628105996450476367264944198422680639170324606909521689383902462578292681802858896600285487244652443985138934589955947967824830535976660481127264908442111007767853541407968761116726963284938731317746683629289848564197785628971551766299010422621653397738610913312084320026210841820624927813019705150304111953866815280727205217195453267967646903967149170624793522483281004304985772779610585792688604298304876419068217738661971043990752873984090030986448287344953065730690460613876148805531130694698147654661346284964225732332774425001152734155097075650749969975
'''
搜了一圈,没看到太多有关dp高位攻击的题,故分析了一下并写了个脚本
题目分析:
e
⋅
d
p
≡
e
⋅
d
≡
1
(
m
o
d
(
p
−
1
)
)
⇒
e
⋅
d
p
=
k
(
p
−
1
)
+
1
=
k
p
−
k
+
1
⇒
e
⋅
d
p
+
k
−
1
≡
0
(
m
o
d
p
)
∵
d
p
<
p
−
1
,
∴
k
<
e
∴
e
∗
(
(
d
p
0
<
<
450
)
+
x
)
+
k
−
1
≡
0
(
m
o
d
p
)
c
o
p
p
e
r
求出
x
得到
d
p
,
k
从而得到
p
,最终得到
f
l
a
g
\begin{aligned} &e\cdot dp\equiv e\cdot d\equiv1\pmod{(p-1)} \\ &\Rightarrow e\cdot dp=k(p-1)+1=kp-k+1 \\ &\Rightarrow e\cdot dp+k-1\equiv0\pmod{p} \\ &\because dp<p-1,\therefore k<e \\ &\therefore e*((dp_0<<450)+x)+k-1\equiv0\mathrm{~(mod~}p)\\ &copper求出x得到dp,k从而得到p,最终得到flag \end{aligned}
e⋅dp≡e⋅d≡1(mod(p−1))⇒e⋅dp=k(p−1)+1=kp−k+1⇒e⋅dp+k−1≡0(modp)∵dp<p−1,∴k<e∴e∗((dp0<<450)+x)+k−1≡0 (mod p)copper求出x得到dp,k从而得到p,最终得到flag
from tqdm import tqdm
from gmpy2 import *
from Crypto.Util.number import *
dp0 = 1929045653304800345053639184075855232706991842279029383640338486673109989332523825625343006096438858444452461748642786460495185078913482845376566962821322881915149153760007572347957061631195943260228595755767467385129233323383481921899664247618040624704613946431769573471819186085057639982606056825345730666408689507052681889167988224238556066143523010140881897216540695480382125162186544062405455314633824977671169946595038002604956088853800472782501736044780310029410765373299483016434736247751245978938259847736094998162084144114124434050948029558518522405563808822161163788782137022666595937858931570610603556864
e = 65537
n = 301681534086225853103220507001279231093730582675506561947459605354253737517241946044407332158900431647474176872198974350226312230145636976480559372244823643097598013843867482602661276798884347209444062813956392800095662229339108938207648431303245994249324904844697627734321893357806296104372614846467320680240967506864873259664331926507908255357668409820271634292542730585421130426987557725463327083068489568024523727863434352106243373637004299227545950878234688157830245110475983498764824830931829678941264443477353560537026353110405944767040802621276898931598923771954930044613561443544242138253288324122967330897668483576064893285942072247170222391527389362658820789681784488721323152371898013729892530836484698102404942006046338769242696700563307357684980783856202260692959895880785496534433699266107355262413092534710727027626788130299015326555804101072612240176521283877559803756203426354552673981566601001981889401057625116005393365410414883889377488379071280060031265094218844997153947459634778716100195444823234404573127530516439955823700155954972945765299014243407798435306336220456398970152575345078388872352096354374873886168676641939508538254301706287518006399898056372836371043942864599051333839578453443550239962698119
c = 120042805874792672952041721763833188247415991672228397533116942305945379242876710841178554204779188899769022178637432266615520714726354816459588570205139710962196622402335717717968136050673556240655218602830926625818961012015795878954373815905394588457954052259895122535796733315511818090567234868293249290870135131779730870762675560227672971409194090418537823009613333252792219917783004337639124134323769029026727466495094203920308487036874417775508505871899281453759913463943051103414654618235344684930419172292693375890343999821883921550616090949363850929457532239791276060012884000918093802947815224797444889541724519416014208157745984413049210812693424738310103386066119628105996450476367264944198422680639170324606909521689383902462578292681802858896600285487244652443985138934589955947967824830535976660481127264908442111007767853541407968761116726963284938731317746683629289848564197785628971551766299010422621653397738610913312084320026210841820624927813019705150304111953866815280727205217195453267967646903967149170624793522483281004304985772779610585792688604298304876419068217738661971043990752873984090030986448287344953065730690460613876148805531130694698147654661346284964225732332774425001152734155097075650749969975
P.<x> = PolynomialRing(Zmod(n))
for k in tqdm(range(e)):
f = e * (dp0 + x) + k - 1
x0 = f.monic().small_roots(X=2 ** 450, beta=0.4)
if x0:
dp = x0[0] + dp0
print(k)
print(dp)
p = (e * Integer(dp) -1) // k + 1
q = n // p
d = inverse(e,(p - 1) * (q - 1))
m = long_to_bytes(int(pow(c,d,n)))
print(m)
break
# 7788
# dp = 1929045653304800345053639184075855232706991842279029383640338486673109989332523825625343006096438858444452461748642786460495185078913482845376566962821322881915149153760007572347957061631195943260228595755767467385129233323383481921899664247618040624704613946431769573471819186085057639982606056825345730666408689507052681889167988224238556066143523010140881897216540695480382125162186544062405455314633824977671169946595038002604956088853800472782501736044780310029410765373299484196845408142049488434803190315455506921454494432704072672719296917312506416492822624797435856937780274643582520874921032991447798959137
# flag{6750980039478239847209`32801`}