BaseCTF-week2-Crypto

目录

two_squares

        EXP

铜匠

        EXP

random_primes

        EXP

try_to_factor

        EXP

mid_math2

        EXP


two_squares

from Crypto.Util.number import *
flag=b'BaseCTF{}'
m=bytes_to_long(flag)
p=getPrime(128)
q=getPrime(128)
n=p*q
e=65537
c=pow(m,e,n)
x=p^2+q^2
print("e =",e)
print("c =",c)
print("x =",x)

"""
e = 65537
c = 42330675787206041757903427737108553993012805007294570657461042152628982126538
x = 209479773119142584969854470862023704936857416491817498021871883305658177375498
"""

这个需要用到我们SageMath的里面一个解方程的功能

EXP

from Crypto.Util.number import *
import gmpy2
e = 65537
c = 42330675787206041757903427737108553993012805007294570657461042152628982126538
x = 209479773119142584969854470862023704936857416491817498021871883305658177375498
p,q=two_squares(x)
p,q=int(p),int(q)
n=p*q
phin=(p-1)*(q-1)
d=gmpy2.invert(e,phin)
a=long_to_bytes(int(pow(c,d,n)))
print(a)
# b'BaseCTF{0760becd-cefaab0b094d}'

铜匠

task.py

from Crypto.Util.number import getPrime, bytes_to_long
#from secret import flag
flag=b'XXXX'

p = getPrime(1024)
q = getPrime(1024)
n = p * q
e = 65537
hint1 = p >> 721
hint2 = q % (2 ** 266)
ct = pow(bytes_to_long(flag), e, n)
print(hint1)
print(hint2)
print(n)
print(ct)
'''
hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
'''

又是一个copper的题目,我们现在已知的是p的高位和q的地位,p的高位我们才已知303位,q的才知道266位。显然直接来肯定是不行的,于是我们要结合一下,用q的低位来算p的低位。

EXP

from Crypto.Util.number import *
import gmpy2

p_high = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
q_low = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
enc = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
e = 65537
mod = pow(2,266)
inverse_q_low = q_low.inverse_mod(mod) 
p0 = n * inverse_q_low % mod          
PR.<x> = PolynomialRing(Zmod(n))
f = p_high * (2**721) + p0 + x * 2**266
f = f.monic()
out_p = f.small_roots(2**455,0.4)
p = p_high * (2**721) + p0 + out_p[0] * 2**266
print(p)
assert n % p == 0
q = n // int(p)
phi = (p-1) * (q-1)
d = inverse_mod(e,phi)
m = pow(enc,d,n)
print(bytes.decode(long_to_bytes(m)))
#BaseCTF{7074ddc3e006810688241196414e49e2}

random_primes

task.py

from Crypto.Util.number import *
import random
def gen_n():
    primes=[getPrime(128) for _ in range(256)]
    n = 1
    for i in range(100):
        n *= primes[random.randint(0,127)]
    return primes,n

flag=b'BaseCTF{}'
m=bytes_to_long(flag)

assert len(flag)==45

primes,n = gen_n()
e = 0x010001

c=pow(m,e,n)

print("n =",n)
print("e =",e)
print("c =",c)
print("primes =",primes)

output.txt

