[DASCTF2024八月开学季!] Crypto

EZsquares

题目描述:

from Crypto.Util.number import *
from gmpy2 import *
from secret import flag

p=getPrime(512)
q=getPrime(512)
n0=p**2+q**2
print('n0 =',n0)

e=65537
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print('c =',c)

# n0 = 192573744538639130845868727014075967669513667763315934161849620531683536696376138303320681922782003088094539724238109116416456294472461075668568088688287209898850985024632463251984323888765249950269595045648435192047990940593817086918399212487934262786817996341234806934640246045717955941049031252181676005098
# c = 1541487946178344665369701061600511101386703525091161664845860490319891364778119340877432325104511886045675705355836238082338561882984242433897307540689460550149990099278522355182552369360471907683216881430656993369902193583200864277424101240184767762679012998894182000556316811264544736356326198994294262682

题目分析:
直接用sagemath自带的函数解
exp:

from Crypto.Util.number import *
n0 = 192573744538639130845868727014075967669513667763315934161849620531683536696376138303320681922782003088094539724238109116416456294472461075668568088688287209898850985024632463251984323888765249950269595045648435192047990940593817086918399212487934262786817996341234806934640246045717955941049031252181676005098
c = 1541487946178344665369701061600511101386703525091161664845860490319891364778119340877432325104511886045675705355836238082338561882984242433897307540689460550149990099278522355182552369360471907683216881430656993369902193583200864277424101240184767762679012998894182000556316811264544736356326198994294262682
p, q = two_squares(n0)
e=65537
n=p*q
phi=(p-1)*(q-1)
d=inverse(e,phi)
print(long_to_bytes(int(pow(c, int(d), n))))
# DASCTF{4028d59bb18028e2df8d5d51b376908c}

EZmatrix

题目描述:

from Crypto.Util.number import *
from secret import flag

p = getPrime(512)
q = getPrime(512)
n = p*q
part = [bytes_to_long(flag[16*i:16*(i+1)]) for i in range(36)]
M = Matrix(Zmod(n),[
[part[6*i+j] for j in range(6)] for i in range(6)
])
d = getPrime(920)
phi = "???????????????????"
e = inverse(d,phi)
C = M ** e
print("e = ",e)
print("n = ",n)
print("C = ",list(C))

