一带一路金砖2023线下赛-Crypto

Crypto1

附件

from Crypto.Util.number import *
from gmpy2 import *
from flag import flag

p = getPrime(512)
q = getPrime(512)
r = getPrime(512)
e = 2023

a = pow(p+q, e, p*q)
b = pow(p+r, e, p*r)
c = pow(q+e, p, p*q)
d = pow(r+e, p, p*r)
print('a =', a)
print('b =', b)
print('c =', c)
print('d =', d)

phi = (p - 1)*(q - 1)*(r - 1)
n = p * q * r
e = e // gcd(e, phi)
pri = invert(e, phi)
plaintext = bytes_to_long(flag)
cipher = powmod(plaintext, e, n)
print('n =', n)
print('cipher =', cipher)
# a = 33022028261473232777495374489369984051173051765914698583738518002899904080523156837934749116742046277602367384435566675571554308103705904368259935553616909439053270303487771097937681411464233154789299798806729983958502682142190437300710333776343215351258409122741296694039365121701417931039351706449620933965
# b = 81094699539404597343145361125240498679809760332244536460451475832258379562399932681242912311485592104271252217309012830898060896041053659829385735202726553288600509493460180497835520339585127754273226762440611089795375598402111645618656148576588630597445547241467407938373779128315636192164727397109721371821
# c = 84271446189918339833844652348525276763886039158109929437916837238145526361383913885452712470249189911870483017509012824863702488719752612973997881394827167428837538802085223497834025041680433523842549305188960285145390142799963207261252716937469861672320881012026095221908641651584348583973984309599037601834
# d = 15123960887720641582473419411098607262340676763761583670149167561153634913307686118729176007021398862293975304379052309333724796000639317958549447559668843718134962233429595288688678289005300880495334503517799794958574524554067587882588738019194484329080120346211069604574355250202792739546620819511246051563
# n = 1305868362648956325108280699763961840235386671096061258456713954912731266673615837291582943747254404537935708260445169059805285844455841287219831463541106816288497639968189178634434642486867351457926262375796661302973440152867035648809800493109491306147763847782394757396926743318935458828143518191396384284418328375027978975482054453851125577336298275344893200656160561055796833366777132752509479244984517627109717567602238626834388842622601028046927506740105339
# cipher = 276625828551392451826511027008206245152906197958085623086229291363825163886169570753509917102894042740178793715930242597220990395554264570261869266530944288249880918648891613062189780553447229285518845120492754395430894258029324206721471149988053813319167588002898010914570319764757802782204461185081609022963705109732366715784498564685186711202882635722034792366950992854058484819139254900134224781513310691313446400801249008245006958186077485159435259984132664

思路

已知, a ≡ ( p + q ) e ( m o d   ( p ∗ q ) ) ≡ q e ( m o d   p ) a\equiv(p+q)^{e}(mod\textbf{ }(p*q))\equiv q^{e}(mod\textbf{ }p) a(p+q)e(mod (pq))qe(mod p)

b ≡ ( p + r ) e ( m o d   ( p ∗ r ) ) ≡ p e ( m o d   r ) b\equiv(p+r)^{e}(mod\textbf{ }(p*r))\equiv p^{e}(mod\textbf{ }r) b(p+r)e(mod (pr))pe(mod r)

c ≡ ( q + e ) p ( m o d ( p ∗ q ) ) ≡ ( q + e ) ( m o d   p ) c\equiv(q+e)^{p}(mod(p*q))\equiv(q+e)(mod\textbf{ }p) c(q+e)p(mod(pq))(q+e)(mod p)

d ≡ ( r + e ) p ( m o d ( p ∗ r ) ) ≡ e p ( m o d   r ) d\equiv(r+e)^p(mod(p*r))\equiv e^p(mod\textbf{ }r) d(r+e)p(mod(pr))ep(mod r)

根据已知条件可得, k ∗ p = a − ( c − e ) e k*p=a-(c-e)^{e} kp=a(ce)e,所以p = gcd(k*p,n)

k ∗ r = b − p e k*r=b-p^{e} kr=bpe,故r = gcd(k*r, n)