n = 78300669134090137852678272985826748552135227276632141248987049792032006306302216838913764274866303353208450204056303587307590215658369546155011362928706987241738494219541640893624036978156512506828463680671263486243620357332029975262649036988429673099480612452108805474703908926666372276084227948945557265663478215385708377783788570365632616043692339165126905185780780266966306548390661933964569191558132570743049563034138454687784280737515786647554373002062073506433019576711216881997114922882459590300118573321037403610889041169358378723253785685185468195113769538654602557963324567374538144099228383454092513581001676844948371535253876783418313588527754932166605066901072445123419390582818421290114496685300926300428214457517990285819930164112928731952543551128353453115448896272534889430898972420106066951673716649898254901175990616932072274131352817500432771246120044877003878221635833566879303044541045834038388997926347179939044765998585225912825579716411592564742018931576637831147018364052669287568321730785094397048548966924521616592554123755297954204221563101170233500051950508111908253332306439556638016218903032470713009804240601585082087048162066169084662644707376647151608352036058459491394516846894878416951958668053255135013274125427380981145860643060541753558111657169642936860264070256441807766713460296249602643758686033797758071121020245797758472562524923801634553187959279204425077723939301840341779998492203869115635533331664608105795918593153796830400602836307602218542060655621724654663459491663959746624660378618696497713505280314029154654750144247111545203758654611758984447921004347657793617842564871769622784844341157861486787088384957424536581508067582989224734241742351249915951485225249670040001204171856547596397427658888879993013652971335861824416084725435327931256774534973698438003593122194474117269397752225948596514379988893089239094703410940035417268946100231522267605729519374566776171026410423486906556493370843386314649478106704968479881781695360132024826936593194324539644886241562342997299649076507105518992946223028855705189458007533521138703343150937158114114218932400728424949936286443583797118636171187082834662757985896337364138817400612718422265665198024836586611857266616428913152399750688461692677751727389476785588380514444593900569311496880422405988762554852121131345538798688587092154717384294801026132314002251890156123191210398076704434510182202143578810771596233936298462366674592585338029819643973999567268938697218329734244529139548760101393715777276776940762681748317493543343685273831243829694914274003574509516149595004243952747746644961308054952235256037171151695870643020625268635139422461824974663101258586488528601193378268634713686606488503649923013225514905688326248009253372769118830036659383418890729585564557376820890036155588551064419189532686009173215470250197488274429655669070803391973941917017493224972246331391152287082983301776505925295294164201606063028946348118492358755684668733095242911870636074134633575423928967453742150728552560370847186174905012586984090885433727025000206871702482359563400504600567763564582739694873656581728461491373440639163666040518508819641244084238867282549191870081112768586762540287977817548140346798817430775010275964061529114139424317686620296832033309265702409802876815255731607798400127673166880859281784259402995434972992131101158600882460475931695668710417351337637612478180964570698492610372677176847071937542439765750578751925220375723373827393178629810215549480885217514819316424426943459039642952096990941480059597449017550988311939357225101582029418355438775525606571176735588489070335070244453533520858832311313682516805060002632168734723995449881138047136306876918900826798316113276424022400544205104057777588615149030045126315192448561606146254432070045197349283823967140032987449249831755565764939530383006495743
e = 65537
c = 1093256121418811691349633884423021356633978134292966489553874542781791238358295335426668415023166027954996625051420577493667824501649432869528057686451750288316816910397382629774298441937547233956753065529097877191699918039115202957337087658469098304374696277563020457331278140075969310150315715843020746656167994646063024677105714238622574336597601173953997036582942407796229805377339006787815702404915271846770376106312644390819144016155830513829761647568620243654068928415623802444953011361211378013499713469372806125474734994287518083907329841838337717556241874324440340626885553763322954232400855565339807071892321582386180978536483407197865884342435897670134641970372091590178581326892854820705050227840462139458418313478056939546089488178689697927788133612008061739961796780717135680690059059843521460548943400440075072549263642778142322553681107266326899389399400224420049958868630481920741293895509509786744023698063926664818702849276103941412666213912301512015982875337927624885673329513416992222855651023180889148449319496283772492522626881480405730489310544315066415406419791190663101607618436762339809465699249346219280236246798494923574248758432354732450859901402315454165220861852940020724189284384978436094976303046718818115920223875761763369205054892082583399430768426962644539683767683622215674622364530161306440520074932775203726898254313918302918158338893115967835907921400822151110065285755016823481526036112086877396184474779772672777884312990976267562132296839364269838737667955289273381304280292531609850947774380025541448760290985029328831136155532030110660328741793152955524993218772392841301083853407843632521944959421101063922926408630857942155173553265649994782728054809833578075255522763473867570242922191690258610960429527917825954799350243215320860648845823888406079144360733120892758516436394283721941074591992068709056978434144249946370176209580261992712491146585486352865467853012283982569783829897373148685163663183813646084064010686825626422454984021416402862127889251773565118407053577546260937996800783904867497317512257427384881412920876851185681901360445996414854617735746124849305097724462381788049919520369827437945533718238301976608693210822883549849346914749712641177399278642094159972818771839223940037362062271618565492364129165948546330822175641999869293182574801410909568799887485687799830413460992606782188190161078789803079204468693865791568886757702397226751678303106993202727687413409748299454409517072068313199302592993167348776456703605936302216362148170559954097296263965296226759555059786981274338884349876203756741105449671416827010661253266421028866463837188482523849379185098341631154586750782372250753953789082447013115491415875557484766163997419331193733180948335725001700381759888109481542481560084404144004112246764995544553798311119720361550478239142333177065617369951724788288789091898104014990085985609531302672876148454755584802296948087896190960286862545509803680907635139069769773489974690789281850253441901658186053827023495071972754442328786102677924620742574365171969462047797683507872502560411636054630326651806741191565960549277521714122075001246821117983391397806797612028499867676071294152880791421912694378781390703123405056446531600817818157671340725736220061182015810279092548335683818151707498767164622121926625237321182816937233802267205025138008023815746402851176062360192537976175702542328058732539514446727425707394730057315691659046002877368113680075447504177622678838170749340265685373340874438362777036176293805138792214226140580946132386530852126980325547324038761178186444019589823730620635017784138099601753640268173837644549341739416563571709247391327046697023194351531203111048984847048754457714313305254115325718812624677601983165234723923006394872649966184045387413721873049174098054565879297120256469204258468893249797880459716409176351490537
primes = [255675877315683439181791416047922719357, 180461111025833129025002455435975940971, 337490274732450824975483083220272824199, 304456281514261901091507788207898547903, 254797576342247974393400562686432925229, 183131976400038388097951032415099792851, 187104898097787470482482874168168046723, 300625339408843701719323023799725058313, 293895810597575199851257228961757849961, 197370673648293754589174456296168807801, 214231100175566513755789399545798257027, 299940533764670809123600295354236009687, 329911008919678926860313614132444450849, 292789028093982326052555296040896616647, 267992025172569093811940290026790452689, 192120589915828510906490323831586947847, 208470412662206941915861109996165224771, 195723355777376859063723356742829282943, 195479450259644250739997899829659598467, 225273608271867864202603965232709350643, 297983612753980801299047698668400172129, 289863711883286870918208567358762217117, 320181619705477005993614485764800027801, 274756647552045078797369358162815740121, 208678800821922117897086572764543689257, 274510151199776127157320013074195989531, 270061041585244138305865647463819178071, 231693016600939448457585159254864460211, 221276763231716810367704255896280432977, 284588387935614601031451184436365997027, 190107678698149330362585520776807817237, 244360771516251060479861295353775315223, 184597108435320085388683362929647254859, 214993743235105601056961433866767506839, 319622401044815459679561340300419077137, 312048738778225034570138647462191322423, 192343262692325176379644178905323471293, 217411522139037534713431287902356703153, 203269104665429435826852242437943175799, 197694542080431775212389192687346023837, 170754527923440727794804968936874697237, 199565850096248778954713726823038799169, 329479041983980219266962570620791190271, 336543942677902368237166971184411120319, 296349049540412710059375861980880864529, 276958785496368109105253052397588113011, 236061938563845834433725013690718000077, 175132351377019405283465079997063887583, 210382170435243156571657554946080029177, 179295658173078371976938970235081809653, 221499702407155816778095037176350210511, 273750615951477382944958796366722325273, 215400010676152024850087488645214675509, 242104770580865606729511928881839588399, 237832832377832763447973839385045714547, 240569613888482344825828531593242970283, 188780850815328211058185207879562258749, 236351101956411494065697625496351792553, 234848091988225252588700833488573195973, 216111241348931999833159262144497816823, 248635261568172677022024655836676274851, 175169438550312686771927355949990675153, 222945249317916941175129207081724296809, 272123250140823727659430614318422459467, 321040760103571995807993446246308239643, 244443756627073674223172405572152750757, 231281757931881868821441147678670578293, 212608548905981265953338769409211557953, 262334849743113291736207517444943890093, 221968375825210657749121344978372971509, 284590253068157230941830678792449649633, 300977729071492709020945132474829506297, 305429273614180801706392853095181679257, 335939257455017842008237083398243135951, 294393337682220551877311202846160164539, 300751607582285572452649226924384213987, 177342562402002655670186066181715938647, 314293624358674993004107306426510931177, 192176341797009660053769692734114433539, 219685065300219568101641511794459670373, 311600604660297404708381142674858758433, 189258688382892886748712093669349354607, 265765352209342630144326504781080544103, 233694355945946803066419059858430846563, 223443907562486442160842066195579310831, 182987294835928563972108625144731142337, 214137187246441738588307243392955884313, 251175687278238637206326829923211055529, 280606397834257483599650477170805542213, 233315167891969517243554909836441514543, 189298893622248669462727814260415085983, 248568957395290350328195179867090245057, 292645643756069284722532228739967572339, 179447399460747583275629697319304390429, 179645924152591342445122478862459911921, 332356391092472452305991116186146584177, 245901581082639772431455170863897420347, 205817781083003905754490509387056092343, 240380627852067724273161876175750141361, 268700167965406311300179029348879484383, 213345040113356686319409599805587957227, 251674200978198716465773971152251242983, 179180641720352444750737502831482762429, 306320532661676131438858609804319013343, 256526510096408769263055362633154848279, 205959060854084755092268947433148347151, 291927192797043538420569211955680836527, 204978877621419749982721876460562600659, 332399656527167823296930534887330184167, 280595736375324905544725725979456898547, 300213915091486506011056425480272542643, 318558817334795356700066397524785435681, 319436460864579377450478049744976231249, 243133148342749788432705330633449318989, 322207542584548294558453923911981520623, 320850760899167598764295789802781069077, 319881693868123342340868542828982909581, 206495732343577870213482544631201066371, 242791194590408310278390962600348350913, 251698935174714138851501858575403291023, 336741296937713120832285756167770151171, 315930741679982320652758472398428972349, 308738538640639393614807292598596283683, 242935142876894679332147837418000898919, 320412254452324446540182603262368766623, 244141238875170898148081089385979949403, 213402860730186872545578995830820087021, 257839149567099022202819187898373109541, 205790643921760418513647126480621419031, 198756405484996593521220520853141427989, 294805620517257214889752595599972901633, 255265348017204260362764409566933677153, 274956788729771493245467759809121243433, 207307664273912902821847768063880326327, 228782470653856387114481087524374601589, 327491405235009262853431015300186498577, 173419211471119738399569200317219003511, 266492438299975532333886393820275910943, 276688137488059756944807773426416608851, 189140053313243747387509835884240226891, 184847492345401269770088588442458737119, 333210953053056282315216794932763359439, 214889588455292527477541347807824233317, 215229626238372443203352172982941095611, 321221012891336284787614820604143303369, 199400757934809114495211412464158118397, 178651685535715756785532928453093603903, 220776757717693008935011794749825325367, 303675938617156800143972318322678387193, 327088681522055240658148530499087069577, 335783766579434559780651762543581106409, 259404300424171457987268194257725139933, 179840475811181163398944717514437142491, 297175485665739288479300848974745531391, 237485053681467543059304786336620370377, 297758270183402970750961370350920892967, 287801215974478613717591686806352676563, 310730027586487200761300572073383664977, 276935537099897424875065059267639595933, 251308797428280999427269663339682237319, 217181290779624781624389434069663308189, 278483889173395237559970658394075421689, 204589549925569581630736863023597052269, 226032820526239722979885626335569166693, 307616487066170583892695494367464641267, 222259520009563764167811735543215104543, 264617923645991453974534495741056598021, 300871024629133281254211035867737539223, 170303240421348821459663263562155031807, 194456703515031789312329705897177851253, 327369717787718586651743316493134914089, 313093229847313153837631186419773330871, 224824444829441039679277741769033772991, 224589292446640473576473771583959436463, 214868884335325091682110394113205785173, 281852933308534953139887124628766315043, 225661596373287038911910532148417025369, 197435393688129783450788260536037003399, 266167151841181488476394288675916455947, 179215005575751890101294918245131012843, 181845510055827963079718687867786713537, 257637102334933109362889675555405989789, 211635849392838491382106919488103885767, 186185061420106956824801515596528043351, 285418977308105637920637161558618377271, 333320927697115374794556799401253359593, 188501857269628483380021948001960729951, 333805438111531260206119448902819218463, 207203219305023873959844954660799240249, 243125622633677038874854389025310242579, 216464412848635515952075334791481048513, 215209416857176076836597526059188595229, 214612926530046226231879587951703041239, 211839237456343309131155436452991652823, 243378322702585683775212046627894119463, 300569560524099180847101362636309727649, 277442530432004673254582623587364635427, 264039335285085705456044566498360689059, 336941745040225044220256680095943361963, 294351957900120820634469984437616730183, 193397784957516885417425615607279607259, 172625665034500456784052580259369183617, 171214762299612221823796960282578324943, 194792374409055048312123241531481499583, 214020514849615741103085838425694524869, 217152285242353248407824271751534124093, 310504460995069986330272047239018516719, 257283037178296965441561511618312400677, 196379023990504203398232036900292068109, 208338219265141175146204974249461481119, 180313228114558484028748815066535513471, 293814076002148382129879416847624489347, 217981245083649644743701945778358819867, 198894611219128734462943250308461071371, 190754795019022912784187412387261424293, 273263914687122798746013275553691541621, 319875887014797059887738138214903974573, 280433942775269696096083027024527213553, 339832090471957335839878188583478605273, 245482340001475388718217992653932933781, 195945871414379770821529324478394520901, 203621853598394319877751491201563422297, 285527901432745514886361613743984147931, 284721811618834957831167749970526496317, 327215978662725442740036051250620691291, 221299321558362891869402561537662340987, 252585072729486722478056993406814970147, 280264567326332248237425051940201458271, 241027648066340372998036400876879511133, 209093079608768177230455678431608454539, 340235244837800791530469709812216931327, 318370869089270734010914463566452904391, 218007259061353959833958121965586715759, 320702628326860753372843359167209806577, 280574097974570759348625351607802595079, 228292038707075332622237132594473246261, 246482905608669854259984848561724759323, 281771843261446623855706740146832822043, 241444581355719829115072364769273312223, 309029268537775236744873599480649785803, 293169195958605701684834829075351077843, 240056552101889027428780330876207267181, 206667506718454166578882634113592471317, 295377459264316749259598713099825801289, 334341534141831513237527215426279900591, 263440016933436744959242384953581131709, 327921668846632014434297416582771393151, 179743859120339282852666034250891124503, 212172965192102954961276830300925726343, 325170702322845184523697390427992449689, 271105603309076479942153666379400527383, 271642757529104184378772507234018239527, 244844048330592276234702305193952823371, 270007525941420385852467420335121485863, 290899364033417721623974853950097454643, 279919385326960469749295500025219756669]