'''
e =  75759282367368799544583457453768987936939259860144125672621728877894789863642594830153210412190846168814565659154249521465974291737543527734700545818480398345759102651419148920347712594370305873033928263715201812217658781693392922382633382112810845248038459857654576967447255765379492937162044564693535012144718871564964154729561032186045816489683161588345299569985304078255628527588710513640102450308662163641732851643593090646321420800552303398630738674858967724338819227042384745213425656939930135311339542647104499427215254435723921505189649944059658797193927706249542240737884739119223756635540945563449010120382834036979025801446796614280064172405549502694658175837126702821804106928800917035327292099385809060363635737715320709749444795680950552240184529017581997661357846852201424248086080872655164246614710423850620222735225702427025180018637830386631573912505087046428427137407828859500285127835020183526681560129322020299774376860830513167598911105104946612301909005028216010756378307303924865571457872055817289904093797943893894249094212422766513999129665299858860878710920689322752152527130981697461526170099006972245891313788064563118647308122107999430867808150749979046611265769861111738145184897880080810883790769899
n =  99231341424553040688931525316017803824870567327100041969103204566938549582832516706206735181835068382521133899811339836861525260134721134887446163174620592328661881621312114348726944317349680760092960665800660405612177225373482880941142930135489885221592416840149732795379174704611605960303340578163595465083
C =  [(60962492392910372655829579800623350869143417412923809005355225641547310999689300067771076642840347631213921261735160280073159348909580620372515144615183619484116931277062459534426852453669020768212186583219050186476749582255169630649290603191487938394564254993928830585225872994041844749592189414050346998498, 47570494768722430855321464941025696993380565713448923284620084505935271175106089198810572053594395338695564872188782440522323916637635901100372244111566233734761590240981688569861120646443206802056135646056594081150032676095454677651908656653983161086373605006880681566863747858292744224442976621418797205399, 2688181329187093888869457776665971472383024590564085347482816443420850842347573980241749337291795284050213197900458997704783513811033569074013164405426061208943782009246429930688449460037973029867946269202889059604686278471272132218340037450771429686919881716403514347492132483441838117219973263406807217974, 69152734772841729744864181378357911157430121423043131526556925765272499517864120668258106865684921607378129493604079173227751534891590136750575722628168425004031909583828469631788511241718967754283602045554638710656882949816656201393892265416912928916418003936183428716201442550333656679935723677385561024921, 87916597194547447124625284021545845894398798075569904698700457948229723401310121661631733143462834474179528341099541302790092417595967636978700000869424652408571342615122171893834241191682257315189450299073036702171002969055277890180093192346807050020075074678160917020003175299572457770301172013554859610885, 87786307503376954316030650346838348696800737186248037233105303922917125487679342882764384018020917373783494097970572084301842435397667036289687253696282531883479674194433525871169279787175003732384644823866404707423021568914833613783558731218680259786594673087000922732933203580338582174836542335256895112774), (19925935729162396840966340912353714097004160798615839580675147896543197999100114040514331382227016633727621399922875280921939403294675089237685490824481702911947235694589943642920569884248825154743655331893278941153597853907070809496035573765953115001007513406579011860142499904738601402936261081671704883289, 58482679161881651450519578125499657069493057728415805326447380380141486533923095749022382883536937182057631317376727990670863971670749991637396946761762614232393617646003704455294405699238388026259395339494678908761885707645569206191899296873833133914051981244247283254577922595285757876026540914747153605160, 7876769535761750153866264956186319035785652316141088148036849233806135397857747677246966644027825150213665232397824678749874814778004967045900692519991198396803997342682950493474998693632762775853085063006163824393616781789234994435613494739078376441202546497376889898623686582966994626392473756048641752814, 40374752091452840478156903709507048899177048294570218656121556350119195781557565218138424538202862806990185673750490061744496157480684671895195643247659670629323773035075555928457149898576983418457948777991721866891250461708466719417665721953156700367709890061169794698483650373164167487545578780062511325698, 4123966761831135761457937397066767492577970106907260057338733132356073163290362041428543487785541800166623333444500095074624068090394361249458065855973762485004782025486942019551010253665248191341796357273736185376285833313657930327592630423321995683340268803166901859312919131785819655040568361583085676057, 27583730178148494208215582336953731428677655384934947406110969819755861309635715916436503750399886946834588631955424622786954747202685007199149082525818506387606813299614560669074223670606725332129580433663793218302408230595218329795347716963182007259165979155950826829268655927501949206255488502388472700075), (56315845708240095082772501761675446313947442745181474765872020399653138411744471022394674490163519262253419142994958571123783825827944495254330717218087742852853691152509996374039921954037271141012224417462582306680805308244999271694256058220813474581635472407864886498830142166123949972548432270703952960923, 32896154872958176487612097856128071067779298934826306391422436791812001537876365873180665334382055349578758924117227229354892419126981829368419291413849009911423713613087552037524220081917635206657387768281003765094819963853123278586621439766100307324554778715337379588648264826773884692017793176376154675501, 28403727117575806889742293164072634954876499471182701829204385629161049158547263968390684814088323042021380910604906904467751008743919604654911693492973603888427448583482505774314038985928231290890291117425907291509663229092491530818877566758210084483466899541610500708571206332019126409191398637035395635692, 7821951828810668315162755325480202107754899640542890161681114897656891485110009850481857086945730357655734989848039495868447513739566035840945273281198690239884406844038006297455016615584047106189557019820282710249181355660515976689844733069965635239977868606412950428777686615619878916256034858820314322668, 76525192903457309209366743987447032158337732768547571793488111729224008602119438154849638971504949003719786026252648739617917436256435628300010323711153402229164528979259259214627588535459760359253880641429469562048622701982862831594514336875830284504454333566487968184255876886415003174627552219974082980636, 30637464791180430144279994098478365983230561289862073957684155866766012864169717451278445846218491051030419180119954192685431439312797317764656461287947635921370686618109628728836641249249386071858927735736888632316823543835130338563924434711937538665035969023712380857260473274001732469412322752873384968601), (10730358875712453042013970789576402939218800351221446191771233177536009349624025030667973532521911666593354783762941362456771050299436815799063691625091095782507693177746119034551757951243518170991606414822107132916004609627849551446847131359143181119565430368982878108761799084029033027032755115381679417096, 24507369071589713103970720335832744954845520380398828656842561115495704802037030133393011751145702976684589338927049344552393322139237977140642967325628644800492714995845105460369698708659335653391904302955502145025551463160676476446189657801618085294176671181454800483878164016749534940141884944397289890871, 92820108862600030043211342419176390123942091097153321737988513673868731991771619676009296651860321326370172965558922130850493512979555339094561381645396270883677588661828281447106070801829307329117814743685760943125981155705527918307567109500089138120007989551366153992391010620955360882383556542559392894262, 74641576048678849575812629186393953979307695146586927788280165573903662821064189347983936198087197963380651069815352351349775566210254797203960521484844402002602126951649571328507275278196835502471467819034725531964918681611446773963678730681425674462738816516031202042449731753950180027830876790421576081225, 66685821407492303211977447210040267021195326010645045932118328414906080616013267240390961550749369776862683674842903750593917463844615658362977613737130311357170777497628656513144020197746398798679807363859886437403991016453908185102814636772479260178297629433510961788244743608125906745012445887428376915629, 37645288166396858415565430454995281883016537193725289151596326083427351314771501111923193754508050507668744794821015166055917903051072319801945727142824029386542877351207944394255175419467949702189317844980323590614559226315219797417693447676522076956364574845889800486817292590561738321483697160713821529546), (9736711624136652052770116447223295880053359374932369087990200046581983386760557572632286124794444930134179594903564091220200006471388531967010990324827682059485960618855287386961552241259199988445679075595951186424593845864059162998542185539998139746836413273921569266377169025136169016355692767128488900477, 13089476325068401303987570656586592581224347700750455041713556437672762444853346450009029644985692097286649094772508755542691510307531122589433151470493395688605259544275677288082873918929554397272543678133089309672143858040052870098814015145664055945998991679722753687104989489973852117933261358247564988071, 61284598700800926964424249048307178141566077849519756690996988745704530644294308600472621437373651397677668023765897304421576611779363230148263097867987781840048890597647956492658737562151147335685622316577395377277998529914754048562837674418322097396064634364367313407061824216514715793677445932930269152481, 61301319985121628512628256322255391212515053807722664632938090246192955763394429545800696862309263991966900735678875111077481123759702692720133903430321183178233894849098114454863008686201888641863850157441070304164754292432907144839124698488730051010247980425937242664545487287543260612682886985351085138001, 47435322189871012567009786652825469952862610804330828872313845269622590943796389601479086952212526668296575803391674745677862994957044749158154034984601827088557466296368252473168676311089972605318362738347163748086202789713353987691976193103958097243650266229294687864565520648709873760054473254540098351391, 32817913908586741358496040992834207477154835734595147264489781242919114343572982132460531399879345665767073663537263426565698777735998027473421290120433416805825431315476774452072722260737533264180361001819202057517709886953362750990747046346025917668519097056756157788411735612581204089155228884131378072233), (12642425264267098423833241400926732957307073786117649292717736141221694320062979757108242390714162456346780855636174573171779655212347730635821416215537084671118355916330992142141813099104775940725892721614126911510988568345398817554586646066735943804403563179908909629802981392776238272786744291004069356775, 32752716826697049825682788062896730338057604164648704588810956358313907785865814197561208570319757370744105618622052812423057447877481397095444475610617492626525875388680227635541658500637643262806846291312209615044898925278862926827256312481616510480170805540775256088922398310392639344678087647083653765821, 3022511069721965916815622985038080358228403264264831484927372260512043862778138035440859308822033467592971930633307565996150364843965884881400481310689834508879168477508572967173126034539725429899016318805136722734731136521866714013050522337795295311863953350784370773653485436181314864092331268367915892666, 44494293452595159373079306455244053834138260846967620303725161277545981351217523341157156495183639822519882035281721714315331475283644457723353767200184408989752610854962070029226464081899523388838531578296754646973186313035869250105084114692966907900349716132438711767401573694320357418158987949401765528425, 66130193533773704471809811407675367482896080993725170656227230634400122250448911267627547029162335780439769273413020435641724884803365183531498010730643595588304390566255555816793888715047993688213860064650538998545316010718479287163068234420541010586467244361311016741807424118408290204453770332676360498896, 74649855891297747785048523345822478110464591680545397129030301786991725968732851407232435476064324066227685639784066521927825943853534396958155065514682624920312291149309530337681973006060504366672574864594730979571926592855426800301765737184843799883674936189745414847240093702374870446528449267420369306618)]
'''

