Challenge Files



[FLAG]


from Crypto.Util.number import *

PR.<flag1, flag2, flag3, flag4> = PolynomialRing(ZZ)
f1 =  flag1+flag2+3*flag3 - 583601198217999802821640273 
f2 =  3*flag1+2*flag2+2*flag3 - 787432535105101541361772353 
f3 =  -flag2-2*flag3+2*flag4 - -119883660368948934388465829 
f4 =  -flag1+flag3-flag4 - -102047525517112400806626497

flag = b""
gb = Ideal([f1, f2, f3, f4]).groebner_basis()
for i in gb:
    flag += long_to_bytes(i.univariate_polynomial().roots()[0][0])
print(flag)

# Securinets{e2b85d839c1cb2937811c7df65117884}


RSA_sum


from Crypto.Util.number import *

c = 5346610333052301141573047343619846065078098794467177765956324955087719347091536671436526331830395344134230541260240168923329851360190087288243804321742835104990751156409492673227143965048914535457575344840159004515681601817675778554931915360924829066148560947065611320434162353478551330257474866922697400884361842817465720711747110353632721633144229057602588056928099692376525011529698454459358542895759937845187950394478921534965652543483606209970535263344818776251346325995533449511541004890057850514012081552944892107917906291805139683829923591043611079026266915162065374662968447518719349414938099708056292209604
hint = 209832823401265872311825252445099154395272896039699697798324490450232305152247560499187320731075359566227102350147106000414466205759388640945842799928609139246377694758971330720885294877124437285331935643866583425130808381891454091479185765386996737874002834030312889200724968377745691427377709293519958371452
n = 11007349175658748860243418229640363338677269357561248856683193457503680943181079693077112237688891754631515871520931805483261486463486269605322499611349440670314424896115261473479580268327633830211624916767789288243525812884464483285587333257485182507868687182412901685833801879219134028907941088046219746446466844310745726606942735816024513230017932564945107487183056825414847608399809069778146484749674799111664013274792926723348957299557612393315664878818105894646357614528991652210833155349735892554726595991402438121986739587274585064132483389387865079158212629163565722857358921391992308442659749216274594134147
e = 65537
phi = n - hint + 1
print(long_to_bytes(pow(c, pow(e, -1, phi), n)))
# Securinets{0965bf25bb7949a7397210abb3d150b7}


RSA_over_and_over


from Crypto.Util.number import *

n1 = 171384590119504928088330893610978044219515476340594195985011906628812236751065654310559091095986735581787413298018633672174087876784088826375382173832986385531472180344383960226609848918591595487716365114062830394405702114924775246224358213497963548489332195410361971244405641285655850826732426348006709939409
n2 = 173089642486741189207781125973874957919472375522544396099956361760014069922582605899900316152633737903024843862428100243325184237313237771392967518343715491980814976914982127950639406903902448976744985923984988151825280604063896846462073794499405473232778690578726982645824477443717444688914896980522576042481
c = 145424969226655056355752238228322705987823256103552183913343381738835015492245754628107053446078858329379384353324867539431604856471588686607062820389899597017686590341587014669043290421293239676664123801076712244662784830768413045296104830196630506445215409797339619874104273870344205079142306789503807123312
p = gcd(n1, n2)
q = n1//p
print(long_to_bytes((pow(c, pow(65537, -1, (p-1)*(q-1)), n1))))
# Securinets{02bdf19434fe897490386ae5d58cc114}


RSA_ish


from Crypto.Util.number import *
load("https://raw.githubusercontent.com/Connor-McCartney/coppersmith/main/coppersmith.sage")

c = 1338436648980420522080508842773803128141553786226242690248982110201578081534709766674823747690287326894951991999425397344398881228664154335780320956674348407762069763512427499444497456009806572933433508089970562443193932275335312908173110644583473500423097219266439853001657777286733492416326438055310544674609763139358572810515081129361466041936714588178037699273243317906309820370400692666431289163032134240984586090388973559825226084036908634243028911473280693548656503139664205300864616232045761010896308799610686759839014269898721973298672567227667134814655764085265020597772057597989868905026968277848074560510
hint = 935576048266979712597444632468522975800226974249862884851232499661495487551597505171154158044332015729584618180903105192852587077737803635182869165473848713605235778077427667379682104003334740205185079408126620299539701922339910587477628952128393800155937681728631020218482769058420124156396168497212511582018152854122382988125761502784775703113473956962806002368684666090688504038083563330145452610471481820555441607862653216268737678063148120784976259709403667484200165394358764567667668448031673371302274806347429727341362813914794790445124540374223660591291105817141306756200186059636535641609780020621848284683678679529159228738085960601664775287538817322382832118332366967658812405440376383685933796700782327113384400821698651373960284576688370882981092395702210271365051748938738858984453240274396848503184359805663347000714629159058240834383329791904287676464307815035083383847950382192195651842147189430571382652989186017075853699820807534508836791861128081935073237452836037722732110714103991937996616094340967876760119951207818754180353817209599356639221108135415078072685115779397400560778401701883799447145060945744625821084483458041411851430494269631135819562722979489347503818180180881254870961762822652990449460329059439577749722849670872631526494545278852965708005003864131400765055737405074821510180370358613004664845260796758452169585541555426917596511329981124602104043812978594941376569723705991874988069709494157426440916786207361293686370939662971665538774733931294419336545446841983990140424968138246301416449332096524525358671470012027647265567896136699455318115109103842333363039351947298620219371317154703305775086559763951043871388192742852260008005203461768349927882558530736834215761175313864959153010743468914220304253701144044365423894100069731960159445782515581712412275756863176496989195487292873873338253228987250907115019967391901011394448907781984153877569487899194345480560720468717551262624109302876752653543215392859161105656970125224999221131558787960580200136719368545403560774158277084707698198283315314683182698931936599335609315509381151376081864660335343667700192526593630744271401622206215719788381135994493785032214226289718387031901853638187257838265656456450738965042171209492120549318955515500192308550225999276997629226988649700711153133500865471350192410861353793782726632261852731939570368009682872779277770910096513880296135595005083952803946990203049493260225686005195237097532848303507022909541288484472420706554393079439691088272616293951797217376891194898577192243130230919255308969881547132047417338560498370493770328214148045178650615688808377078090958319770525246268988619950170867957227365321437929011705635674495737218171482817191047761154825439341173311765022483432792090565699577840183853525942324340676940957842115868304871678647391198057439110392534485969164190996159237918603745216058065686896252537002721382664305259947061353703641973892588281075867688235507523129661871213206544179422357666758101901978100997183664784433682410494811302206453827671550820597256608793777174689160605383444655193177508689095511372820058079349538121254157499215819594622268180984676108035109861791590202122570325681391192228006890599570121829262300123006439002660784909809624356794592719812494495497953832169281901911813860170626049805529492605803403816439917372517726979655988627875071982699268693378420473958938641603359884692006764666003456387821393553127750443086129799888135887073306227868940143432486524759208885094687007119526391237836583266404865493344185383425740037430290833067689747772748330231583020707702454870863765525993961517729642430797781160759219328341628545346467037358730299145953312102769647811667182645912131939843945079444406
n = 25474427507556413786210054724336059957516940889432956099960297948528732100109342423775839759384624885286509280282591788566777709755731090186754023042229662099604936460140943696920476996540684946271438525935422341753379055148011956824251893766779008759568824869104231297718369433325592646233062313135901177386406164110051373512088816785962347838643586479846087293784578754720788633212068364343681472348059816784986255740833194467303254114708119986924663011079353050038607072712394103424067685277474587911489311280748784514722978572531639893094470567105284554628180604363754895592794633025265807061962973058944213133183

