NepNep2023_Crypto_WP

前20守门员 悲

Random_RSA

import gmpy2
from Crypto.Util.number import *
from mt19937predictor import MT19937Predictor
from gmpy2 import next_prime
from math import lcm
'''
import gmpy2
from Crypto.Util.number import *
import math
import itertools

def small_roots(f, bounds, m=1, d=None):
    if not d:
        d = f.degree()

    R = f.base_ring()
    N = R.cardinality()

    f /= f.coefficients().pop(0)
    f = f.change_ring(ZZ)

    G = Sequence([], f.parent())
    for i in range(m + 1):
        base = N ^ (m - i) * f ^ i
        for shifts in itertools.product(range(d), repeat=f.nvariables()):
            g = base * prod(map(power, f.variables(), shifts))
            G.append(g)

    B, monomials = G.coefficient_matrix()
    monomials = vector(monomials)

    factors = [monomial(*bounds) for monomial in monomials]
    for i, factor in enumerate(factors):
        B.rescale_col(i, factor)

    B = B.dense_matrix().LLL()

    B = B.change_ring(QQ)
    for i, factor in enumerate(factors):
        B.rescale_col(i, 1 / factor)

    H = Sequence([], f.parent().change_ring(QQ))
    for h in filter(None, B * monomials):
        H.append(h)
        I = H.ideal()
        if I.dimension() == -1:
            H.pop()
        elif I.dimension() == 0:
            roots = []
            for root in I.variety(ring=ZZ):
                root = tuple(R(root[var]) for var in f.variables())
                roots.append(root)
            return roots

    return []

bound=[2**2048,2**960]
N=[4742953361935272305108982202026393823045295722381036512660099104576698185598076344067254977707933652074075597063030824027936067233681613659156914050364145132447988226171101573798887431457311892261327929310777140186730442052816487347558064566571467818721406028153400002958615422952869447216236700911347940557827605223149445647662505424055876903886806319037181079737665715761106138324750517712650977081907750300855831711054686761947696281539572232009910762834670005171210508695921901444695570462977776241445417293952820639806441379640041205330939794489822123376637755731037847869702133873228897590993383261374972501773, 2378258551927476513389969815096409809543435549452134283206427445531694148939698448712657970216684498360287619056251841063129054443558801685141373977371761033044390391988578979934102829566224572799983806209553711386573915868114471592392984639305829254562307414050101203452909058019961946063447255363583159958195089980067534597310327257586882385587123252977838615735204323278676889625968773684302013191615429258255726395086571654324858808203478351147118552661879912725672910218475869780796250829818171504804585759611694770845308394774647093640471051315483907784996991878671100680514580431633771735216441018547569748721, 24176989765576507657382958690606383651209485785598767920893903615206143039459687433432042719185214189746514392422133538651207617686876107550621766614828791127852389476954823796441342185334964087169348841261311072148319227495738997394450404978080215494697307655439236023749750002015800085023372810862221713240880495074870262342997765334989840685196316500020143539495909027199789219876679626257922340148158477273054421264023848321599917637386005314763036984993672764048209189565933507664032357895267333851155660028297188214443459086021295504905790410942029307529684095168074715892949080936017177877112226774206139140131, 25792249616756515773505429782239027186906546897660461280691745726243912867738252663758213453063673898155537508689030600815266384779428455786620351204657423016315754690357780612731495130688342531785280021046799579628105132289746989894693181444372691714405193807997952016881856211571555262257103841490861426756306351494140012914237204290871550272387220483733768703223027491618802489372290050888779574040723846842849371088816872054161023786717056459385668186027042615578514667750310884665550954253012571484394721623559865132385463281906820416669084413127292934169856708754903553977292119345470137071625259719615473774561, 7454297961465810338893872067724603732996007773464808080273072966793163134588896115215490487572176730480674869554843478635041501560582747855186810301601784602980349922852670013508723994768385436075750848065112788986351983245718496455512537023711614279782301849689079028523246208330865584834894171068246786485410804844169915334557518949697921380409817532245458895617927841098525939320216046507443452028908112156286375336151629552403274387815869520350775080638106282127338819789041034032317287562569109766506454455445320672601072119303929286289664125608261589723759669442452847035480289935693313383656909757650628152943, 8584673296536196701817738476606304433041167920237353095804036157601029327861051137713097221849219494234746084855932462369864412923578598817842378226167198071478295404322732423567581574760211082497461165471863240860453833021422542150200184305754283165638797322200054543436306320754314354472419194526685058709582506284295390168624926538906790752107516692478156908060323791415750870788245819547364164227763046648200373752057998245079437903919445030554377375294019089747630559084451597192103376842918171232441528332052814840706111535522313191709139924308074002310783723703536396803754178037162141196541913002411259554041, 1943659307546682540826590181041695062377388237054928393853911852476983250152614529333890837257432700224948351931546401051285351779953274012672707356028179348460607503090710394571884342428224249202111684009075212446216119174929864883468913962064873414732641591194233754058332565346554077975232404609445140449158878832145306980843607672030619293562145221565057947207068821276136858077566553789565936604238333992969688461240341181696745992795113616595717203829764872459059226702109267382735695673389162975741102799045852862917403589202508269661611249913200262042913807120343502739592955937128443436744968776360224620201]
e=[6463182827974632889909126818205701994550324419370260376223892726928879222981381611391169197254031058758229480513712287203283974632826383917074398860642948854043185745302431036194764306804916990359123263364658683466320090316595315039407042372654613291771522284279610314972661334954148376657563481941951630171784529479799608224239253933736479225437506800427451106051792120763960778386326245801036602656393670149818582651909069180950813078469532135553362647372944847642127867047392958549342485594635872953153613507935888546356448680527326861713429804007492744285986971875134726453861649345115380012901045513671658116499628343718207964372216140284468683179632018347692348467644572652679276145895892459260133343874409151583636787245394161440030383045476302483591966261211608358339057600837955918259236651625255464272920262113858295035435587732375691880281843022990803795100196660208624623222681158091943499263403864894825278353953997243478818416342942408752286712780334610795813644262737493923259233427556373061968740390911608415703480689658857851826891872788773806420842039104318349002803345530304048034797697696466560401141224493684963524094634929226767367131709281465674943150669489482817812068572156516680092006871530574524256793123, 4861378183779616485872514440592212848828777423629432203275188062113405824922872141438301158665140351795289489274152428510421302531908797192791429995920853757665983800853945903332383641607857397518867454927360649812830838122831776326835950570619209190879378900414386328227645006805031159409263249093718866842316900176935274270959769643943548654164885091479667776430653444945000115038807073057992917001430093598756261872234900716320420561230413825687705961503262058819215554224622547537604449933582926357643672104441959498606944554509527190893794780321619116893402369527771479639168511427489991096387044625421600953821398906318386359028722293859012574392490797731291501630396399103758819687074513917074614338483642240987321687080569716035974036727658196984217086084979318421230070246422485512776435597379319228707142348621356784215798746866070419091298504531650163422536848546814004734669484102940426522167281136924965706924144600381872899296143568084565287253639746496437182651426461145053121857445823730457076227274429399190986259552888535806611612922479395154616464039623900800818953671175697955996764635984457597671974962827618589469316125442086842989911473833528482464147145267445749790081233497274651378359743309778089181500061, 170264563233582900463958247202151642762238212882857238614966299998441948966994985638859554075203075610210117427189737139768774885759527887073154325496316116328469764272097608836788793850117875312504997123412844108352043534791984929359130822657934412678930296763858650645904564839628938833550284920544047535454858130272956869326692984551547134505793601600888638356195112898114067197260765647428825917012288484195313427128474331354081356732628719456974452735570738837166482345392344448004978574272069333203200271482151825536128751023835287288108891707532415514956590814794150894122864609948715164241746439934251812743248362440238570526908976495284562285949228435894202267793524178188707601557788943191494349023405165340097865914234939156658748083655510525340319344358798277269915911840365359315600625050488436858573495058696310272153684299696612505733907550072186693901362920335168560716769538558108408572901710463090914923425990690870744240993763486547735024839729968123393369082273018178977906421412444661818014863241694029928327195944001739016892530555606303674583861202334114344538857443063911901966464608409109556590262640693855895713312455029739895913450894478899569195469408992649367104206529068480240809726342690645768098976471, 208720627962019830676062318021544828024791068805664045427689895621878039107654727075754637137030212416342223136465015559569470536144019898527025530935318891644758845920487105243356386294631328052665922053542466087168572104435482875211412232492162160766272097195495053602661568771415978020535687943489699951014409158445869223531825622420944942880609350280743437005801235575585882871057022430125574750985422768331633451000043761240854796979677700565655925267233568164252219246976630443245558364615465731788392543230243310145930267953352201366719413966527472109869727879947427385250949146140981909954374521021692828087245877810284047166123448460310881385021783226872994091033836419695328493651412085924803448109829150437433405332021185486771426350324509456530521677218794153290684826799469126596808959001337562373814108167720624828704687540358443680192625747352813504542166687324897959861266109239875631550047254073572501916099909677218954006276856978933864626467750934450983711460107889276288655615754859490428247680359985203419756163715700901399493408469453856413005089640669512001683927913432193925680352548690238727138035421530581996192184492270181693637352250307010977506761594597414918972326556426573196457897241448035528963461531, 24529836765403615505196825701397254304912055085984199935204483461982307331269517201929715108977616975393594273778072432865575594811890715913922049311800730153643483587932645808134389857096202947280843305485812862511770497000693855013064239499426394936777217504097729179328087771357037121577381422397916166759116812499392996391556525196800118435792734739736097190101417274036774206015905096688243328900830988255103458625877455247539641929746422381323366615969385973015949665060152259009332316500208180858163828871144669956418645574805015863662140759473344358289831889648517836752304776644252572034693600495261712399395108347303780470619422713248234099326365049147720862958259693338113281522526125158141795027250235077033699416830456163985424096304891033109062329622336495351265650403946444539228530003147840502064801874724718286484900895511349636488470727552189472186356333559850962417828936676694013716161856084604323043898241206698857803135288027852492848612573575252276084345632631843689822186685444290611986422298079390148449391712039440332383757995395516795506437854295173611224013284640599616543682845773424578573774196197228462571878950737303295618455764893209792645681231112127332258130940371348023160150035393826191912971033, 21952835547764665011818980979058276162012230407300261351464013652279458240361923506833354361177119164358518516940146252513089763492614481175946185278833647296836211386550121244509473772541557030594874622993745410703552882329883624103922948928996159928104923703406312578250256612440543763226026733670689369869514211320422577433968577454670666396246418246108372003533168447040509521268408100796139172541497157618890506562809878065965895706775624529743489361902014104300199937568337449535214566114815733929865713479642494065421686466880877028569879408037755755847546716317902321027594715468592981283652501388893744429645339632436348701072104847902144965637106669763652828909069090899339146175280548487902011575056817034861881026247903736247589643002247737637679886578252610509621885573037694274429741805915833730713017540680644413646708211932865855570934449457083882337829733790456217521471388715946092692006860380495733755657620346283752575904827548600401269165491393300455771742971204955663876587639883952852681556582132707283409228979478741564160721423782919971456320885426289189456291487542708777319489402041071146167704867108531087215808242081572000720120290929595703389120235067953010458332301010042800323725324790733843666244103, 125418733097630867558942916887255217361477010633905895945331633644592205291289168750966038329838310746847237594923805889599869274255171282733876254318218300831032338811657001146544892317147586457535039624508947782537015667776013941579200942546025117196716530075419256005246271420922523112374983991176899154212119563376891683161932512952063883134931644901933028388694740509703194861816768040512151373693638270200885976802543832891056722966789927503899847541140498310978140368755332022151433688809624593088281735294290903598772536910411403190484337529914510220608414707216621012355245607999693963299964326371760046008164335674739968158437437581299543191705963754880725186801026286776322603283349833877756110270895226059132756298037073863367492319175087818846210035480022085144927176987114513020210093555690906814940772653284295608219806448531789047565638503592475832743713019326391919713391852990595411929337623416301410256510476743340064894001157717038472918198256980158551436630603716723281318576209391580413738826776159574560695237971122794434046102071890006457182008998113083827751052354087365989549715983864439053816124703447513849465384997202647711576576287063185197871086624841565498288541759741616749436875351783628438351469]
result=[]
p=[]
q=[]
for i in range(len(N)):        
    PR.<s,k>=PolynomialRing(Zmod(e[i]))
    f=1+k*(N[i]**2-s+1)
    roots=small_roots(f,bound,m=3,d=3)
    result.append(roots[0])
for i in range(len(result)):
    t=int(result[i][0])   #p**2+q**2
    p_q=gmpy2.iroot(int(t+2*N[i]),2)[0]
    p__q=gmpy2.iroot(int(t-2*N[i]),2)[0]
    p.append(int((p_q+p__q)//2))
    q.append(int((p_q-p__q)//2))
d=[]
for i in range(len(p)):
    d.append(inverse_mod(e[i], (p[i] * p[i] - 1) * (q[i] * q[i] - 1)))    
for i in range(len(p)):
    p[i]=p[i]>>32
    q[i]=q[i]>>32
print(p)
print(q)
print(d)
'''

