VNCTF 公开赛 2021 factor

[VNCTF 2021] factor

task.py

from Crypto.Util.number import *
from gmpy2 import *
from secret import flag
from icecream import *
# flag = b'SYC{123123123123123}'
def get_public_key(d):
    while 1:
        p, q = getPrime(512), getPrime(512)
        N, phi, not_phi = p * q, (p - 1) * (q - 1), (p + 1) * (q + 1)
        try:
            e = inverse(d, not_phi)
            assert gcd(e, phi) == 1
            break
        except:
            pass
    return (N, e)

def encrypt(pubkey, m):
    N, e = pubkey
    
    c = pow(m, e, N)
    return c

m = bytes_to_long(flag)
d = getPrime(300)
pubkeys = [get_public_key(d), get_public_key(d)]
cs = encrypt(pubkeys[0], m), encrypt(pubkeys[1], m)

ic(d)
ic(pubkeys)
ic(cs)

'''
[(115483338707853323510117244601663937653032657454816581880428779391136584508645415322441921678179684904267659942318581245589538093236558206867210468172871004098796706517288570963560499418427771831765342801956281881820593084352360716457591198748797415842971188690055630073433785996545367137242661591939632740177, 57942961120648999071495995119939754708884253716257622598699627649519120883383654560602196191747110519111036450217116739928381611061803307053632035548944075112790103258912149703053932492832060534126356062378027983000713091223894604748395826345780826674822582205573649323340945351657354960324397873669889767611), (53622548101803784449246949981043962044702821559359430270342163843702543781580388956841660273746825211912789196955019345268896290156568895362182295889379787233440464948232717888315385094207004043907898658611926470834448875571292174245716821120409044389816082878077188546182422805778560826667364235348059795229, 37629174280947918845570975617525141920002123382327456934545962737176558640617579710289304146119507880547361939594011152968663070025066085778798378563965349218834887746411017240322083056673687330052590220772859205859051875687741541958997904176801239206348298021023694604932588913541173039972303193792987583003)]
(51861394323132582263685584977796608641129485967610029542263453128833142621927008505594685713111162217651119546991411861320042282788909858323941435593508384080858965324662410947546608051702238057613339996124961723578887443100478753831786550701578678090466528863014222331341645240511640398819027209200809466160, 53200507591144017820710284362261363695745231005527161900426580605551005076410241969689161754211964469126847594337121140420040532547631617290907291418063708630323838133357597795892690304405706577096504918510233628396424543417886828387510407109281423448827267022542075484645277275676556239547911837897827866040)
'''

经典的 Common Private Exponent,n的数据巨大无比 理论上d的边界快接近N的0.5次方了,但题目只限制到了N的0.3次方

格规约后的数据相当完整,基本每一个参数都能求出来

原题是SCTF2020 RSA

exp

from icecream import *

from Crypto.Util.number import *

# d = 1378763197174295370919668049073434860171952335239280833251936937231882181821860459047054203
# n1 = 130977872949776463003322478534744453121235330488181934586087835375189884865037628584744281882819923628071236962095041381620780036195826813000061274217617950593008239815240026751349690586875648088714973705965116560759378310003875936556456754809677068916263669979521272295522593773763784637452213033527403965811
# e1 = 32378567173518871820444207653929377598613976508379673302754957708212238668965542792951360208223392362560917967889448723059651189897255908248591538548205636520695762174168130859513548604461524357064071984102472925848074562658370499829828168618739846916725013872538792951023174029919320916633098022544903799907
# n2 = 151417976596674004335107055412677646515824029502844236138144797088869412093391523368443145339089454320485252185573597274631900402179691901748649130903498004993306914417848026319822881204295676374013812703074253000733722551381779278120573815373217550369301649577519219287224439362103150495425207202418383615901
# e2 = 13246094946232866639964874111166269381526312685309952560740325524299303289545628799430935543583274004477951439343745720207763202593935289360122020520527425339376962786272543174346645947873199796383993069835861026182562337355394517062485268508719417949867494857717171299080008521837108130329292984984763112467