这题的n的来源很特别,是一个素数列表的乘积

注意到,flag长度是45,45*8=360,flag位数就360,我们在rsa加密中,密文和明文位数会比较接近,于是密文应该也是三百多位,每个素数128位,素数的位数影响 RSA 模数的大小,而模数的大小直接限制了可以加密的明文的长度。所以应该是3个素数,384位差不多

EXP

from Crypto.Util.number import *
from gmpy2 import *
# n =
# e = 
# c = 
# primes =
for i in primes:
    for j in primes:
        for k in primes:
            tn=i*j*k
            phi=(i-1)*(j-1)*(k-1)
            m=long_to_bytes(pow(c,invert(e,phi),tn))
            if b'BaseCTF' in m:
                print(m)
                exit()

try_to_factor

task.py

from Crypto.Util.number import *
import random

flag=b'BaseCTF{}'+random.randbytes(64)
m=bytes_to_long(flag)

p,q,r,s,t=[getStrongPrime(512) for _ in range(5)]
N=p*q*r*s*t

n=p*q
e=65537
c=pow(m,e,n)


gift=random.randint(2,n)*(p-1)*(q-1)*(r-1)*(s-1)*(t-1)
while gift%2==0:
    gift//=2

print("N =",N)
print("c =",c)
print("gift =",gift)

