2023 技能兴鲁 网络安全赛项初赛 Crypto-【little_hnp】

admin 2023年11月29日21:15:09评论5 views字数 18394阅读61分18秒阅读模式

little_hnp

根据题目描述中的hnp可知,这是一个隐藏数问题,实际上这个形式来源于2022高校密码数学挑战赛。本题需要解一个aes,密钥来自于secret x y z,那么需要通过三种不同的hnp攻击方法获得xyz。

1.获取x

题目给出了若干组如下形式的方程:

2023 “技能兴鲁” 网络安全赛项初赛 Crypto-【little_hnp】

但只泄露了 的高8位,格子的思路如下:

2023 “技能兴鲁” 网络安全赛项初赛 Crypto-【little_hnp】
2023 “技能兴鲁” 网络安全赛项初赛 Crypto-【little_hnp】

题目所给32组数据刚好能够规约出结果,BKZ优于LLL。

# part1
A = [356167814781366904267218696910405555351526222616808732205256079088526076143317346407693442644010055116546363960164095133759884497841925887458500171929994109708398115455075114082608008837695816495796844261880791427544120645027875851094172229225402351390139122971451851934437128521932706828853055028671825884038817185023400260058060801425921958623959011485644809232680181324577439573049651136194353621089382626790625617272351166158006767831735650826535997476451555457608968304423033305838914881860263689391888022023391635971400983058804413146319652232696496987147414399965164805770427009639155019904825551069668519260921422027004894038704811524031394655327350567704347744649300824745178295819649084526539780165183228300902059842905058839285187659313361650962576085292818891201153602042234761542407317921918176380743926917907500050205642262790375501088749447653192538961941769095390116174184734482070580505942232154601838280334869763041033819934560537064464342503087492378284519470212357826433064146409490490831141215467713642375752174358047945797806394912036159392371419919773636540784752594577753386376314892117629207456257725307588932064164678321624423895326999116234880776873896438659550308182265903511015349887289749187746932743138486464785367013680886610409086932917881380116058358645578582161705110160831268815454501560007213678815148467271066195929894178329390817400037790072774710341643065416463795233080679268648595601029478774875758471506390641424820972236213989454986448247979083323211284869162879484215027121399406834805531673463834771994089209705026613961963787646936400782464449078443638337172753622533365468554428712013061502391069121544652178358767514044569415506263435878597522357209914633582227771666953772776413914105217956486621477363100169491699389485607227056565464340079075807332147592412718102063925714954554138506039136106516266631207214261964356510261535572422887556651518160272971901868272111213132617892029370519322177254795109531838575579273633357811419566887056272012019617233875370059117274159914887131300200553419026977122596309787470156708506128665708409697433371863581053640015148465341330754067693222067588846154338491079164672020284448913361212245534680048800817888816777270292913433441383929287826308796680791192184420514822261858495380645162895339622109484248073742217479376780529412662108337751795388363909156888664448083205561702255068360050935963780971248361778969534551851802629859076303703583702628504189145200772632698437]
B = [1851217419266208189524821622249199122212109361359439419267176165342412725521671156]

def matrix_overview(BB):
    for ii in range(BB.dimensions()[0]):
        a = ('%02d ' % ii)
        for jj in range(BB.dimensions()[1]):
            if BB[ii, jj] == 0:
                a += ' '
            else:
                a += 'X'
            if BB.dimensions()[0] < 60:
                a += ' '
        print(a)

m = 256
s = 8
AAA = [x for x in A]
BBB = [x for x in B]

A = [x for x in AAA]
B = [x for x in BBB]
#B = [x << (m-s) for x in B]
B = [(x << (m-s)) + (1 << (m-s-1)) for x in B]
assert len(A) == len(B)
q = 2^m

n = len(A)-1

AA = [x for x in A]
BB = [x for x in B]
for choice in range(n):
    A = [x for x in AA]
    B = [x for x in BB]
    if A[choice] % 2 != 1:
        continue
    A0 = A[choice]
    A0i = A0.inverse_mod(q)
    B0 = B[choice]
    del A[choice]
    del B[choice]
    assert gcd(A0, q) == 1
    Mt = matrix(ZZ, n+2)
    for i in range(n):
        Mt[i, i]  = -q
        Mt[-2, i] = A0i*A[i] % q
        Mt[-1, i] = A0i*(A[i]*B0 - A0*B[i]) % q
    Mt[-2-2] = 1
    R = 2^(m-s-1)
    Mt[-1-1] = R

    L = Mt.BKZ()
    for l in L:
        if l[-1] == R:
            b = vector(l)
            b0 = b[-2]

            x0 = (B0+b0) * A0.inverse_mod(q) % q
            test1 = [bi >> (m-s) for bi in B] 
            test2 = [(ai*x0 % q) >> (m-s) for ai in A]
            if test1 == test2:
                print('get: %d' % x0)
    break

