NSS2nd CTF Crypto WP

很久之前的比赛,忘放到博客里了hh (AK)

EzRSA

  • 注意到m的bit长度是小于200的,e=3,所以m的e次方是小于n的

  • 那么直接开立方即可

  • c = 5329266956476837379347536739209778690886367516092584944314921220156032648621405214333809779485753073093853063734538746101929825083615077
    
    print(long_to_bytes(iroot(c,3)[0]))
    
    
  • NSSCTF{Rea1_Si9n3n}

math

  • 这题分为两部分解

  • 第一部分通过数论推导,得到

    p*q=(p**-1)*p+(q**-1)*q-1
    
  • 之后用sympy库解方程即可

  • 第二部分通过数论推导得到

    p=gcd(hint-114514**n,n)
    
  • 用工具求出p

  • 下面为脚本

  • n= 12775720506835890504634034278254395430943267336816473660983646973423280986156683988190224391394224069040565587173690009193979401332176772774003070053150665425296356891182224095151626957780349726980433545162004592720236315207871365869074491602494662741551613634958123374477023452496165047922053316939727488269523121920612595228860205356006298829652664878874947173274376497334009997867175453728857230796230189708744624237537460795795419731996104364946593492505600336294206922224497794285687308908233911851722675754289376914626682400586422368439122244417279745706732355332295177737063024381192630487607768783465981451061
    c= 11915755246503584850391275332434803210208427722294114071001100308626307947436200730224125480063437044802693983505018296915205479746420176594816835977233647903359581826758195341201097246092133133080060014734506394659931221663322724002898147351352947871411658624516142945817233952310735792476179959957816923241946083918670905682025431311942375276709386415064702578261223172000098847340935816693603778431506315238612938066215726795441606532661443096921685386088202968978123769780506210313106183173960388498229061590976260661410212374609180449458118176113016257713595435899800372393071369403114116302366178240855961673903
    hint= 3780943720055765163478806027243965253559007912583544143299490993337790800685861348603846579733509246734554644847248999634328337059584874553568080801619380770056010428956589779410205977076728450941189508972291059502282197067064652703679207594494311426932070873126291964667101759741689303119878339091991064473009603015444698156763131697516348762529243379294719509271792197450290763350043267150173332933064667716343268081089911389405010661267902446894363575630871542572200564687271311946580866369204751787686029541644463829030926902617740142434884740791338666415524172057644794094577876577760376741447161098006698524808
    # p=gcd(hint-114514**n,n)
    # print(p)
    p=105455782136297301522101060102416289455521326237183609203266108650491902454001879515825304995889577954921548871398491249066999225070183739074683311311222633352056597215034013108495088419093171515311559870257496994471344117002696877757522247127846375242687873559988740474656421576669527924443831716929014383633
    q=n//p
    phi=(p-1)*(q-1)
    e=65537
    d=inverse(e,phi)
    print(long_to_bytes(pow(c,d,n)))#19f-a1a6-959449b4df5a}
    e= 65537
    phi= 57503658815924732796927268512359220093654065782651166474086873213897562591669139461637657743218269483127368502067086834142943722633173824328770582751298229218384634668803018140064093913557812104300156596305487698041934061627496715082394633864043543838906900101637618600513874001567624343801197495058260716932
    c= 25112054943247897935419483097872905208058812866572413543619256987820739973912338143408907736140292730221716259826494247791605665059462509978370784276523708331832947651238752021415405546380682507724076832547566130498713598421615793975775973104012856974241202142929158494480919115138145558312814378701754511483
    pinv= 3020925936342826638134751865559091272992166887636010673949262570355319420768006254977586056820075450411872960532347149926398408063119965574618417289548987
    qinv= 4671408431692232396906683283409818749720996872112784059065890300436550189441120696235427299344866325968178729053396743472242000658751114391777274910146291
    import libnum
    import sympy
    p, q = sympy.symbols('p q')
    expr1 = pinv * p + qinv * q - 1 - p*q
    expr2 = (p-1)*(q-1) - phi
    r = sympy.solve([expr1,expr2],[p, q],domain=sympy.S.Integers)
    p = int(r[0][0])
    q = int(r[0][1])
    d = libnum.invmod(e, phi)
    flag = pow(c,d,p*q)
    print(libnum.n2s(int(flag)))
    
    
  • NSSCTF{e713afa4-fcd8-419f-a1a6-959449b4df5a}