"""
N = 162692163428762295773992659007654377270271126313772302197255271375236131917158614424426498628778734679898165422129699410934825650141972454562350664161510689489443251515884304101827584411577749250383438126881931889798597627663578045519256806107514170414321556291545302688028088470848270636776466672843710163017531472049823632822203461654253767303314505996071453898533003519236112138591066133289040889933161978131399309340741554076140734156174295730180874473301361701867633594222054688204666518058106672165786417002466165926062199279674267145233283545524775943767021416906072142236079753359492846480515376121887507681663761713445807717270089017438999615422884163666812016989696908657065537508715229685120221307021151610089917537155165897740417480127289719971512938348936259
c = 113962118676826667648935023618252851875440854724310328843964819392166304653581141146631375503931008732348730639629174670963727399860571217264854300057305570824097216782800531930906801885967717639795643406206813677461127762087560021634738167845077869308515223303820469892552545806179267969169748886980836435095
gift = 863514692222931709925579242743251211976114217396765747601042357918763818732391790491059528595917786523674732369068315533549380754409535403506339052401422249684188032949680148055803474336983973622610403448963752802490806614810077181934627694570685722842963961551889267501616799757825675192653489096007790143775773378495299981666657347802233798206597104474595281241837323214457344961462510183726339545608046357281265026013496037522835659867389206279894057481600882665189079672009577651494435000349624334685832217586703242422260870866432379257259316411280539845741932725104662417642890238587876489774492067722351467773093391502588019563488688309892102039611978767690653206664257400163618467825666105966072942726011447079204869750153256054140924951306811971422635104088608275908232688385437145325481792836532453258784103533536292492138405929815964841772656055397705840797739586953744563989819811944946916720655079908564653686456283647030055622241840292127096994325415897266379446446435164189216562921252341705747891518007710533906231225283309180960546212899099652226954393826875
"""