题目分析:
连分数解吧
维纳攻击(连分数)
exp1:

from Crypto.Util.number import *
def continuedFra(x, y):
    cf = []
    while y:
        cf.append(x // y)
        x, y = y, x % y
    return cf

def gradualFra(cf):
    numerator = 0 # 分子
    denominator = 1 # 分母
    for x in cf[::-1]:
        numerator, denominator = denominator, x * denominator + numerator
    return numerator, denominator

def getGradualFra(cf):
    gf = []
    for i in range(1, len(cf) + 1):
        gf.append(gradualFra(cf[:i]))
    return gf

def wienerAttack(e, n):
    cf = continuedFra(e, n)
    gf = getGradualFra(cf)
    for d,k in gf:
        if d.bit_length() == 920 and isPrime(d):
            print(d)
e =  75759282367368799544583457453768987936939259860144125672621728877894789863642594830153210412190846168814565659154249521465974291737543527734700545818480398345759102651419148920347712594370305873033928263715201812217658781693392922382633382112810845248038459857654576967447255765379492937162044564693535012144718871564964154729561032186045816489683161588345299569985304078255628527588710513640102450308662163641732851643593090646321420800552303398630738674858967724338819227042384745213425656939930135311339542647104499427215254435723921505189649944059658797193927706249542240737884739119223756635540945563449010120382834036979025801446796614280064172405549502694658175837126702821804106928800917035327292099385809060363635737715320709749444795680950552240184529017581997661357846852201424248086080872655164246614710423850620222735225702427025180018637830386631573912505087046428427137407828859500285127835020183526681560129322020299774376860830513167598911105104946612301909005028216010756378307303924865571457872055817289904093797943893894249094212422766513999129665299858860878710920689322752152527130981697461526170099006972245891313788064563118647308122107999430867808150749979046611265769861111738145184897880080810883790769899
n =  99231341424553040688931525316017803824870567327100041969103204566938549582832516706206735181835068382521133899811339836861525260134721134887446163174620592328661881621312114348726944317349680760092960665800660405612177225373482880941142930135489885221592416840149732795379174704611605960303340578163595465083
wienerAttack(e,n ** 4)

为什么是 n 4 ,文章里面说的挺清楚的: 为什么是n^4,文章里面说的挺清楚的: 为什么是n4,文章里面说的挺清楚的:
在这里插入图片描述

题目中当 N = n 4 时, e ≈ N ,故用 n 4 (满足条件 d < 2 2 g N 1 4 = 2 2 g n ) 题目中当N = n^4时,e \approx N,故用n^4(满足条件d < \frac{\sqrt{2}}{2g}N^{\frac{1}{4}} = \frac{\sqrt{2}}{2g}n) 题目中当N=n4时,eN,故用n4(满足条件d<2g2 N41=2g2 n

哎呀,一开始一直弄那个phi,矩阵的phi这里我确实不是很懂,后面知道了但发现我压根不知道p,q,求出来了phi也没用啊,所以就 换个思路啦

如果给了p,q,那么(6阶矩阵):
order_p = p * (p - 1) * (p + 1) * (p ^ 2 + 1) * (p ^ 2 + p + 1) * (p ^ 2 - p + 1) * (p ^ 5 - 1)
order_q = q * (q - 1) * (q + 1) * (q ^ 2 + 1) * (q ^ 2 + q + 1) * (q ^ 2 - q + 1) * (q ^ 5 - 1)
phi = order_p * order_q

EZsignin

题目描述:

task.py

from Crypto.Util.number import *
from Crypto.Cipher import AES
from secret import flag
import hashlib

p = 174523845247570741054964008585718839267
E = EllipticCurve(GF(p), [0, 486662, 0, 1, 0])
G=E(2247961404505753398791635923994899528, 108711418033303501028455466081133667288)
n=G.order()
Cofactor = E.order() // n
f = 128+1
lambda_ = 100

def retbar(P):
    index = (f + 1) // 2 # 65
    return (int(P[0]) % (2 ^ index) + 2 ^ index) % n

def genkey():
    w = randint(1, n - 1)
    W = w * G
    return (w, W)

B_pri_w, B_pub_W = genkey()
print(B_pub_W[0:2])

LS = []
LR = []
BR = []

def Exchange(i): # 10
    A_pri_w, A_pub_W = genkey()
    A_pri_r, A_pub_R = genkey()
    B_pri_r, B_pub_R = genkey()

    sa = (A_pri_r + retbar(A_pub_R) * A_pri_w) % n
    sb = (B_pri_r + retbar(B_pub_R) * B_pri_w) % n

    Ka = Cofactor * (B_pub_R + retbar(B_pub_R) * B_pub_W) * sa
    Kb = Cofactor * (A_pub_R + retbar(A_pub_R) * A_pub_W) * sb

    assert (Ka == Kb)

    leakageS = sb >> lambda_
    leakageR = B_pri_r >> lambda_

    LS.append(leakageS), LR.append(leakageR)
    BR.append(B_pub_R[0:2])

for i in range(10): Exchange(i)
    
print("LS=", LS)
print("LR=", LR)
print("BR=", BR)
H=hashlib.md5()
H.update(long_to_bytes(B_pri_w))
key=H.hexdigest().encode()
aes = AES.new(key,AES.MODE_ECB)
print(aes.encrypt(flag))

secret.txt

(56142839234500040174315077324489019612, 143186177525574678948140963663687495447)
LS= [12160779, 70634852, 136488679, 93279448, 51769705, 99408367, 94011238, 46255543, 136054320, 126842658]
LR= [117789932, 85602320, 136131278, 85538539, 33115646, 15821127, 122073977, 40205177, 40509142, 121833940]
BR= [(43128875586771925869851532015581155657, 108714366549720544283054523544596695631), (166053844834143846221197595138208659402, 9389299139547698081250285594708260233), (83160043610860066750778648875060399604, 160655466348101518011620435983302563358), (18306927902958362110653472691194540502, 141566997533915037448387258113883793369), (124719869188706449552550102421264489653, 111266021208672789646176095367638959348), (62115794167524204331339724293036031704, 24476842210910012261000793337134128911), (57017187772347635647835418540384524017, 149273114828279413180900590599119201032), (141865913804035015431129030802262884043, 11219445710980991629921733217597739715), (35994282847505215202392163277052083355, 5366425669461724819918825109516828913), (72621299937996657982583201267406651177, 39297013522202608324989011761142875947)]
b'\xd7\x8c\xf1Yx\x05W\x8ckq\xfdb\xd5\x81K"\xe7q\x88\x18\xedq\x9f\xcap\x1cTB\xc9)\xe1c\xf4~\x7f\xccwh\xfe\t\xbf\xb2!\xde\x84\xeeO\x0f8\xd1\xac\xbc\x1c \xf0F\x0c\x00\xc9\xa7\x9e\x06\xdan'

题目分析:
代码很多行,但逻辑很简单
W b = w b ∗ G W b 和 G 都给了,要求 w b W_b = w_b * G\\ W_b和G都给了,要求w_b Wb=wbGWbG都给了,要求wb
又有:
W a = w a ∗ G R a = r a ∗ G R b = r b ∗ G S b = r b + w b ∗ f ( R b ) 其中 S b , r b 的高 94 b i t 已知, f ( R b ) 已知,求 w b 变一下: ( S b h + S b l ) = ( r b h + r b l ) + w b ∗ f ( R b ) 再变一下: ( S b l − r b l ) = f ( R b ) ∗ w b + ( r b h − S b h ) 一眼 H N P 化成这种形式: k i ≡ A i ∗ x + B i ( m o d n ) 令 ( S b l − r b l ) = k i , f ( R b ) = A i , ( r b h − S b h ) = B i 其中 k i , A i , B i 均已知, k i — 100 b i t ; A i — 66 b i t ; B i — ( 94 + 100 ) b i t ; x , n — 128 b i t W_{a} = w_{a} * G\\ R_{a} = r_{a} * G\\ R_{b} = r_{b} * G\\ S_{b} = r_{b} + w_{b} * f(R_{b})\\ 其中S_{b}, r_{b}的高94bit已知,f(R_b)已知,求w_{b}\\ 变一下:\\ (S_{bh} + S_{bl}) = (r_{bh} + r_{bl}) + w_{b} * f(R_b)\\ 再变一下:\\ (S_{bl} - r_{bl}) = f(R_b) * w_b + (r_{bh} - S_{bh})\\ 一眼HNP\\ 化成这种形式:k_i \equiv A_i * x + B_i \pmod n\\ 令(S_{bl} - r_{bl}) = k_i, f(R_b) = A_i, (r_{bh} - S_{bh}) = B_i\\ 其中k_i, A_i, B_i均已知,k_i—100bit;A_i—66bit;B_i—(94 + 100)bit;x,n—128bit Wa=waGRa=raGRb=rbGSb=rb+wbf(Rb)其中Sb,rb的高94bit已知,f(Rb)已知,求wb变一下:(Sbh+Sbl)=(rbh+rbl)+wbf(Rb)再变一下:(Sblrbl)=f(Rb)wb+(rbhSbh)一眼HNP化成这种形式:kiAix+Bi(modn)(Sblrbl)=ki,f(Rb)=Ai,(rbhSbh)=Bi其中ki,Ai,Bi均已知,ki—100bitAi—66bitBi(94+100)bitx,n—128bit
构造如下格:
M = ( n ⋱ n A 1 ⋯ A 10 2 100 2 128 B 1 ⋯ B 10 2 100 ) M=\begin{pmatrix}n\\&\ddots\\&&n\\A_1&\cdots&A_{10}&\frac{2^{100}}{2^{128}}\\B_1&\cdots&B_{10}&&2^{100}\end{pmatrix} M= nA1B1nA10B10212821002100
Z为自己需要构造的数(确保目标向量中所有元素大小与 k i k_i ki相近)
( l 1 ⋯ l i x 1 ) × M = ( k 1 ⋯ k i 2 100 / 2 128 ∗ x 2 100 ) \begin{pmatrix}l_1&\cdots&l_i&x&1\end{pmatrix}\times M=\begin{pmatrix}k_1&\cdots&k_i&2^{100}/2^{128}*x&2^{100}\end{pmatrix} (l1lix1)×M=(k1ki2100/2128x2100)
exp1:

p = 174523845247570741054964008585718839267
E = EllipticCurve(GF(p), [0, 486662, 0, 1, 0])
G=E(2247961404505753398791635923994899528, 108711418033303501028455466081133667288)
n=G.order()
print(n)
Cofactor = E.order() // n
f = 128+1
lambda_ = 100

def retbar(P):
    index = (f + 1) // 2 # 65
    return (int(P[0]) % (2 ^ index) + 2 ^ index) % n

def genkey():
    w = randint(1, n - 1)
    W = w * G
    return (w, W)

WB = E(56142839234500040174315077324489019612, 143186177525574678948140963663687495447)
LS= [12160779, 70634852, 136488679, 93279448, 51769705, 99408367, 94011238, 46255543, 136054320, 126842658]
LR= [117789932, 85602320, 136131278, 85538539, 33115646, 15821127, 122073977, 40205177, 40509142, 121833940]
BR= [(43128875586771925869851532015581155657, 108714366549720544283054523544596695631), (166053844834143846221197595138208659402, 9389299139547698081250285594708260233), (83160043610860066750778648875060399604, 160655466348101518011620435983302563358), (18306927902958362110653472691194540502, 141566997533915037448387258113883793369), (124719869188706449552550102421264489653, 111266021208672789646176095367638959348), (62115794167524204331339724293036031704, 24476842210910012261000793337134128911), (57017187772347635647835418540384524017, 149273114828279413180900590599119201032), (141865913804035015431129030802262884043, 11219445710980991629921733217597739715), (35994282847505215202392163277052083355, 5366425669461724819918825109516828913), (72621299937996657982583201267406651177, 39297013522202608324989011761142875947)]
ct = b'\xd7\x8c\xf1Yx\x05W\x8ckq\xfdb\xd5\x81K"\xe7q\x88\x18\xedq\x9f\xcap\x1cTB\xc9)\xe1c\xf4~\x7f\xccwh\xfe\t\xbf\xb2!\xde\x84\xeeO\x0f8\xd1\xac\xbc\x1c \xf0F\x0c\x00\xc9\xa7\x9e\x06\xdan'

M = matrix(QQ, 12, 12)
for i in range(10):
    M[i, i] = n
    M[-2, i] = retbar(BR[i])
    M[-1, i] = (LR[i] << lambda_) - (LS[i] << lambda_)
M[-2, -2] = 2 ** 100 / 2 ** 128
M[-1, -1] = 2 ** 100

L = M.LLL()
print(L)
res = L[2][-2] / (2 ** 100 / 2 ** 128) % n
print(res)
# 1178130499626730132053516695382476673

到这里就一直出不来了,那就是求到的x有问题
开始测试,发现不管怎么样求到的x的后36bit是不准的
所以题目中的数据得到的x低36bit应该也是有问题的
这时候B_pub_W[0:2]的作用就出来了(我说呢,为什么会把这个给出来)

所以问题变成了: W b = ( w b ′ + k ) ∗ G W_b = (w'_b + k) * G Wb=(wb+k)G,其中 W b , w b ′ , G W_b,w'_b,G WbwbG 已知且 k k k 为36bit,求 k k k
k 是 36 b i t k是36bit k36bit 不大,我们使用中间相遇攻击进行求解
令 T = ( W b − w b ′ ) ∗ G = k ∗ G = ( k h ∗ 2 18 + k l ) ∗ G 其中 k h 为 k 的高 18 b i t , k l 为 k 的低 18 b i t T = ( k h ∗ 2 18 + k l ) ∗ G T − k l ∗ G = k h ∗ 2 18 ∗ G ( 此刻即为相遇的位置 ) 之后爆破 k l 和 k h 即可 令T = (W_b - w'_b) * G = k * G = (k_h * 2^{18} + k_l) * G\\ 其中k_h为k的高18bit,k_l为k的低18bit\\ T = (k_h * 2^{18} + k_l) * G\\ T - k_l * G = k_h * 2^{18} * G (此刻即为相遇的位置)\\ 之后爆破k_l和k_h即可 T=(Wbwb)G=kG=(kh218+kl)G其中khk的高18bitklk的低18bitT=(kh218+kl)GTklG=kh218G(此刻即为相遇的位置)之后爆破klkh即可

完整exp:

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

# part1
p = 174523845247570741054964008585718839267
E = EllipticCurve(GF(p), [0, 486662, 0, 1, 0])
G=E(2247961404505753398791635923994899528, 108711418033303501028455466081133667288)
n=G.order()
Cofactor = E.order() // n
f = 128+1
lambda_ = 100

def retbar(P):
    index = (f + 1) // 2 # 65
    return (int(P[0]) % (2 ^ index) + 2 ^ index) % n

def genkey():
    w = randint(1, n - 1)
    W = w * G
    return (w, W)

WB = E(56142839234500040174315077324489019612, 143186177525574678948140963663687495447)
LS= [12160779, 70634852, 136488679, 93279448, 51769705, 99408367, 94011238, 46255543, 136054320, 126842658]
LR= [117789932, 85602320, 136131278, 85538539, 33115646, 15821127, 122073977, 40205177, 40509142, 121833940]
BR= [(43128875586771925869851532015581155657, 108714366549720544283054523544596695631), (166053844834143846221197595138208659402, 9389299139547698081250285594708260233), (83160043610860066750778648875060399604, 160655466348101518011620435983302563358), (18306927902958362110653472691194540502, 141566997533915037448387258113883793369), (124719869188706449552550102421264489653, 111266021208672789646176095367638959348), (62115794167524204331339724293036031704, 24476842210910012261000793337134128911), (57017187772347635647835418540384524017, 149273114828279413180900590599119201032), (141865913804035015431129030802262884043, 11219445710980991629921733217597739715), (35994282847505215202392163277052083355, 5366425669461724819918825109516828913), (72621299937996657982583201267406651177, 39297013522202608324989011761142875947)]
c = b'\xd7\x8c\xf1Yx\x05W\x8ckq\xfdb\xd5\x81K"\xe7q\x88\x18\xedq\x9f\xcap\x1cTB\xc9)\xe1c\xf4~\x7f\xccwh\xfe\t\xbf\xb2!\xde\x84\xeeO\x0f8\xd1\xac\xbc\x1c \xf0F\x0c\x00\xc9\xa7\x9e\x06\xdan'
M = matrix(QQ, 12, 12)
for i in range(10):
    M[i, i] = n
    M[-2, i] = retbar(BR[i])
    M[-1, i] = (LR[i] << lambda_) - (LS[i] << lambda_)
M[-2, -2] = 2 ** 100 / 2 ** 128
M[-1, -1] = 2 ** 100

L = M.LLL()
res = L[2][-2] / (2 ** 100 / 2 ** 128) % n
# 1178130499626730132053516695382476673 

# part2
false = res >> 36 << 36
T = WB - fale * G
tmp = T - 2 ** 17 * G
tt_dict = {}
# kl
for i in trange(2 ** 17, 2 ** 18):
    tmp -= G
    tt_dict[tmp[0]] = i

# kh
for i in trange(2 ** 17, 2 ** 18):
    khG = (i << 18) * G
    if khG[0] in tt_dict:
        kh = i
        kl = tt_dict[khG[0]] + 1
        B_pri_w = false + (kh << 18) + kl
        H=hashlib.md5()
        H.update(long_to_bytes(B_pri_w))
        key=H.hexdigest().encode()
        aes = AES.new(key,AES.MODE_ECB)
        print(aes.decrypt(c))        
        break
        
# DASCTF{C0ngRatul4tion5_On_y0ur_SuCc3ssfuL_S1gN_1n}

浅记一下
关键词: two_squares(n0),矩阵phi,维纳连分数,HNP,中间相遇

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值