至此,可恢复p、q、r

exp

from gmpy2 import *
from Crypto.Util.number import *
a = 33022028261473232777495374489369984051173051765914698583738518002899904080523156837934749116742046277602367384435566675571554308103705904368259935553616909439053270303487771097937681411464233154789299798806729983958502682142190437300710333776343215351258409122741296694039365121701417931039351706449620933965
b = 81094699539404597343145361125240498679809760332244536460451475832258379562399932681242912311485592104271252217309012830898060896041053659829385735202726553288600509493460180497835520339585127754273226762440611089795375598402111645618656148576588630597445547241467407938373779128315636192164727397109721371821
c = 84271446189918339833844652348525276763886039158109929437916837238145526361383913885452712470249189911870483017509012824863702488719752612973997881394827167428837538802085223497834025041680433523842549305188960285145390142799963207261252716937469861672320881012026095221908641651584348583973984309599037601834
d = 15123960887720641582473419411098607262340676763761583670149167561153634913307686118729176007021398862293975304379052309333724796000639317958549447559668843718134962233429595288688678289005300880495334503517799794958574524554067587882588738019194484329080120346211069604574355250202792739546620819511246051563
n = 1305868362648956325108280699763961840235386671096061258456713954912731266673615837291582943747254404537935708260445169059805285844455841287219831463541106816288497639968189178634434642486867351457926262375796661302973440152867035648809800493109491306147763847782394757396926743318935458828143518191396384284418328375027978975482054453851125577336298275344893200656160561055796833366777132752509479244984517627109717567602238626834388842622601028046927506740105339
cipher = 276625828551392451826511027008206245152906197958085623086229291363825163886169570753509917102894042740178793715930242597220990395554264570261869266530944288249880918648891613062189780553447229285518845120492754395430894258029324206721471149988053813319167588002898010914570319764757802782204461185081609022963705109732366715784498564685186711202882635722034792366950992854058484819139254900134224781513310691313446400801249008245006958186077485159435259984132664
e = 2023
p = gcd(a-pow(c-e, e), n)
r = gcd(b-pow(p, e), n)
q = n//(p*r)

phi = (p - 1)*(q - 1)*(r - 1)
n = p * q * r
e = e // gcd(e, phi)
pri = invert(e, phi)
m = pow(cipher, pri, n)
print(long_to_bytes(m))

# flag{a4d42044193f96ecc0d82daab68fb0e6}

Crypto2

附件

from secret import flag1, flag2
from gmpy2 import *
from Crypto.Util.number import *

m1 = bytes_to_long(flag1)
m2 = bytes_to_long(flag2)

def crypto1():
    length = m1.bit_length()
    a = getPrime(length)
    b = getPrime(length)
    m = getPrime(length)
    seed = m1
    output = []
    for i in range(10):
        seed = (a * seed + b) % m
        output.append(seed)
    print('output =', output)

def crypto2():
    m2_list = []
    p = getPrime(1024)
    q = getPrime(1024)
    n = p * q
    e = 65537
    hint = powmod(2023 * q + 231103, p, n)
    c = []
    for i in range(len(m2_list)):
        c.append(int(powmod(m2_list[i], e, n)))
    print('c =', c)
    print('hint =', hint)
    print('nn =', n)


if __name__ == "__main__":
    crypto1()
    crypto2()