参考论文

参考一下官方wp

算法流程:

EXP

from random import randrange
from gmpy2 import *
from Crypto.Util.number import *
import itertools
def my_factors(N, gift):
    ans=[]
    factors=[N]
    while len(factors)>0:
        N=factors[0]
        w = randrange(2, N - 1)

        s = 0
        a_1 = pow(w, gift * pow(2,s), N)
        while a_1!=1:
            s=s+1
            a_1 = pow(w, gift * pow(2,s), N)
        
        if s!=0:
            a_2 = pow(w, gift * pow(2,s-1), N)
            if a_2!=N-1:
                p = gcd(N, a_2 + 1)
                if p!=1:
                    q=N//p
                    factors=factors[1:]
                    if isPrime(p):
                        ans.append(p)
                    else:
                        factors.append(p)
                    if isPrime(q):
                        ans.append(q)
                    else:
                        factors.append(q)
    return ans
N = 162692163428762295773992659007654377270271126313772302197255271375236131917158614424426498628778734679898165422129699410934825650141972454562350664161510689489443251515884304101827584411577749250383438126881931889798597627663578045519256806107514170414321556291545302688028088470848270636776466672843710163017531472049823632822203461654253767303314505996071453898533003519236112138591066133289040889933161978131399309340741554076140734156174295730180874473301361701867633594222054688204666518058106672165786417002466165926062199279674267145233283545524775943767021416906072142236079753359492846480515376121887507681663761713445807717270089017438999615422884163666812016989696908657065537508715229685120221307021151610089917537155165897740417480127289719971512938348936259
c = 113962118676826667648935023618252851875440854724310328843964819392166304653581141146631375503931008732348730639629174670963727399860571217264854300057305570824097216782800531930906801885967717639795643406206813677461127762087560021634738167845077869308515223303820469892552545806179267969169748886980836435095
gift = 863514692222931709925579242743251211976114217396765747601042357918763818732391790491059528595917786523674732369068315533549380754409535403506339052401422249684188032949680148055803474336983973622610403448963752802490806614810077181934627694570685722842963961551889267501616799757825675192653489096007790143775773378495299981666657347802233798206597104474595281241837323214457344961462510183726339545608046357281265026013496037522835659867389206279894057481600882665189079672009577651494435000349624334685832217586703242422260870866432379257259316411280539845741932725104662417642890238587876489774492067722351467773093391502588019563488688309892102039611978767690653206664257400163618467825666105966072942726011447079204869750153256054140924951306811971422635104088608275908232688385437145325481792836532453258784103533536292492138405929815964841772656055397705840797739586953744563989819811944946916720655079908564653686456283647030055622241840292127096994325415897266379446446435164189216562921252341705747891518007710533906231225283309180960546212899099652226954393826875