2.获取y

这部分是泄露了低8位,所以算式会稍微有些区别。

2023 “技能兴鲁” 网络安全赛项初赛 Crypto-【little_hnp】
2023 “技能兴鲁” 网络安全赛项初赛 Crypto-【little_hnp】
# part2
q = 115792089237316195423570985008687907853269984665640564039457584007913129639747
A = [46504565744057869379592149118750005180204315285587793650459698458291497313095580079570939340461826930358262198704994527412343268473276888467470592370940755018512461908745383067917025145719644576790531350933705869781487041273036294713460057838246434192804076595664204927155595158673092664009965681276162112064170108197556011628669636636980833402244661843066392638066798775492563536053526884871731419084105623632272724863769910293366201375037286643905133449526668861483691259176153299953545016594545071502634273940816449539228994050449089428696584726493304129179848865562596308442462003898302617591036702795544969212851359332101276868450990110421905601457823984827989287103931757850844231666586487967579020166384826449093889596467212446696651144748296512384840656191189521000704482028592327584527668705426831094026011935118660265295308551127938221099658025698489812587477460147807281194511606688663328431486059668356909760576538808894076998102467847013020946201384521577320197543440467015636483307894892413455414109262584102970161464024769110183543756690830654690488417772907268774873085435488619613395208820994521773265984299598688734149106712561237976724156548422397088702342592491569137016716248035646478654247053916944621014578628832209303445333219764360624943975012787658147858456979080671688927748963797222499556277754006237442593359493863007223009260764163505327306701416065559119670890356888782973070859682834131446783914422181848793655093515978847439679322767463024355728412455785158772247996074824279449277361992516013331827997769291195218644910192627907899252667979955779930214252166001261827321902921829481012888820731955986576121162922333779220261613224041603413304513743484380982166780444674402881843286093404626255089524793378791280612008824200405479070049526086948144209799352019678059923693118044934151861294461002114985645656470189381446575698436002364241381688523216561715477693516204998933351640306385283282960762303688108067359486227880553515635184409821400123556552143982568717370973322408962909922161031457562287596779866102699954700495813418822123077110802718414467871312378428664286475525704489739846945774686500525169664131752502981230436323839997562475731649322922330998915952913300933165504728647309839568107223013661981482036189531938571461516528131559156846625598018135279924645933404399251785773902176399000408140348035974384721584084912116850770535853002862697858785030649090393757456286025072469553395487982314034855647666332241761382195886203427304567763311291077205482622324404366375181470500496565215770146]
b = [115240228198160178214160961408918615910219293135301791382241091167611618019612118721020814]

T = 2^s
Ti = T.inverse_mod(q)

assert len(A) == len(b)
AAA = [x for x in A]
bbb = [x for x in b]