p=[40819408830231597478854060435895415954474924366391810786466023510670748616565342982323063219039354224037244654663904916495818928043914088924468567786159824336535191710779718487070452784145389987541936520605476720034088378963773374409403709798789937418392460029679610046437236087869903117403031202397, 11998780294949535336836730856455814505812258195482138437688696337281549517369185660639830587605155900517657749978881697900958118356327349616106423016516022999014246227966645115980692353062145579669897326178217918719714499489081246597742695697674001678207741664487571788121895906681222641002584469956, 39000436580281449933877223302432740718637885191258288140576780575458695552128940402915505187411807185625498818885300721315999809446054806540153145534797945905710208555994878504580308007398982905763328710429021671593407017148019417869557527784303755495133948704014562558114087885927721949479155647429, 41784974852555288821052888642555066067203446834886612509891977571886323404410535229248203813489387252731703600830005273195723979707334034781686684528248344250612295690886210433786118998565353883189525116608556519202041818241713137917445158788559964655755827693154534984756683293737632558169712407402, 29069399389344001863605114389672223967806973313885983700365151058114865830144984709238737329850663161104154162798223784479972290905967347850637322647742091197478220154592806931684023588818238612222116015563114568134748507624936330200144020980249891591800341533373358372872109267077007360992806078827, 38399130143058699291296503644606138268573579677350419526657116570410479921071699993945578662345978108212155715756032602903266558975180364330255292308664924698390805499575666841953143191096928912415083454397077692547890600963819103601894307524920709288397381923154050401024716464838587279285724611912, 34096597993699768687817089398224329749913466263197560998807072542956140790878275097703212885314621575093882608334623216379709536636508409303366239147352110168546761194009750162758099350521581784062254153486707224142669700168835329281123514701637949701023348031893801155257397476257920687616837663256]
q=[6298866747917173609581191442491655015799129032830736068974974933035874216760462461645431462227509819049304009473259696782407967694738634671314275349012754522009100904821826669192678973118560176088716582981372877900683283743416084859340929543053277548513607630012000023826752152328182090965742953505, 10744896670111270865206520927878578592830973190318778970021555363829682548495327413937737549351623912238230650834509200090897189673539916216247125766812880934539980173074734769178482517353981803846906794762391581985287358184089339205869745298464608029484618794799907437436205949551664730996415166873, 33605706918228413440299983328412627315940639939409446992378313833106551966798315168704742883581411835410002061339819431930631483461083694402977827055599996465156651563132110548061942298235579499627231189653364096553681596958129805702809671612142722543271112159181902815824046994408194440881108600522, 33461804352463002687276965718522680566600120468356898845988930714336230044083134422548134600773059227758627354113977032912548596943663060519216749271762100255407508131008460677448935611954307267573770113963327438762293756276623308452066935666972716402739541011273726266136175936668757246516678006667, 13901157598629493485798866122124054795213534565302412632901515203434628131966120378073804412085043579198877944124234347167477856497334901652239761997241478909918067922512338571062737679712947915431143892998486757647410686207533159293162131911457165552586031949250935712189328930055686435123064585647, 12119443075281922065693785441969329026473477109216389123269024872846289018751872717557649474684051344581968886272422202585433534733747407616210517441099672322308591852919831424027165646655343519560748836737607330642059843092070179169656204100611256803862560889808027828728690504198310276779060275174, 3090219798765798284225708670903838195046854055077234475161775067121479267461445471663597735936139040557166414248744415536087446947623923287634741161603377466421563516018378199542536715880978470831857906137273723328246226143492213216211922195986560368000077202971474925512286860322536646516503767723]
d=[7408655005447809481030418143198398512055442392802863642618606190218657201490545149371393341322462058670649820416192089430727353618353812142055084349869869292555361423928219954791565321004615560749574216646425559300351595309195053571938416479042662000333868056884420792055728237705200733797316821387, 36493487968529624099798829912768442595740695535814133498039188379183900794734545189779716143060444751228645524944589661010347348075801872683873972896557773316373089778104879312542997771116285237667524682811324485450324169334539664497301025162800232762963613931435237730056629416821749349526494249141, 10215175046363819989298694207693228829006408774175726700506909235102940381087408723838548522481084169307700120860511151912334804257690354945141829375281695734264175659720017212779455715194974040434086298375481821068525157630163409378925971804142116940018708120746469983333321985373187638145161625831, 2452138180243105458148457417666902875990549763573761951170346875955813245799858217165302523073014930334429976687945652368128618714680790707582395091928647003512789185292308001937729694895861160918885706246229188226406272490460457412409163863433592752801182582295139853735816792114173128234105831571, 780129462913806503765363334099866246565809905930058687685371256460860701950543863347191866608215354902874511564681901658653616352582835174126575134768621292662468448425058266993213115107990226554054553042778698819386360225731421403969046030306079062305660388522214897106652170266212742086252298537, 22226374908023350734178800484358023269995472653550758787563961445369211217687595089375701006244156456109701825429317903835422195402827682183993249863319109594021255204199407055717409015283528470431893792223348294829393307862473837046807322554725594133343657429816354329255870317291133655699572131767, 20581463650152765312881766782639229942305144018372904606217872313687256214508799247431830823572045038702581909373429815522667651632218842014906588471862780356258954695426647508060556627537972685224531672608622358706862209239389242635099360185947451054847287027468135275487275773582724408035535487653]
c=b'j\xb83FVi4\x7fZ\xfc\xa9g\xdc\xbb\xc8\xb5\\\xad\x0e\xfd\x03\x17\x8db7\xcd\xb2\x18P\xcf\x9d)\xde\x1a\xd1>\xe3\xe9\xb4\xb0~\x81Qq\x82\xc39^LNR\xa2Iv\xb5|\xddo\xfa\xb7\xdbH\x04\xc0\xa3\xef}\xc7\x1a\xe6J.\x05~\x85\x04(\xf8\xfb\x11,\x1b_\xa6\n\x07\xa3\xa6\xf1\rJds\xec\x9a"\x83S\x16\x08\xd5s\xe0\xad/{\xb8(Js\xd5\xb3\x99\xef\xeb\x98\xb1\x9b;\xc7Us\xa4\xd3\xe5E\xf1\x15\xd4\xaa\xa8\xcaa\x16\x13\x0e\xc0\xe1\x91\x03w\nn\x8dSo\x10\x10\xdf\x08\xe2\tL[{\x19P%`\x8c\x9e\xdd\xeb>V\xd8\xa3nBE\xb6k5\xd8S\xf3c\x83\xef\x05\x9b\'Wh\xd9P\x98\xf0\xc5u\xad\xcct\xa1q;\xad1\xd8\xdei?Ew\xb7\x9ff\xc1\xbd\xeb\x1e\xf2\xdd\xb4\xde\xea9G\x1e\xbf\x04\xbdJfJ\xe5s\x13\xc3X,\xc5\x05W5"\xf8\x00\xad1\x80\x932z\xbc\xa4\x80\xb4\xb2N\x1c\x1ex\xbd\xd5#'
e=0x10001
c = bytes_to_long(c)