primes=my_factors(N,gift)
print(primes)
permutation=itertools.combinations(primes,2)
for i in permutation:
    p,q=i
    p,q=int(p),int(q)
    flag=long_to_bytes(pow(c,inverse(65537,(p-1)*(q-1)),p*q))
    if b'BaseCTF' in flag:
        print(flag)
        break
#b'BaseCTF{ed4bff90-d1f4-4f0f-a3bd-999c54d9eeb7};\xef\xd7"X\xceglz\xc2l\xc3\xf0\x04\n$I\x00\xda\rT\xc5\xef\xc9t]\x0c\xae@\xdcO5\x02\xa8\xd6/{5\xacD5\xda\x11{\x80\x80\xa3\t#\x97\x871L\x10\r\x122z\xe1\x89%\x85\xdb\x94'

mid_math2

task.py

import numpy as np
from Crypto.Util.number import *

a, b, c = [getPrime(128) for _ in range(3)]
d, e, f, h, i, j = [getPrime(1024) for _ in range(6)]
A = [[a, b, c], [d, e, f], [h, i, j]]

flag = b"flag{test_flag}"
flag = bytes_to_long(flag)

def prod(myList):
    result = 1
    for i in myList:
        result = result * i
    return result

def randomArray():
    upper = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    low = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    for i in range(3):
        for j in range(i+1, 3):
            upper[i][j] = getPrime(128)
            low[j][i] = getPrime(128)
    result = np.array(upper) @ np.array(low)
    return result