# output = [834653491090491712633760412777668482940684660, 963076666352276362933538153002557560276280585, 2680203877874696332529229520897896728035506440, 91858763922260510630160081492878643315221800, 179788783853351298046757117828345043944048910, 360189746914947261716838580980986928642259725, 1736536856400074029770851415755580673843781308, 1808021479900001497137673789265033052269563590, 1346369077150300179482561724405766566952716635, 2373070631657135370182962105386676320122698203]
# c = [25847117187564871147435977084310306888566983947533004007989507337302539448480660807400683631363037653323934655651536186195280144682282353338543988255095017564445193404201888360133098540124851755959520837089763142801881928435268639528998342405671374458752513354539623987641502292860424789824821508164066272325770454748703578945224156715971852577415342573152893595235493853234913150977184258529336202627461923875735036697841654561514417522586550567378435285727198208058151978028557619162834201070541097195611731200747178680644768761982034231425678341030415924899159928495497028791178552538387129954559459763486327397495, 2597993625898355131484686342642309548795549744986725437883422220238469085558875757418450133138609822456943968225927170364424344868040971841273067049081737515747884333142281160445801303333836123845195912632562871356499781514584148581245515233115435723319476908364475050944242999136486703821143769471968138440124145530159671206754459370985465492566841462887505700941413433303715576098224261742093505350242034497519349407497777840172671192513216651564778906388396162801076827093006861045453570939861667532351024688470022614391154946506206441355424901586644479443525206657200572321372868844771543146316459090158237181485, 2956527082066005164561821388448100413980058583346277188583843824057419295810072898451369974163664755524425406595092397181986202718599608676179025031672282789436288948166928300110786209041044643721963370664940963632603933877281404708280178459041841708863372035515895098193171794312771806822915232474821156532199456764289878170018358177794776126914245869062801083550971077561138689631826523106346667272445377205775932664350287319013373305343462758601941303804928455951370971893879093306929954617900630030164289394598699531267233453384013624287377087291174939289828864037772928737393008162118289258286909501985362295250, 24036359762192210612772216769280114763208471974956110358289952031832098084828316561012418821617228782053541665864931310703316886399402056757764367689999619081631788274207110438077894515491113950417695236611549302087737274711598540385232596160893200047079701589026141261112677074246250660711304079526781323031017830575312638032983137631928441724643068481283545018803215210820804425555615450341977378009083739669781292422413452909078695371859602951598617246723144643126038655203226020666569895519804781384684439089335013980271232648439988606125378545939020092644249623842729559919989410863356579288445314409370178474913, 3960363997589091480620107707211527346101509845142720321898628336810863500058399159107020570632760171583534173401747329014528165255811069267070342780557403219399202730513433346453017621259760388296924253978403037548122517473820088310735552144534877249705087543212438419537791801443623898662973517240548544630134753268280883355876468179760669428141037183575543020006316152289487999929337824359152627636004505961598612840979874902797770962325130525727812624140794438592392086716400523426505924643746377468358809269120102817977913346347887587250920306849645308740722351056575000057487879867306011223614731297637597389043, 19756293830168853506927251598786663302423547949939792595396365605557902176326841521914210558560101263240178286187344187007060920294606321179475442350736784741671759625019400592362483562240110524971943000520191614792589182461376693581255307965759647471787720229065051847213683029417007973713108156619851632918676731647220197394961430421738622620486859204140708188824209667620326849216032913138770508668745908255553971420899580341712899904058277264721198474032211468761694480952081632136747978707742286059674698424990033807956279371642269034887638278918724784178277289072578590524756705371433948355612999958351743990687, 17168619227875497909505939901538074210134896632967963453959488780245871108281300680739199130988768448884508766712433096659677272221474910220398498663465096600092751130706024334981335422994473791003403952348398712253381581055353963195606773755635837012381200529862673389537304536484437523586598301845411466647682253612584638116870758898534046313551493130902889215549744949455783525071657216963778321172413207671885400604972544452862110787806833176337316070491476202319472780767186730105114477599590013789692334667535406037577527189857145152460091371996475309191121964214791589876841386626445042490619304540000268744167]
# hint = 9338337483016165146898805881521198487541269309312832770436948511851832795941266791467994915578419649411572460435260271128921674759992557197545048249434470787607127732811475208233811711545397847068095165612619003606564161170506468897933819532076007793540250883667417425343082043376105603896166033385911408654609024224333133291817708574091425998982236982208848625894644349373591225115610127472627985717732283759324902607157365503370214811285637714767888436301307605770837070222961915979595273212415836871397473400733701288540538544080768855638638602293660616424571436692781529212135754748657495513441649887066399815641
# n = 26566298366382781281519125908424786963856550387674011415220761270178028565618620245185406648984634617854974445206610724734810892857339091633516947351741440994788700191189799988764343173914647096591779575666237861785163473720879395772744646178861521824163120894355954423163952598346158736490791956395261881103850207837298161904327244534821781661369671670803090335416464433768389172123558423828978582126115690776079581448080326998411708109024924484401975676011214124545502085738463524352787144445657656328837938664026202112240260840770445848444946039300979250933967179986200453997139662050410254918283621862756292376613