for i in range(len(d)): #这边补一下d的移位
    d[i]=d[i]>>32

for j in range(0,2**7):   #进行一个二进制的枚举  p or q ?
    PRE32 = MT19937Predictor()
    for i in range(len(p)):
        if(2**i & j==2**i):
            PRE32.setrandbits(p[i], 992)
            PRE32.setrandbits(q[i], 992)
        else:
            PRE32.setrandbits(q[i], 992)
            PRE32.setrandbits(p[i], 992)
        PRE32.setrandbits(d[i], 960)

    p0 = PRE32.getrandbits(992)
    q0 = PRE32.getrandbits(992)
    p0 = next_prime(p0 << 32)
    q0 = next_prime(q0 << 32)
    n = p0 * q0
    phi = (p0 - 1)*(q0 - 1)
    d0 = gmpy2.invert(e, phi)
    m = pow(c, d0, n)
    m=long_to_bytes(m)
    if(b'NepCTF{' in  m):
        print(m)
        break

输入7次1再加上1次2取出所有数据(少一次都不行 因为要满足预测周期

由于e非常大所以对于ed=1 + k*phi可以直接模e然后套板子求二元copper得到p^2 +q^2 随后就是分解p,q 求解d

这里二元copper的求解方式感觉跟CSDN一位名叫无趣的浅博主有一篇文章挺像的,直接照着他的文章构造就行了。 参数的话感觉可调整空间蛮大的,大概估算一下就行了。

之后便是预测随机数(MT19937)

由于p,q有992位是随机数生成的,d有960位是随机数生成的。计算了一下,是超过1周期的,所以可以预测。

这里给出GitHub链接:GitHub - kmyk/mersenne-twister-predictor: Predict MT19937 PRNG, from preceding 624 generated numbers. There is a specialization for the "random" of Python standard library.(可以参考NewStarCTF2022 week3的那道AES? 当时没做出来,赛后出题人给了这样的解法

通过上述链接的函数库便可以一把梭(由于不知道p,q的顺序 所以选择爆破)

最后可以得出flag。

bombe-crib

from pwn import *
import hashlib
from collections import Counter

def get_pos(cipher):
    key = "WETTERBERICHT"
    positions = []

    for c in cipher:
        for i in range(len(c) - len(key)):
            substring = c[i:i + len(key)]
            if not any(s == k for s, k in zip(substring, key)):
                positions.append(i)

    if positions:
        counter = Counter(positions)
        max_count = max(counter.values())
        most_common_positions = [pos for pos, count in counter.items() if count == max_count]
        return most_common_positions[0]
    else:
        return -1

def receive_ciper():
	cipher = p.recvuntil(b'pos:\n').decode()
	if cipher[:3] == '[-]':
		cipher = cipher[4:]
	return cipher.split('\n')[:-1]


key = "WETTERBERICHT"
port=31623
p = remote('nepctf.1cepeak.cn', port)
p.recvuntil(b'[+] sha256(XXXX+')
temp = p.recvuntil(b')')
p.recvuntil(b' == ')
res = p.recvline()
temp = temp.rstrip(b')')
res = res.rstrip(b'\n')
table = string.ascii_letters + string.digits
print(temp)
print(res)
for a in table:
	for b in table:
		for c in table:
			for d in table:
				x = a.encode() + b.encode() + c.encode() + d.encode() + temp
				if (hashlib.sha256(x).hexdigest().encode() == res):
					p.sendline((a + b + c + d).encode())
					print(True)
					break

for i in range(10):
	print(i)
	ciper = receive_ciper()
	pos = get_pos(ciper)
	p.sendline(str(pos))

print(p.interactive())

由于一个字母加密后不可能是它本身,所以依据这个性质我们能找到相应的位置。

revenge

from pwn import *
from string import ascii_uppercase
from random import shuffle
from pyenigma import *
from myenigma import myReflector,myrotors
from itertools import product


def get_key_by_value(map, value):
    for key, val in map.items():
        if val == value:
            return key
    return None

def find_cyclic_count(array1, array2):
    count = 0
    used_indices = set()
    cycle_lengths = []

    for i in range(len(array1)):
        if i not in used_indices:
            k = array1[i]
            j = i
            cycle_length = 0

            while array2[j] != array1[i]:
                used_indices.add(j)
                j = array1.index(array2[j])
                cycle_length += 1

            used_indices.add(j)
            count += 1
            cycle_lengths.append(cycle_length + 1)  

    cycle_lengths=sorted(cycle_lengths)
    return count, cycle_lengths

r1, r2, r3 = myrotors[:3]
s = product(ascii_uppercase, repeat=3)

k1 = list(ascii_uppercase)
k2 = list(ascii_uppercase)
k3 = list(ascii_uppercase)
shuffle(k1)
shuffle(k2)
shuffle(k3)
tmpkeys = [x + y + z for x, y, z in zip(k1, k2, k3)]
shuffle(k3)
plugin = "".join([k3[i] + k3[i + 1] + ' ' for i in range(0, 20, 2)])

my_map = {}
for daykey in list(s):
    k1 = list(ascii_uppercase)
    k2 = list(ascii_uppercase)
    k3 = list(ascii_uppercase)
    shuffle(k1)
    shuffle(k2)
    shuffle(k3)
    tmpkeys = [x + y + z for x, y, z in zip(k1, k2, k3)]
    shuffle(k3)
    plugin = "".join([k3[i] + k3[i + 1] + ' ' for i in range(0, 20, 2)])
    key1=[]
    key2=[]
    ke1=[]
    ke2=[]
    k1=[]
    k2=[]
    for key in tmpkeys:
        myEnigma = enigma.Enigma(myReflector, r1, r2, r3, daykey, plugin)
        c1 = myEnigma.encipher(key)
        c2 = myEnigma.encipher(key)
        key1.append(c1[0])
        key2.append(c2[0])
        ke1.append(c1[1])
        ke2.append(c2[1])
        k1.append(c1[2])
        k2.append(c2[2])
    s1=find_cyclic_count(key1,key2)
    s2=find_cyclic_count(ke1,ke2)
    s3=find_cyclic_count(k1,k2)
    my_map[daykey]=[s1,s2,s3]




def get_ciper():
	cipher = p.recvuntil(b'now gave me the daykey:\n').decode()
	if cipher[:3] == '[-]':
		cipher = cipher[4:]
	return cipher.split('\n')[:-1]


port=32525
p = remote('nepctf.1cepeak.cn', port)
p.recvuntil(b'[+] sha256(XXXX+')
temp = p.recvuntil(b')')
p.recvuntil(b' == ')
res = p.recvline()
temp = temp.rstrip(b')')
res = res.rstrip(b'\n')
table = string.ascii_letters + string.digits
print(temp)
print(res)

p.recvuntil(b'[+] Plz tell me XXXX: ')
for a in table:
    for b in table:
        for c in table:
            for d in table:
                x = a.encode() + b.encode() + c.encode() + d.encode() + temp
                if (hashlib.sha256(x).hexdigest().encode() == res):
                    p.sendline((a + b + c + d).encode())
                    print(True)
                    break


for i in range(30):
    print(i)
    key1=[]
    key2=[]
    ke1=[]
    ke2=[]
    k1=[]
    k2=[]
    c1=[]
    c2=[]
    cipher=get_ciper()[:-1]
    print(cipher)
    for te in cipher:
        key1.append(te[0:3][0])
        key2.append(te[3:6][0])
        ke1.append(te[0:3][1])
        ke2.append(te[3:6][1])
        k1.append(te[0:3][2])
        k2.append(te[3:6][2])
    print(key1)
    s1=find_cyclic_count(key1,key2)
    s2=find_cyclic_count(ke1,ke2)
    s3=find_cyclic_count(k1,k2)
    s=[s1,s2,s3]
    hg=get_key_by_value(my_map,s)
    x=''
    for k in hg:
        x+=k
    print(x)
    p.sendline(x)

p.interactive()

写的依托答辩。
关于这题还有前面那题的解法,其实知乎的文章写的都蛮好的,复现一下就能解密。

那么说一下这题吧。

这题的话,其实漏洞就是日密钥被重复加密了两次。然后按照知乎文章所说,我们可以形成一个循环。

插线板啥的直接无视就行了,毕竟日密钥跟只跟咱们循环的个数和大小有关。

我们可能的情况就1万多种,直接无脑打表,然后比对一下就行。

还好出题人设置的是10分 毕竟我才得了11分 哭死。

simple_des

这题脚本太长了 就不放了。
具体做法就是爆破一位字符使得已知明文达到8位,然后爆破key模拟加密过程再跟已知量比对。
求出key后直接解密就行了

posted @ 2023-08-14 20:44  m0feng  阅读(37)  评论(0编辑  收藏  举报