e = getPrime(18)
N = getPrime(1024)
C = randomArray()
#MAT = C @ A @ B
MAT = C @ A
c = pow(flag, e, prod(A[0]))

print(MAT)
print(f'c = {c}')
print(f'e = {e}')

'''
[[9194428734244577957135736828947112370812209206819996917633266069359894211949655026549592464237531352518967649750275097282532736237822915630766535634248987628113137246739472264614337707439494149796414126558156060870508338278038269649101921703583149322486905552569052814106532234864028314925118581658029792157851338427975728108000711353532410024128431635933014226306706319591106081211872
  7052600738698435126221697697810087514520765619736355003187836563546493264420232197860875416948961661231812045406188307561458872254314061097960625042149316957446344556490001927621879295417925720004568332344856366002394724202261454916368122811414228043610804718983599804179657247820737462743875143882925818085495573474169110616761320858675303922740882169073395416895304752909979711051264
  13094262565727554986668133240216117564284263232131011542877585146452802164148464500319291219458081531317231044962383872061004846788004747813785963603455919882739054992075130196548494850105124430477756818974520035883861936342117869122455996838023977818945511119955390136020375974150407580576040034808588694313922810340598787633148909527275716235390356737099830131958338026891256778602432]
 [7291452286171544741377496447735677778433522048452394999757158120018504601116506253897733192493798837108269469756414516913436198353934250444263790689101779479157541198872731006007031448329354826004420971505929629537584453480285628607579031078497417101681028600589030661495031531644755072500393418929237208836713910921969937998825721580514845395852889662758886414966066733340052235985735
  5592919719754926663830816961667268104316637431189640788304536404157195458040686322901848820171568258023938724485177544141303597034389473064509506247034833050568643394732003598890104462382321956436508366359718039669456303596542945687737870352569084995858128262046585579724537002100295978230177579835256681774512205534970583421138287684468047290246482431883957170924203400422234299829407
  10384135162743100269852365857770153822630076412853981379757028821332622753962517667857057209221058533163475030678127399042436975886694593504673386134198042731671320468065688239424934644173240507619471360908786669070898288638067852779718549009532013299792474712979659423962779677856135791013599792822988457540442172903145046394648862567656330868441373023488569784114231877910285319620037]
 [34946383530632295853235791100380055176686898072752599942691162027311662041417740482507624946631032260410440329949488242706004902881977357811370156793240362927747354453547446315050117795844866771053429455608334265986953931753411938119703800489233043034369650346216548318254326462336573090313788936967898128977445514764945671848611612198443909056919
  26805677375585831510259621878357023272222175103906204143689109861471123435549853025410319713500257027420994041712736040084303902812241806295302385126726161281240831030434347236854521776375408982352155894199700974681768432734155312616453345950508256035721377179651166114898547487082749355033867559583905997404388549346221139007108462958001461826337
  49768956277664050500387501949373949828589012443212214016088015478826178759698946452495063308332332373728223252613132611904477061717762261927498754849913008747980442098787524359755695519989286304445175440218168145037681791003471134417445542856715034633656861298596197935068562189476201463465706711744838395255326376049859058504891392128431832044455]]
c = 11781599055433308033432930805524658061560499523533841161297213162869735414528038973998414585008473948613388691447093
e = 160907
'''