思路

flag被分成了两段flag1flag2

flag1就是正常的LCG,这里就不多累述了

这里设a = 231103

h i n t ≡ ( 2023 ∗ q + a ) p ( m o d   p ∗ q ) ≡ a p ( m o d   q ) hint\equiv (2023*q+a)^p(mod\textbf{ }p*q)\equiv a^{p}(mod\textbf{ }q) hint(2023q+a)p(mod pq)ap(mod q)

两边同乘 ( a p ) q − 1 (a^{p})^{q-1} (ap)q1,

h i n t ∗ ( a p ) q − 1 ≡ a n ( m o d   q ) hint*(a^{p})^{q-1}\equiv a^{n}(mod\textbf{ }q) hint(ap)q1an(mod q)

运用费马小定理,化简得 h i n t ≡ a n ( m o d   q ) hint\equiv a^{n}(mod\textbf{ }q) hintan(mod q)

也就是说 k ∗ q = h i n t − a n k*q = hint-a^{n} kq=hintangcd(k*q,n)就能求出q

注意,恢复后的m2_list = [3, 49, 13, 79, 409, 572360576146727, 33065072795963938522763],发现都是素数,猜测是m2的素因子。(挺无语的。。)

exp

import gmpy2
from Crypto.Util.number import GCD, isPrime, long_to_bytes, getPrime
from gmpy2 import gcd, invert

c = [834653491090491712633760412777668482940684660, 963076666352276362933538153002557560276280585, 2680203877874696332529229520897896728035506440, 91858763922260510630160081492878643315221800, 179788783853351298046757117828345043944048910, 360189746914947261716838580980986928642259725, 1736536856400074029770851415755580673843781308, 1808021479900001497137673789265033052269563590, 1346369077150300179482561724405766566952716635, 2373070631657135370182962105386676320122698203]

t = []
for i in range(1,len(c)):
    t.append(c[i]-c[i-1])

m1 = 0
for i in range(1,len(t)-1):
    m1 = GCD(t[i+1]*t[i-1]-t[i]**2, m1)
# print(isPrime(m))       # True

a = (c[3]-c[2])*gmpy2.invert(c[2]-c[1], m1) % m1
b = (c[2]-a*c[1]) % m1
a_1 = gmpy2.invert(a, m1)

for i in range(2**16):
    c[1] = (c[1]-b) * a_1 % m1
    flag1 = long_to_bytes(c[1])
    if b'flag{' in flag1:
        # print(flag1)
        break

