做题杂记555


做到两道有点像的题,由此记录一下

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}) np(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} edped1(mod(p1))edp=k(p1)+1=kpk+1edp+k10(modp)dp<p1,k<ee((dp0<<450)+x)+k10 (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`}
由于RSA算法中,n=p*q,因此n的质因数p和q的乘积等于n。因此,我们可以使用因数分解的方法来求解p和q。 首先,我们可以通过p-q来计算p+q,即: p+q = n/(p-q) = 2793178738709511429126579729911044441751735205348276931463015018726535495726108249975831474632698367036712812378242422538856745788208640706670735195762517/57684649402353527014234479338961992571416462151551812296301705975419997474236 通过计算,我们可以得到p+q的值为: p+q = 48523829543491922748897964138820930260312593105010881640051182795046638540749 接下来,我们可以通过p+q和p-q来计算p和q。具体地,我们可以将p+q和p-q看做两个数的和与差,然后解方程组求解p和q。即: p+q = 48523829543491922748897964138820930260312593105010881640051182795046638540749 p-q = 57684649402353527014234479338961992571416462151551812296301705975419997474236 将以上两个方程相加和相减,可以得到: 2p = p+q+p-q = 2793178738709511429126579729911044441751735205348276931463015018726535495726108249975831474632698367036712812378242422538856745788208640706670735195762517/57684649402353527014234479338961992571416462151551812296301705975419997474236 + 57684649402353527014234479338961992571416462151551812296301705975419997474236/2793178738709511429126579729911044441751735205348276931463015018726535495726108249975831474632698367036712812378242422538856745788208640706670735195762517 p = 2p - (p-q) = 2793178738709511429126579729911044441751735205348276931463015018726535495726108249975831474632698367036712812378242422538856745788208640706670735195762517/57684649402353527014234479338961992571416462151551812296301705975419997474236 - 57684649402353527014234479338961992571416462151551812296301705975419997474236/2793178738709511429126579729911044441751735205348276931463015018726535495726108249975831474632698367036712812378242422538856745788208640706670735195762517 - 57684649402353527014234479338961992571416462151551812296301705975419997474236 q = (p+q) - p = 48523829543491922748897964138820930260312593105010881640051182795046638540749 - p 通过计算,我们可以得到p和q的值为: p = 167183914405775963398977079133764143238109403278152181401932812401304092542089 q = 166437426053463581533669934084928998113018684005207635182173256832323951033909
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值