PR.<x, p> = PolynomialRing(Zmod(hint+1))
f =  p**1 * 2**(1024*1*2) + p**2 * 2**(1024*2*2) + p**3 * 2**(1024*3*2) + p**4 * 2**(1024*4*2) + x
p = multivariate(f, bounds=(2**1024, 2**1024), implementation="shift_polynomials", algorithm="groebner", m=1, d=1)[1][1]
q = n//p
print(long_to_bytes((pow(c, pow(65537, -1, (p-1)*(q-1)), n))))
# Securinets{a1e24760cfb3da9e701bd5229293e7e7}

Alternative:

p = gcd(n, hint>>1024)


RSA_Xor


Using https://github.com/sliedes/xor_factor/tree/master?tab=readme-ov-file:

from Crypto.Util.number import *

def check_cong(k, p, q, n, xored=None):
    kmask = (1 << k) - 1
    p &= kmask
    q &= kmask
    n &= kmask
    pqm = (p*q) & kmask
    return pqm == n and (xored is None or (p^^q) == (xored & kmask))

def extend(k, a):
    kbit = 1 << (k-1)
    assert a < kbit
    yield a
    yield a | kbit

def factor(n, p_xor_q):
    tracked = set([(p, q) for p in [0, 1] for q in [0, 1]
                   if check_cong(1, p, q, n, p_xor_q)])

    PRIME_BITS = n.nbits()//2

    maxtracked = len(tracked)
    for k in range(2, PRIME_BITS+1):
        newset = set()
        for tp, tq in tracked:
            for newp_ in extend(k, tp):
                for newq_ in extend(k, tq):
                    # Remove symmetry
                    newp, newq = sorted([newp_, newq_])
                    if check_cong(k, newp, newq, n, p_xor_q):
                        newset.add((newp, newq))

        tracked = newset
        if len(tracked) > maxtracked:
            maxtracked = len(tracked)
        print(f"\rSearched index: {k}/{PRIME_BITS} Queue size: {len(tracked)}",end='')

    # go through the tracked set and pick the correct (p, q)
    for p, q in tracked:
        if p != 1 and p*q == n:
            print()
            return p, q

    assert False, 'factors were not in tracked set. Is your p^q correct?'

c = 15275265039472975909610408547041718788386757487820882103107272217584175748049758961531898094251314570732975236474645330926396805498957643179447809963646081560672048186254787946469348058672295614788290591998730235981602622965667194302235330567228792737564007988532058745990396598954294235264999961987246690856346881653332262190286379857432819599954413967193799344664491203626455196661740681874998383454322013659353357245921368099134385154705847686129780484121605090238249396357522008314473490622182501613971529284467435498122327823055613028951274447002041406711260063367180161237025470933493855306975345452370492911611
hint = 5478892118652718427637531681591784906189219231621524697867175059158570991382747365583328163547352722680814957657927341248839391115863916951493750000401144586220629422578420866336500659944358101332568256582261396863684344460720464640055124524127717099451435066423470579730629628369389772108624958335993556106
n = 18936894471242767110375493922652587118903161545043931519602530948696271512274917611828751332065172247924927177220952613036261931625766189950563889239004122602651113944353323662110970447543458703211946661264736040601870560955601928021385344402431781353349727077598486873599136279923110973679539881079020428294978664735241258098794961648202277890057477590124020288523290473594464152186365080704487078207104967135643858351661385063279564364152911356217516048896797521260518800117789214900654863222005854279363189550543662176144153781558748024521178762045459704725120592504663149389056560029591238955169509502436930981467
e = 65537
p, q = factor(n, hint)
print(long_to_bytes(pow(c, pow(e, -1, (p-1)*(q-1)), n)))
# Securinets{45b340b1291b881d823393da5cc05e12}