LatticeLCG

  • 代码分为两部分

  • 首先通过第二部分求出n,再用共模攻击求出a,再通过LCG求出seed,最终就可以得到b

  • 求n这里我们用到LLL算法,用sage解一下

  • 让es=e,cs=c,假设能找到ai,让ai*ei对i=1到n求和等于0,那么ci^ai进行连乘就等于m的ei乘ai次方,与1同余,所以要找到不同的a,即可通过gcd恢复n

  • 可以构造一个格:

  • 这里其实是背包密码的延申

  • 当N符合要求后,目标向量的最后一个元素将会规约成0,前n个元素即是一个符合要求的a,找两个(以末元素是否为0来判断符合条件的a),让上面的连乘用x/y表示

  • 最后我们用gcd去求得n

  • 其实可以共模攻击继续求出第二部分的明文,但是这题不需要该明文,降低难度了

  • 下面直接给出整道题的脚本

  • from Crypto.Util.number import *
    from gmpy2 import *
    from itertools import *
    es= [297332330847212015073434001239859795661, 247136911662054641479463124065475615181, 269964458627145370722389742095701827701, 270745917671094194052444327351021588037, 254010082507930275771798119457499420531, 219178601856077385518322602059961601013, 226562702503988968288128483964146379529, 236756812424464516919183114495913408541, 330800121752029915693039296018980956519, 244800084005240595691424199440981715431, 171753849214889522920105847094773384191, 175843874533972361422410968920873382741, 326554577162848075059517044795930784993, 181842368629269753698222635712342485771, 221634122983362091660188171985742369561, 314244561819808202322467576330355199409, 286703236198397527318161582654787197007, 298101543059628501506668748374542117409, 304158884506393754601331945634109778837, 227577031261920314010408499530794497453]
    cs= [100163998802948218573427220530909801629443946118807841130458771881611961921044413091457977957530737347507311468578174294420439883266450142918647561103714976340598499984679873518770686239019753272419975426555435266764099822607336645955391865380657632176223122712125661464370522088500110746571354290680063421912, 123528268396018633078964378145622645321836134964966941909300627704018826667414656614011250938241127521627117348901416042868382174504514240509791471909819407751786633761392047187057200130450960708049681366686147337178110669163142189940397343388837018627392202704211693014162963133958078984558400205296509955066, 50364974727218716170137342348825758682286710377257708196467656986986475658591351848251278364177715325447140300281348027787487944839878770556527568407280736570303345044999352851718908253510696083227344179177110348363623815158409862985684687329665113210373028159714648637297476014803935686233984711925346269925, 9159042298258514259206302054907530984498816597282237786310355131965025367180505822032135021520906576471052417629425493533222088036674196397387325202128095476044308794426593565419139845832998557280786358482011226957053125314152322427131984411160984485669030286331376124575677908877399942011661647598763754231, 83466948172962290899792524342204996697711370224947233607865306692546824512672969402433314856742908546253967225963904395036102408684746619744412073888614033881366518452878344698289278946024167788789718690655953517892282374396760436658422838909903123439370164929347147855359470889455753772857233516742991766128, 72028057477369331020972407277180913909557985390590548305094935208898254733240351763155769013959589016793318772858662702447133499307826143247356049051993727167694036585280387890126287679890730586145740176250715386149857291210207281073772478229355625725300592003798974298248102432508449566953296818450441875311, 63397152736399466888877444377156185012692670493456346196278062009641363047685720620967313379507212944658351683022480839941265221126018392433078546696140135677499181555082643172378488800458657825640013090182171355299282023794908520172571785687147143015581400891531296496177973817400317905868361800342940667657, 45427004823510815929685208038284324980662968275105063862891077759131069014314933978878667052450145039482242546093735499108826130367476890384431317243013990394189191560941678120985717370542332803012619694821129395559214706968432476548145608291516176910849698455496733056096163035964057523545705356926187216133, 85046100612081858546755294340770681541320509587396377967875404950325314121709046137842413744740490231945105758075761946555179595664901813127463402854440384657046429776033129391138370272524736543471909307910018577738207910417672603889922445435939876023878220177983424547612635006926243055642166274730894301704, 5833380233103086014860892228744764647016585478949686583145531659689295506666493518453642500086277427538189091865461553097914845680665917702500908205558454036911757659426809969367680394533585635383007758339917554453268182491874683638880986360065633842854622244953985055815937671635222264056071882344388307409, 83587615309194701727032548415548847571046191382552371312058083137102227325098839286526833147951063338204327145093831238962818333112251936853329663907079943414231588222256242520221314528944937229985997926851198158564313703719031124442094987245466116488897263358510493905440842917634723859176839440753120904481, 108651960334634726889543063749359050688114025706494125848785084643330096858725917513596985853593252388835207675036982640195609499739937405655156895161071906340785173459426867946058638393154997931747445494284445204735492709747637173698383609764016673932827648159152658645291248613736662020472251048171789274368, 118612010487916657134965416492319303083994743753602531817008130269546146141506819718265549648441671373744766173780682168587021797626910931105508317440664521595783406848956221465897709761805869130021172013000282497881581247777388315282629463546261696169893882772397797722134711444928443061384985458691749569847, 106808406616890955924408992591724627593882118490933791849624747503316110669154243209826761617940864170830792705070618439466645580274835929100331418955890808763286193770831205511071440703609240364726061677822134370309018443508205980554831705850988319397384130044484586798585896460152167042282847992593429629533, 88091869606421350393441194783722851111189272445506506936925797213395319937783082680078622732926273935980894566775394134783157488360516905477700601820480975112122167589887641130656305741351643175495552454293030309247254533571254198691204714097846510872592569447050033289483493274672346210063885124570695832880, 94400859500860667431780782962782396345261822402898708716634581228428633704975879685572548692997007974004673676539496590659276952154740096463133011458100387006276325192223993452314873089466451613079029429327880672384210802191677586975844471189127835578979108767548290181668434770385199468588493042256788539610, 76177813724283720012398394789596589415486093955132688784865364048503447246391866424200071522136707581280434193680972230914105236504028522288780213089260160776489804587209115330412067560802680789338779056583047491942817016437672075192528508677997165703606520158178725128251694801612417667440677124932361973397, 17188209523466762369281362386525396145127294763502094183797065621821932913685690176344514910405677170931795652509426794846131051983826422536084073462084935517166603832542862106287058675490933197600813710203114108790043880150305327523679949543592622443904084453387396870899883324751789625806819506542619123964, 120007173989070249117019147454557020213723707722383599019972471016186584968096445904023372671513462965078400715365736756710078805039115601609874780421117795585342458478316236202328120583456334489780231976628584606042971207759763658961365139429661536955996519512283283500790612975034779837647053750631763512799, 18797057418663411295612229938999282286746920748194349166509084258061650142260043277698907538088835210620841171754186980908772147495732980563542600139935202965632319542217264685208215907551992891370166006725534397313373079841419662622936316343820775075897977228084528246337988431658221881343556854053475137330]
    
    L = Matrix(QQ,len(es),len(es) + 1)
    for i in range(len(es)):
        L[i,len(es)] = es[i]
        L[i,i] = 1
    L[:, len(es)] *= 2 ^ 11 # N的最小值2^11
    L = L.LLL()
    print(L)
    
    xx = product([ZZ(y) ^ x for x, y in zip(L[0][:-1], cs)]) # 列表中所有元素乘积
    yy = product([ZZ(y) ^ x for x, y in zip(L[1][:-1], cs)])
    n = gcd(xx.numer() - xx.denom(), yy.numer() - yy.denom()) # 获取xx,yy的分子分母
    print(n)
    s,s1,s2 = xgcd(es[0], es[1])
    m = pow(cs[0], s1, n) * pow(cs[1], s2, n) % n
    
    print(long_to_bytes(int(m)))
    
    n=144195616225517130139553879032789087363345719184209965153957734484017481087563259298073412179385691339856835367038233652960921043438130441546622467854561746540234185779818652424614702625694747523202592051400384839225423182264627929190443610610683526608116658120285614198376504623869469278859145863411493155577
    c1 =  132894829064255831243210470637067717685821770359549730768366345840525257033166172926149293454192143005551270166547902269036843756318967855047301751521125394803373953151753927497701242767032542708689455184991906629946511295108898559666019232955132938245031352553261823905498810285940911315433144300083027795647
    c2 =  24086830909813702968855830967174364278115647345064163689290457852025690324300607354444884288995399344650789235347773145941872226843099538451759854505842021844881825309790171852845467221751852440178862638893185965125776165397575087879479327323737686652198357863042305078811580074617322063509435591981140533310
    output1 =  54997286032365904331111467760366122947903752273328087460831713533712307510311367648330090376100815622160705007873798883153287827481112070182047111994066594911019010222064952859306742931009422376955635523160546531204043294436812066746785938062292942759004837173423765427628610568097898331237064396308950601636
    output2 =  115015764780168428067411132384122324817310808727138440691727747976276050930701648349452842302609389394467134068064132550313721128807222231505312226682756817617177620169804112319332815872107656884931985435898097063491690413460967856530075292289784649593915313885813931026280791070577034075346669028068003251024
    import libnum
    import gmpy2
    
    e1 = 2333
    e2 = 23333
    def exp_def(e1,e2,c1,c2,n):
        s,s1,s2 = gmpy2.gcdext(e1, e2)
        m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n
        return int(m)
    
    m=exp_def(e1,e2,c1,c2,n)
    #print(m)
    a=6916067937269950974206746204164509896240838110131015886297814490101615527867219160040558623231859474391279572961225727366045095864405799615600246029206211
    x1=output2-output1
    x2=a*output1
    #print(x1//a)
    print(x2-x1)
    y=380364966565310346139573705275593171203674160992096711250221695526401248521852913594363815176817043289588051955466214462719028670096210487634414273255971211508621518183501598483571526743311665155469924046333690113016300934259482472804982474730586918781189345531156942525990739409605346972255479155344018382592549832030836602814570541002258843050592542321772891175248031995675501106284172505939635218555310755333395621347065633090782603850619202551803156905311808
    b=output1-y
    print(b)
    print(b%n)
    mm=2806865643354785580439949064910175259057528627315932887769100372449333004880846521832438221661926953727869
    print(long_to_bytes(mm))
    
    • 得到NSSCTF{407f8832-6ffd-43bf-91a0-6900758cdff7}

FunnyEncrypt

  • 直接将txt文本中的内容替换掉就行