Z = sorted(list(zip(AAA, bbb)), reverse=True)
A = [x[0for x in Z]
b = [x[1for x in Z]
S = 2^(m-1)
b = [x + S for x in b]
n = len(A)-1

AA = [x for x in A]
bb = [x for x in b]
for choice in range(n):
    A = [x for x in AA]
    b = [x for x in bb]

    A0 = A[choice]
    A0i = A0.inverse_mod(q)
    b0 = b[choice]
    del A[choice]
    del b[choice]
    assert gcd(A0, q) == 1

    Mt = matrix(ZZ, n+2)
    for i in range(n):
        Mt[i, i]  = -q
        Mt[-2, i] = A0i*A[i] % q
        Mt[-1, i] = A0i*Ti*(A[i]*b0 - A0*b[i]) % q
    Mt[-2-2] = 1
    R = 2^(m-s-1) + 2^(m-s-2)
    Mt[-1-1] = R

    L = Mt.BKZ(block_size=Mt.rank())

    for l in L:
        if l[-1] == R:
            B = vector(l)
            B0 = B[-2]
            x0 = (T*B0+b0) * A0i % q
            test1 = [bi for bi in bbb] 
            test2 = [(ai*x0 % q) & ((1<<s) - 1for ai in AAA]

            if test1 == test2:
                print('get: %d' % x0)
    break

3.获取z

和获取x思路一致,但是每条方程只泄露4个比特,这就导致算式数量增多,也就是矩阵维数会变得很大,所以在规约的时候只能用BKZ并且要调整block_size稍大一点,所以这部分的求解需要用到高性能cpu,否则会很慢,我用的AMD Ryzen 9 7950X这个核心大概需要4分钟,普通笔记本估计要10分钟以上。

m = 256
s = 4
A = [5666642265966530695761334196610413918843088704036938269981106696573465203857941608423494025514337106193470276163502869431432921281068110444274310186909892953126455779963774893318593797293677915391819954033070712422516633062608240591140070890828267889083113973119156386688627136904030972811367959126716342939037747060254929788842803954384013427643356785476663429466190647923620064499085167265570384781545307301479187933437206481537999752352862466291209724038113997101015220564168271842813302532972922828562060680762307341661161853013181455988735962209181739646224538014785973955076133635197778363543197780067476287259438027624009229316285089733096984855722192455882261943520616685637348255882115360387041856575123107349887176488814324533329129026453912394888320971261329267375886676505352214170055690076399210392233536212648691449043811907699788304323020167322703396382358219695469729340000156047987785894130782534931231239590846517796724693810353256110303591718873843585558937781709113232176049614134229110476911183528409932385631377040635032167229294859921626233104995069707326026339138802769567663525702758484770011953309414505880798829296312220800518979771087384119505765412367034568327934610135950576686832475926868625980823646137708721144274502948988151451581106410242901935635172282345017024946508877524950739600946693670273230261533720839589755726946308581706825676138619972092199256497988691434636966491189140375163103788631571754997406587853628315763740232022272529908653383795002294860870129574984518813560375272257703512940569602004100135751785995415247695765442899140606914076750888419237400306294448451415863856135348583766054086672915327012846665608509156899413542027860149686491394573849624613343073398875096835373266216231270507911441741516307148508299134459055980481790171446152748793757788577465044360548729573345122559743628093363153712802771729941379696892927196240753791024893171995331265611917224605053140261104462234824469430243261354345734972764376690606146128560022076419277471942661645608592238553211026765171133932914665208437061006737371681617832192474879110165362973067849369511422852288512059352261854178896712278521473794615786799974467527492811608068163160348674720595757862332879609098404557441577413104820418848431264436739476626570855375968797020740015928445093791398608121515539682981568707757810125152293233312491502319291027689502160168836861155869785763844840628789800333625015337751638405696233468515566263356197320268202190223769102427595787595418722722430130631701884337456325150921017413824991597185452849297510712509903507504400381642620605543789042846636554358542220293238188618694699511483779321185024950255977801474453881858185354369860946591141828290326318106075675400376494727652238700194652814774183010201068504804325113065917577571378110979420025552951037146509246019060787050838375479531616007528228386255429849762380955520557448208384572772400405309708977900727750338226215580736713518435504470976317226567694106309089721242883671692855591428963055832013908414537168053334202939999965180267668066544250008299194709335544324954010316218059328520840928370924328960454198116073475240703647573736616851363995779497838393873967416263773424001884824046398274116211718441728748978007724663342692578897835306531149963820453230896926734309139679809662340468425437092660648946416171203559401945669998573205329748734005210989064607057470628982156110053428392237353478998997049131055254070739073144647850130940637594508205137573428882665776681105451583703993157244923072125860465831730951281497411610019673353796508595019468595537500010909399217450133587528313928622717009905225347437565313785513209640089774615470542738609094428582520494819235590300636394350574821767928598826358822665580804100082563843834984111569775161579235003164486964424297190010710116212288045994884168253983939992794298642423963632550451160464749112805064796887052842308612174999811185169376275974813705050669269621826403202952690701032773575777386532603807823867965270701285532095259691916661855293839002194314540172331848184285108883834800882625800360649763589858009856932260835755554608637276169283720520017179885510906525157553460862756052577676098979682650954216202311601813089916970156784884278240596741668163729505020916741260622892376518399955871040594089958001435228370511795620182810511005579057139040420868884358560319280084387838252932335991412352886114610385776066172012664155317843790423022518639753138262519729890141457716216773019826138388668631802438257125635553635188923648647999357709175942346094185340627483007875838945753982677965177087293687053018953448675487050703226841119623778529018444028012286789827488056010371316350520326933959183263942729203795748343586311358505204001231181715262165192654617470403436941820780636059373597907139256096503008028224334771028807273628056037391407459560685791940303889130903300826670504540880052248457486273267890534259909228317630411581741393219101657975375635465630038663783139226789172948688214450192418033420659105555166285951114510887553874468445434061568696955999973635204718196999397872455003700316820021110585615030124105651373896449722407959864861246977441656611015023595260258712910307213363148592291757077360397354551024010332826591443543095511318218785084710507144978638037070265792700633889531223049140673960163193950157799718449687610155956466664584407994849643309852597058382709330320178211097227208297941083145696832977481706385123240351386677526237953026854755659089774125668886575190929308630356016099052460641608176608984436047558005161397618710090739791225737136157467487063026530735850363136522687472196852313490264738121297870888865622205528370718545083036459031337997071672711409981258706194248193384098452487196415662749970728495574498665948033818535089061777923600472940607544233765056432954135882530785013240455908855171502152827770214700998108134515682426307248182585404948837419102320140727266645854933195464261935653460848486313092926894660444918084980770638216338820128472516206673140707832392507376278438391878305860067531640486978712479618549593532447916095131216323237767823095149213400194122742220342454526501169051715095581260775046570239718771931556389526206226049816877252622825028481234412013581804081798123571329306780957341285518720088349166794662072985988305587217880700047968902626265925030369256904999532412018441796234633098933170132668083741302060766396063105147403251247075625010635812684098388295947387936017295489536154045642652545806271682408697170685996125062326106069117227627865988038851006615609777159985287487409738006940292330545145534325523013507574034822194527731124114435339982134962973613971555354158196963167628621409756463076789894474754662264316322414026301495493219532122904365609725269502635057676962583581851475921482302591306344959978794545764642902378696569476328421478278181631073787843670864488143804991215578771088603068008424376409531535707054655011874902509148216373200775460776936111615354113691292022145271355849518605344621718116294468846185203111794890637243685470251322847611104575967937432349892347995869193697548438927514142414931922844911238950538182077875364260947640456262108211092497417001713392007041993345578071535924312884292159182314202796515340797288002505186265430063222078901533504127429775824011937168504001440973103705584099775762177360247333044906053377697513988686447523533297010857158808554452773325642583646771563848551242126815810681240062390672101431228750176442439543087557384586934508503337415239615610891345106193584221920864389152087560188260652160092982315871571692181571481755657851488799856917250454962659118868410681407610505639413360155750292433833801452703135528066004669796386925101704795733053841911703671961494738444465175448181076451900276290620898446452677602947514592865112273073526687875185178672676762478045105155459992837095063936478046828703940378034575841985514278230173520682616655688427241752929498638616275480985470608873569998909405046919540]
B = [1114121131511412121562151315661112293150141010131061369049015521312125113312135514151210968584121151141111146106314101014515641315474137014672141146914413]

AAA = [x for x in A]
BBB = [x for x in B]


A = [x for x in AAA]
B = [x for x in BBB]
B = [(x << (m-s)) + randint(0, (1<<(m-s))-1for x in B]
assert len(A) == len(B)
q = 2^m

n = len(A)-1
AA = [x for x in A]
BB = [x for x in B]
for choice in range(n):
    A = [x for x in AA]
    B = [x for x in BB]
    if A[choice] % 2 != 1:
        continue
    A0 = A[choice]
    A0i = A0.inverse_mod(q)
    B0 = B[choice]
    del A[choice]
    del B[choice]
    assert gcd(A0, q) == 1
    Mt = matrix(ZZ, n+2)
    for i in range(n):
        Mt[i, i]  = -q
        Mt[-2, i] = A0i*A[i] % q
        Mt[-1, i] = A0i*(A[i]*B0 - A0*B[i]) % q
    Mt[-2-2] = 1
    R = 2^(m-s-1)
    Mt[-1-1] = R
    
    L = Mt.BKZ(block_size = 28)

    for l in L:
        if l[-1] == R:
            b = vector(l)
            b0 = b[-2]
            x0 = (B0+b0) * A0.inverse_mod(q) % q
            test1 = BBB
            test2 = [(ai*x0 % q) >> (m-s) for ai in AAA]

            if test1 == test2:
                print('get: %d' % x0)
    break

block_size我选取了28,在测试的时候选取25发现出不了,因此再稍微加一点。

4.解AES

from Crypto.Cipher import AES
from Crypto.Util.number import *

x = 80894527713686705071002739476859399489995408997139964746730066805048451766071
y = 98898469313641499500896146398219768802603949220366063599597841309427897612653
z = 95734616889198769749359730283416405421230182774636752744567175201992927509949
c = b'xdaxfcxb7x93xfbx9dxbex82xb3xb5x87`]}x0b*xd53ARx8bbxfeQ,xd9xffxf6nxa2x1b)H\xf24>Exac+x01xf3)Fx8cxeexb8jx18zbxa8x8bxbaxbcxbbx03xbb}xb6x8cO#xebx0cxcexbdx07x8aWPx90xf2xaepx02x11{xdfxc5'
key = long_to_bytes(x^y^z)
aes = AES.new(key,mode=AES.MODE_ECB)
print(aes.decrypt(c))


原文始发于微信公众号(中学生CTF):2023 “技能兴鲁” 网络安全赛项初赛 Crypto-【little_hnp】

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月29日21:15:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2023 技能兴鲁 网络安全赛项初赛 Crypto-【little_hnp】http://cn-sec.com/archives/2251389.html

发表评论

匿名网友 填写信息