很快可以知道n就是a*b*c那么phi就是(a-1)*(b-1)*(c-1)

用LLL加快。

EXP

from sage.all import *
from Crypto.Util.number import *

MAT = [[9194428734244577957135736828947112370812209206819996917633266069359894211949655026549592464237531352518967649750275097282532736237822915630766535634248987628113137246739472264614337707439494149796414126558156060870508338278038269649101921703583149322486905552569052814106532234864028314925118581658029792157851338427975728108000711353532410024128431635933014226306706319591106081211872,
  7052600738698435126221697697810087514520765619736355003187836563546493264420232197860875416948961661231812045406188307561458872254314061097960625042149316957446344556490001927621879295417925720004568332344856366002394724202261454916368122811414228043610804718983599804179657247820737462743875143882925818085495573474169110616761320858675303922740882169073395416895304752909979711051264,
  13094262565727554986668133240216117564284263232131011542877585146452802164148464500319291219458081531317231044962383872061004846788004747813785963603455919882739054992075130196548494850105124430477756818974520035883861936342117869122455996838023977818945511119955390136020375974150407580576040034808588694313922810340598787633148909527275716235390356737099830131958338026891256778602432],
 [7291452286171544741377496447735677778433522048452394999757158120018504601116506253897733192493798837108269469756414516913436198353934250444263790689101779479157541198872731006007031448329354826004420971505929629537584453480285628607579031078497417101681028600589030661495031531644755072500393418929237208836713910921969937998825721580514845395852889662758886414966066733340052235985735,
  5592919719754926663830816961667268104316637431189640788304536404157195458040686322901848820171568258023938724485177544141303597034389473064509506247034833050568643394732003598890104462382321956436508366359718039669456303596542945687737870352569084995858128262046585579724537002100295978230177579835256681774512205534970583421138287684468047290246482431883957170924203400422234299829407,
  10384135162743100269852365857770153822630076412853981379757028821332622753962517667857057209221058533163475030678127399042436975886694593504673386134198042731671320468065688239424934644173240507619471360908786669070898288638067852779718549009532013299792474712979659423962779677856135791013599792822988457540442172903145046394648862567656330868441373023488569784114231877910285319620037],
 [34946383530632295853235791100380055176686898072752599942691162027311662041417740482507624946631032260410440329949488242706004902881977357811370156793240362927747354453547446315050117795844866771053429455608334265986953931753411938119703800489233043034369650346216548318254326462336573090313788936967898128977445514764945671848611612198443909056919,
  26805677375585831510259621878357023272222175103906204143689109861471123435549853025410319713500257027420994041712736040084303902812241806295302385126726161281240831030434347236854521776375408982352155894199700974681768432734155312616453345950508256035721377179651166114898547487082749355033867559583905997404388549346221139007108462958001461826337,
  49768956277664050500387501949373949828589012443212214016088015478826178759698946452495063308332332373728223252613132611904477061717762261927498754849913008747980442098787524359755695519989286304445175440218168145037681791003471134417445542856715034633656861298596197935068562189476201463465706711744838395255326376049859058504891392128431832044455]]

c = 11781599055433308033432930805524658061560499523533841161297213162869735414528038973998414585008473948613388691447093
e = 160907

def prod2(myList):
    result = 1
    for i in myList:
        result = result * (abs(i) - 1)
    return result

def prod(myList):
    result = 1
    for i in myList:
        result = result * abs(i)
    return result

MAT = matrix(MAT)
n = prod(MAT.LLL()[0])
phin = prod2(MAT.LLL()[0])
d = pow(e, -1, phin)
flag = long_to_bytes(pow(c, d, n))
print(flag)

# b'BaseCTF{8E2BD73F-9C10-F813-2CA4-B4B2DED4E961}'

参考:

官方WP

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值