c1 = [25847117187564871147435977084310306888566983947533004007989507337302539448480660807400683631363037653323934655651536186195280144682282353338543988255095017564445193404201888360133098540124851755959520837089763142801881928435268639528998342405671374458752513354539623987641502292860424789824821508164066272325770454748703578945224156715971852577415342573152893595235493853234913150977184258529336202627461923875735036697841654561514417522586550567378435285727198208058151978028557619162834201070541097195611731200747178680644768761982034231425678341030415924899159928495497028791178552538387129954559459763486327397495, 2597993625898355131484686342642309548795549744986725437883422220238469085558875757418450133138609822456943968225927170364424344868040971841273067049081737515747884333142281160445801303333836123845195912632562871356499781514584148581245515233115435723319476908364475050944242999136486703821143769471968138440124145530159671206754459370985465492566841462887505700941413433303715576098224261742093505350242034497519349407497777840172671192513216651564778906388396162801076827093006861045453570939861667532351024688470022614391154946506206441355424901586644479443525206657200572321372868844771543146316459090158237181485, 2956527082066005164561821388448100413980058583346277188583843824057419295810072898451369974163664755524425406595092397181986202718599608676179025031672282789436288948166928300110786209041044643721963370664940963632603933877281404708280178459041841708863372035515895098193171794312771806822915232474821156532199456764289878170018358177794776126914245869062801083550971077561138689631826523106346667272445377205775932664350287319013373305343462758601941303804928455951370971893879093306929954617900630030164289394598699531267233453384013624287377087291174939289828864037772928737393008162118289258286909501985362295250, 24036359762192210612772216769280114763208471974956110358289952031832098084828316561012418821617228782053541665864931310703316886399402056757764367689999619081631788274207110438077894515491113950417695236611549302087737274711598540385232596160893200047079701589026141261112677074246250660711304079526781323031017830575312638032983137631928441724643068481283545018803215210820804425555615450341977378009083739669781292422413452909078695371859602951598617246723144643126038655203226020666569895519804781384684439089335013980271232648439988606125378545939020092644249623842729559919989410863356579288445314409370178474913, 3960363997589091480620107707211527346101509845142720321898628336810863500058399159107020570632760171583534173401747329014528165255811069267070342780557403219399202730513433346453017621259760388296924253978403037548122517473820088310735552144534877249705087543212438419537791801443623898662973517240548544630134753268280883355876468179760669428141037183575543020006316152289487999929337824359152627636004505961598612840979874902797770962325130525727812624140794438592392086716400523426505924643746377468358809269120102817977913346347887587250920306849645308740722351056575000057487879867306011223614731297637597389043, 19756293830168853506927251598786663302423547949939792595396365605557902176326841521914210558560101263240178286187344187007060920294606321179475442350736784741671759625019400592362483562240110524971943000520191614792589182461376693581255307965759647471787720229065051847213683029417007973713108156619851632918676731647220197394961430421738622620486859204140708188824209667620326849216032913138770508668745908255553971420899580341712899904058277264721198474032211468761694480952081632136747978707742286059674698424990033807956279371642269034887638278918724784178277289072578590524756705371433948355612999958351743990687, 17168619227875497909505939901538074210134896632967963453959488780245871108281300680739199130988768448884508766712433096659677272221474910220398498663465096600092751130706024334981335422994473791003403952348398712253381581055353963195606773755635837012381200529862673389537304536484437523586598301845411466647682253612584638116870758898534046313551493130902889215549744949455783525071657216963778321172413207671885400604972544452862110787806833176337316070491476202319472780767186730105114477599590013789692334667535406037577527189857145152460091371996475309191121964214791589876841386626445042490619304540000268744167]
hint = 9338337483016165146898805881521198487541269309312832770436948511851832795941266791467994915578419649411572460435260271128921674759992557197545048249434470787607127732811475208233811711545397847068095165612619003606564161170506468897933819532076007793540250883667417425343082043376105603896166033385911408654609024224333133291817708574091425998982236982208848625894644349373591225115610127472627985717732283759324902607157365503370214811285637714767888436301307605770837070222961915979595273212415836871397473400733701288540538544080768855638638602293660616424571436692781529212135754748657495513441649887066399815641
n1 = 26566298366382781281519125908424786963856550387674011415220761270178028565618620245185406648984634617854974445206610724734810892857339091633516947351741440994788700191189799988764343173914647096591779575666237861785163473720879395772744646178861521824163120894355954423163952598346158736490791956395261881103850207837298161904327244534821781661369671670803090335416464433768389172123558423828978582126115690776079581448080326998411708109024924484401975676011214124545502085738463524352787144445657656328837938664026202112240260840770445848444946039300979250933967179986200453997139662050410254918283621862756292376613
a = 231103
e = 65537


k_q = pow(a, n1, n1) - hint
q = gcd(k_q, n1)
# print(isPrime(q))
p = n1//q
d = invert(e, (p-1)*(q-1))

m2 = 1
for i in range(len(c1)):
    temp = int(pow(c1[i], d, n1))
    m2 *= temp
flag2 = long_to_bytes(m2)
print(flag1 + flag2)

# flag{1a1cba1971ba474fccbc7d9f7ca7c473}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值