# d = 1848787175841919277261075065346237835258975716191602092526829646876694617997750121480943401
# n1 = 100942437939976370122703644189159178045949478410993435133331363133671960617716218282972609956366901718921496016863888716733075479448761763006349113446924050613598365858047705458117401941750341533345395567751258399691558243404987648155539681050874949410827774174963518448258863702371538743294239650498524501643
# e1 = 20286879791748450114116707245111653335494435843592136969170729323482938595644810515841955554010153222025288972827894920931087163428936637446280116293142514960477779173637411068289663551014804511190894206480300870440948002308853909900798525416323425654009517096780291627617813451590098641242653075033382815729
# n2 = 54381670377367686478140897004069141855864567727520511778149054862687266983554621023569011588321698869647377863701887230675620244838252650066904816666078436995645803906810472540020615731771334057656907322446263680799797266396961084398822960261321804045142838803430031344187118684109552934084306954130885683781
# e2 = 23782549057418466876443111973482876248093012373885011162181598071261032524456336564392278637393287726752526750957948499830038992317693364419817868377765057006903777877357619549918805051580518955576851965013419591259495179104997852370352001360659039716925582827416248921988133266534850052023859414534845065601
# c1 = 55286039916354432405217733161715367471726440233048307703617799925744890414035226441079562259742849047588061016349731196234594553880623731637661726960189737675277235434073561613829833770037713426817601468119385594789737844071181351922807840566268074990612925909523976063966411908357079200998257511950201090100
# c2 = 17715633994379255662321575356787543222220724663006039925374743597827940484974113997740878864258658273061165195028809496994892801655179786471112851680846266144813944630762963724933391668706234868614794853730808135981643495745697762771785675252546108769298050455155257700417946582653112525228355055885245553548
n1 = 115483338707853323510117244601663937653032657454816581880428779391136584508645415322441921678179684904267659942318581245589538093236558206867210468172871004098796706517288570963560499418427771831765342801956281881820593084352360716457591198748797415842971188690055630073433785996545367137242661591939632740177
e1 = 57942961120648999071495995119939754708884253716257622598699627649519120883383654560602196191747110519111036450217116739928381611061803307053632035548944075112790103258912149703053932492832060534126356062378027983000713091223894604748395826345780826674822582205573649323340945351657354960324397873669889767611
n2 = 53622548101803784449246949981043962044702821559359430270342163843702543781580388956841660273746825211912789196955019345268896290156568895362182295889379787233440464948232717888315385094207004043907898658611926470834448875571292174245716821120409044389816082878077188546182422805778560826667364235348059795229
e2 = 37629174280947918845570975617525141920002123382327456934545962737176558640617579710289304146119507880547361939594011152968663070025066085778798378563965349218834887746411017240322083056673687330052590220772859205859051875687741541958997904176801239206348298021023694604932588913541173039972303193792987583003
c1 = 51861394323132582263685584977796608641129485967610029542263453128833142621927008505594685713111162217651119546991411861320042282788909858323941435593508384080858965324662410947546608051702238057613339996124961723578887443100478753831786550701578678090466528863014222331341645240511640398819027209200809466160
c2 = 53200507591144017820710284362261363695745231005527161900426580605551005076410241969689161754211964469126847594337121140420040532547631617290907291418063708630323838133357597795892690304405706577096504918510233628396424543417886828387510407109281423448827267022542075484645277275676556239547911837897827866040




M = matrix(ZZ, 3, 3)

M = isqrt(max(n1, n2))
# M = 10704523536419069847275584063070587220303695362157261593514212717132031073368631333467085885236049291630529090309346493924305038011673707087598638071644281
print(M)
B = matrix(ZZ, [
           [M, e1, e2],
           [0, -n1, 0],
           [0, 0, -n2],
           ])
BL = B.LLL()

temp = int(BL[0, 0])
if temp < 0:
    temp *= -1
d = int(temp//M)
ic(int(temp//M), int(temp//M) - d)
t1 = -int(BL[0, 1]-e1*d)
ic(t1)
ic(t1%n1)
k1 = t1//n1

tmp = BL[0, 1]-1
ic(tmp%k1)
ic(tmp//k1)
a = tmp//k1 - 1
n = n1

q = ((a+isqrt(a**2-4*n))//2)
ic(q)
ic(n % q)
p = n//q
d = inverse(e1,(p-1)*(q-1))
# c1 = 77331957632713152087886392813117468156126118935265781990019775924353889995824910805797219503109010569079750440698829234081030187653686142410864741337559424382421986194719973263696515896684885728079607143165197289976120260778135568837928399082445067684660892107087624493229931849909112677436248241067218490538
m = pow(c1,d,n1)
print(long_to_bytes(m) )
'''
1734994648474592945523
ic| n % q: 0
b'vnctf{7d47956b-bc55-4897-a550-cda0b221ce67}'
[21:30:03] ljahum:task $
'''

14号忙了一天,晚上8点才摸到电脑,此时离结束只有2小时了

只做了一个签到题,太菜了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值