2021 ASIS CTF
crypto
属于是考试周不好好复习了明天一定好好复习
1.Stairs

def encrypt(m, pubkey):
e, n = 5, pubkey
M = bytes_to_long(flag)
m += M
c = (pow(m, e, n) + m) % n
return c
RSA相关信息攻击,输入两次不同信息,然后求个多项式的gcd即可
代码如下:
def related_message_attack(c1, c2, i,j, n):
PRx.<x> = PolynomialRing(Zmod(n))
g1 = (x+i)^5+x+i- c1
g2 = (x+j)^5+x+j- c2
def gcd(g1, g2):
while g2:
g1, g2 = g2, g1 % g2
return g1.monic()
return -gcd(g1, g2)[0]
n=15207977690336136009084524202038325554885310915059883448384144194654418241751053419525073654866970206364778377788831277366806596992780141865092174053704383867148702631257652786623278713782903885449573988249597182384975051704072741399889477466218566706269730793668955386625370910460561089967624231718497193508239085582917656659770949218325260293635161423649314609124050234916787320493992361924848395475032502806331615268498476578683775529393197756469481535593009995830346441825704713565270886118955321241377950471732172316477203915325853460760417128868621786761492588012544894382034780682554138022161079451781555581011
c1=12081203560514142928813270182045301814934658941942566283971827524566515691495338610705306017991629885620964387189636473950198265982156788641737419782652985993104482991142290431930115055350821822439393391068123935670309334316729006148492662495121061630099703548239075617937179834329208437161409429059676228563322588026604118682087960937669219642211141640892301856392106707533146926111242874949966812517889054764557169744040702507893937831614790615618996972580501455251756126901924504323017388121507283095500872503334413969254660452974856348589749198767102014153268598679698577321279057704920886134368261886024728499816
c2=1403563649448924592673538964651531745062292981605331451967470323857395723067585115696055991535116473046869099553343593473397638786751053232199512121964231946979876360839902121246397509577892885821724317868688163560285437838204329587910740921380661978315834722087149543326032066164306771670084527126508610223573474700430178137252547395829837505390463926439336622254049920533051264471016374815603007660267771535054299795693068059029517592602202523007029409044772968277040598528519188762930507192834912679469248071779300803208165438363579855467532893853517563433249222554535694431421027741562629167478233677251679677669
print(related_message_attack(c1, c2, 1,-1, n))
2.RAS
from Crypto.Util.number import *
from flag import flag
def genparam(nbit):
while True:
a, b = getRandomRange(2, nbit), getRandomRange(32, nbit)
if (a ** b).bit_length() == nbit:
return a ** b
def genkey(nbit):
p, q = [_ + (_ % 2) for _ in [genparam(nbit) for _ in '01']]
while True:
P = p + getPrime(31)
if isPrime(P):
while True:
Q = q + getPrime(37)
if isPrime(Q):
return P, Q
def encrypt(m, pubkey):
e = 0x10001
assert m < pubkey
c = pow(m, e, pubkey)
return c
nbit = 512
P, Q = genkey(nbit)
pubkey = P * Q
flag = bytes_to_long(flag)
enc = encrypt(flag, pubkey)
print(f'pubkey = {pubkey}')
print(f'enc = {enc}')
刚开始看的时候就觉得genparam这个函数很奇怪,随便带了几个参数进去发现出来的老是那么几个
估计限制的比较严格,这说明我们可以对其直接爆破,再通过对与n的大小关系来获得信息了
代码如下:
from Crypto.Util.number import getRandomRange
nbit=512
def genparam(nbit):
while True:
a, b = getRandomRange(2, nbit), getRandomRange(32, nbit)
if (a ** b).bit_length() == nbit:
return a ** b
a={genparam(nbit) for i in range(1000)}
print(len(a))
n=56469405750402193641449232753975279624388972985036568323092258873756801156079913882719631252209538683205353844069168609565141017503581101845476197667784484712057287713526027533597905495298848547839093455328128973319016710733533781180094847568951833393705432945294907000234880317134952746221201465210828955449
a=[6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503042048, 8053711844064285410525177787243558197570005363935019556858101553434365512539098895853640296872180624155667458024183994443302398026609497072748537812353024, 12887398992905211091134919596691438986738071032059439873952311419935843645773953828397502847624490212500386993360598011990073223412802359596045310457260827, 9569368112534109012190915159123232896046835213704761519820177687020839260901904230042750748022136477680236843508822269711523683981237327266140453001263057, 8526065551217488302445793836013235596313881745159405989061680087317140543418724874436783176354911982225567424893542972007250702274624705183257588846821376, 11591109614310218939309359901273869932377386383239214281463392154383676321481467333629508937357861801570629579235738413755429354210700465342013200981457619, 6915862811267548855400532927576174432387782022682468940592504155251220062902510705398037668211530281269095823113053633779401252468232996761798858642578125, 9954723898561605082903211643286713961764077846198461049080502446703604202428704099104602149932172670451640591429064955074560928574523976853960152731090944, 13023521815667035020051746725614882152537486496040160281475222429543806106293507885269380465904866366384819015446689132590827095090915180857370331563687936, 7234561410946297475144200167341523944088679009123473211368938353973440299820646400000000000000000000000000000000000000000000000000000000000000000000000000, 11316072382885889703309640061548021667917004831988016145059396878304551766213359019786053475222233494785012181840417484709720626820188915863100817035330489, 9436743330132006772069558535265246486359900329623721770849180464214192482200591566297877698596860415339212899499246410809726278230500149782025217194852352, 12262578287381604852175903152009283537163615736274349290770178098514906166391668613054373457668315642814716233859147451545249593657674890048567310131658752, 8711879851100574908475748115684365588739130257178613806765169562847639011955562507675449912318408940268679104863442336221271327828554709447588372254031872, 10436900611138725869172867285320967420499386398293333045633692797639857278619179096472846825397665828940838712011497657616843071082257665693759918212890625, 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 7697076429218979559664503789633523938321278197303435237089375142716107802698388695716857910156250000000000000000000000000000000000000000000000000000000000, 6807739517051283990370106856968124192474229146184900948675688481754810058334971205734548194436392534997735758198660848138706901604387352879006731328411841, 7775894764917226525503755608799365300886833083582260482346543403838892162624453268845829521714901987542177314855279434550194742882390072309254282899028501, 10631389742411238380013651423130490467304223181165433306704968532208350773739101792361865080298002859400060308840176015454659363967948593199253082275390625, 10689308771881269283550295149326055173845585854206645056656460702522121666713784539687243966951359847417674454627108554919149100316475102872726688520732672, 8116295745398105709744982121479453611383697405456063765245054858884898003631743734776259812449219728545932548466609426601088080004592188134881073830035456, 7585144437863401496057941408790290069798647771674231137918814711514330497466159745157978476482546352459847153469343293491857957088272935702152189470372801, 7025449262467462894472866732388351224420985633891810533027849767882418410007525682009928876623864238546554744892566836170280953281941798272380821161441441, 7526061233844414054658272333288124411685335071877284335907504995816228844305448573362353388854643200579154642450347983868657774168720289858354164292124672, 13164702452417416381603667747494617913204045607704943783293966399690811626816723055143156696583670202969948553601946261704114249369013123214244842529296875, 11832181045757909117433310092521543379782315146001214352076681390104144854837111927303764492689614601597172695087216055511658166825024422145846977425974439, 7961145753492658188015880378976844387030440651052782229932477774154576998240582422097000000000000000000000000000000000000000000000000000000000000000000000, 12784858354789279946205620216937402236148730420453381574371035530657011735676812721338396187966263241352252138341625161756414233140776643084947894814375936, 6980408444986741536553139410225839170163778684654188144031274281798479460109085162571390642187291445498951892043015773409989531120842243047686743181481281, 10547659937550055007879009152862692939771282760500581934311225379331498205345408457297867652032375388516101323329044490903472994316227039627077375151573399, 10927997258717960928161702501637544242777177546436813567011591228846704431586666845833120460206253133294324364091997830468829780277087621122803392665616384, 8728474639851934467515441960527857158951798426950679236302889384065176030684511793378456572492114032141571284607352299023119712728657759726047515869140625, 12362418571674990005188789747892179725009465609181423983066093556141310878146895432114356080401000000000000000000000000000000000000000000000000000000000000, 12859955498043400221645291082601789763218486169016174012779905548482214300300571870107190359184488292749468580267141268982716961414970630840497956701863936, 11831746382669109444821376596470810665890664126106937499190446891372840867690996204147078764084217440292110379634558885971485320664838940811171725766108289, 10041775896567867051150191826072148600847946887931310379010988412731970141804844252682280796243428431264519744965187858297632233411857019727487141621532009, 6938893903907228377647697925567626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 12525604726060592544781730589676165490568884494424180304909777612747725925017340441131385760866043744698445310588389512403665906103570577694215577907572801, 7503181809956767523746965523445045476257163607925774521504848419053281285592652527357937939189782711610752940844746826826913644756871296753402978970975383, 11693780465301924010352963542010025481276205789417270869961536882781001104378094053683939949247258888656629286450193416779796962146065197885036468505859375, 13369568890712313714243589997764252258340283396049809814312159788068895119991646988016779122587364005079833318390096812530781998894943591406724436370935281, 7577584135355075256368985275545091963317015808003037337104495210397349116551395008007090938503424065228536854044675580953497568046069458236056925099671803, 11856256217000761133249302542188159231749687370958039708207752192642025820822770528307559426132141591578133762963225828637624034458822090066222655331106816, 8882484851590372061801375848145786213873860506448367777936519452360092093145094496843117525365679372020738353569066410777296888177659482408509241697501184, 9977706658323712673435334295633875500707740422460258972843087124374859680019999197623259184674903537706660081662609466603586037636918774908106142094721024, 7520131779766571676410003726242311957332674752960328415967621100294282201385631868772559267716692770695068269245026207390452685331341869996121270179900733, 8754662915600728605350024301164804478761076888469676166070725327003446322364824606389565458827393124460915093134522345076818197679241689190202591275258601, 7070383441832367871049412579147029454478833139301173425517856127436231743642804505128124649654277568821862098592631670067087732555516257242019641380704609, 9758322079839278684913177175063998209354730418799683891668868075340968045928884110835711024778195449651538856096943540897278994648787865210409221511883063, 8672856960811498943649543170285385200530825875420134351323675304999317320406485939131333180479352542257393912774534376693289283140074614861681341671407616, 8756748667513743356522453539141411877335855720088177288743844338966579921386447489112818165092932712039077498277659401154426618810440368536565379892248576, 7397726037216084896693091999270112539033833110262233903683689687178661239036699302715584445144611061680099079631571519117354387708841915911777734061684733, 12520893300916973570028372988279248121147870002858362036338685923137397999448695709135673367388786973349799926656135407032621742473565973341464996337890625, 8016274509644716641787900902977713557617427571111022095682052575933971848411634880728078933567933560795659304814403982581160290785573666533527124145340416, 6927018963129532298432124671568376175168848650283922924835297393944964857752052097626310894580243695790409739800019363432124924882995801713490412139708416, 6765311192685663116672873758039745314481197482865613733487236252414141004331295614293269251930521941237879121079375569425148854994422385893292165269206401, 9248475369535324573239931643158339930119479340109389276014683669775322903091083020546714492252170632225404233664609343783935977532417424890179594970921543, 10509497943551097456136594407566119041123304168849965240883153025288525265952029770251330921402711054055963869833569810976742977521647369013460723230580801, 7999005235719578002322370711524185848679707519672234523581538708511450720995922201719605834043817455170457925093329047426852331155952080925538885142839296, 8380033603315312365225329051484084291978521442515239492651094514135129518407013378909726778850442158155406397857732618041527717416779383282498540306169856, 8930363165109429763821947303072147000814745480979067257520398135624346803435137265819322367401150240822664523690217774040996675647418327505621919912165376, 12235129002995002036288188250087944859851712270169617757937718925906675182502442088556486328450761012516455866522981088539978600238100625574588775634765625, 10659411525638863449969258117377437581781849873788177524339308485477702875379882189183531633732715827950204583811875946874891951665631495416164398193359375, 7553267519536856206894835544419799566515605813936797712534128285594784443588284718339107775974046961403408687562020731652321787481770188797032392344322793, 11784040349303112811038726276749661118644846593367867642988924537380824199450962123040470629742467552316796882897404484049861537685324968498466498078048256, 11932504781313434858085476730327680230917188640890437377904174342984111192647832305168045720320082307781802670297756445695479832025892306183160088431843131, 10176816989796776426213383406220826871312919369210620082926309768752807056721189796543207751804519659076079360178926725444166725460598649674537527825924096, 12350233606934113110752473814412133790745466353941711902243080996320714617175558896486577087298761671262258252459625449783675726924470563807076032340934089]
for i in range(69):
for j in range(69):
p=a[i]
q=a[j]
n1=p*q
if (n1/n)>0.999and (n1/n)<1:
print([p,q])
0.999是我随便调的,发现刚好有一组解,但是大小还是和我预想的有点差异,考完再仔细研究,得出的如果正确就相当于获取了p,q的高位了,后面用copper做一下就行
n=56469405750402193641449232753975279624388972985036568323092258873756801156079913882719631252209538683205353844069168609565141017503581101845476197667784484712057287713526027533597905495298848547839093455328128973319016710733533781180094847568951833393705432945294907000234880317134952746221201465210828955449
p1=7503181809956767523746965523445045476257163607925774521504848419053281285592652527357937939189782711610752940844746826826913644756871296753402978970975383
PR.<x>=PolynomialRing(Zmod(n))
f=p1+x
root=f.small_roots(X=2^31,beta=0.4)
print(root)
import gmpy2
from Crypto.Util.number import *
nbit=512
n=56469405750402193641449232753975279624388972985036568323092258873756801156079913882719631252209538683205353844069168609565141017503581101845476197667784484712057287713526027533597905495298848547839093455328128973319016710733533781180094847568951833393705432945294907000234880317134952746221201465210828955449
e=65537
p=7526061233844414054658272333288124411685335071877284335907504995816228844305448573362353388854643200579154642450347983868657774168720289858354259165638383
q=n//p
c=11104433528952071860984483920122173351342473018268740572598132083816861855404615534742178674185812745207876206939230069251889172817480784782618716608299615251541018034321389516732611030641383571306414414804563863131355221859432899624060128497648444189432635603082478662202695641001726208833663163000227827283
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m)
3.nDLP
x = bytes_to_long(flag)
g = 685780528648223163108441
n = 12588567055208488159342105634949357220607702491616160304212767442540158416811459761519218454720193189
y = pow(g, x, n)
y = 9136134187598897896238293762558529068838567704462064643828064439262538588237880419716728404254970025
典型离散对数问题了,将n分解,分开求最后用crt组合起来
代码如下:
p1 = 685825230919805430353639
p2 = 196506778231841265839577533
p3 = 795045813258486756062581
p4 = 117487902085160690512598387
y = 9136134187598897896238293762558529068838567704462064643828064439262538588237880419716728404254970025
g = 685780528648223163108441
def decry(g,y,p):
G=GF(p)
g=G(g)
n=discrete_log(y,g)
return n
a=decry(g,y,p1)
b=decry(g,y,p2)
c=decry(g,y,p3)
d=decry(g,y,p4)
m=crt([a,b,c,d],[p1-1,p2-1,p3-1,p4-1])
print(m)
4.mDLP
from sage.all import *
from Crypto.Util.number import *
from secret import gen_prime, gen_base_matrix, flag
def keygen(nbit, l):
#
## Create the n-bit prime and base square matrix of size l over Ring Z_p
#
p = gen_prime(nbit)
A = gen_base_matrix(p, l)
d = randint(2, p)
Q = A ** d
pubkey = (p, A, Q)
privkey = d
return pubkey, privkey
def encrypt(M, pubkey):
p, A, Q = pubkey
l = A.nrows()
assert M.nrows() == l
r = randint(2, p)
C, D = A ** r, Q ** r
E = D * M
return C, E
def msg_to_matrix(p, msg):
l = len(msg)
return matrix(Zmod(p), [[bytes_to_long(msg[0:l//4]), bytes_to_long(msg[l//4:l//2])],
[bytes_to_long(msg[l//2:3*l//4]), bytes_to_long(msg[3*l//4:l])]])
nbit, l = 256, 2
pubkey, privkey = keygen(nbit, l)
p, A, Q = pubkey
M = msg_to_matrix(p, flag)
ENC = encrypt(M, pubkey)
print(f'pubkey = {pubkey}')
print(f'ENC = {ENC}')
首先需要发现基矩阵A在GF(p)下的阶是p-1(这个矩阵产生的过程题目并没告诉,但是我挺好奇这玩意到底是咋找到的)
然后发现p-1相当的光滑,直接每个小的因子下的幂次可以爆破,仿照Pohlig-Hellman,实现一下即可
代码如下:
q=94413310751917369305079812653655619566021075449954923397392050181976939189891
p=[2, 5, 103, 131, 139, 149, 181, 223, 263, 313, 337, 347, 349, 359, 389, 409, 479, 509, 547, 599, 613, 643, 751, 757, 773, 787, 635209, 839, 857,877]
A= Matrix(GF(q),[[38199337272663519912859864066101528484023656231849338967558894235177040565160 ,39708167173513090810083500967474691943646789486489990958101592717502452906918],[8216211510625558273096642057121313417997488994504871245106775381995665925783 ,56213973479253849392219948587554091081997419218105584429833155946799898624740]])
Q=Matrix (GF(q),[[61709241598677561125021718690991651934557899286972116933820920757636771220273 , 1945367449329759288724720626216309893787847192907494307536759223359193510642],[37495232301500074672571996664644922614693962264764098174213150757616575323566 , 7348269231944161963123250652171976847627786311806728904368575861561449853500]])
k=[]
for i in range(30):
t=(q-1)//p[i]
A= Matrix(GF(q),[[38199337272663519912859864066101528484023656231849338967558894235177040565160 ,39708167173513090810083500967474691943646789486489990958101592717502452906918],[8216211510625558273096642057121313417997488994504871245106775381995665925783 ,56213973479253849392219948587554091081997419218105584429833155946799898624740]])
Q=Matrix (GF(q),[[61709241598677561125021718690991651934557899286972116933820920757636771220273 , 1945367449329759288724720626216309893787847192907494307536759223359193510642],[37495232301500074672571996664644922614693962264764098174213150757616575323566 , 7348269231944161963123250652171976847627786311806728904368575861561449853500]])
Q=Q^t
A=A^t
for j in range(p[i]):
if A^j==Q:
k.append(j)
break
print(crt(k,p))
q=94413310751917369305079812653655619566021075449954923397392050181976939189891
y=[0, 0, 38, 49, 22, 60, 28, 218, 133, 71, 149, 100, 27, 263, 237, 166, 112, 506, 177, 598, 32, 8, 85, 161, 494, 247, 278065, 167, 187]
p=[2, 5, 103, 131, 139, 149, 181, 223, 263, 313, 337, 347, 349, 359, 389, 409, 479, 509, 547, 599, 613, 643, 751, 757, 773, 787, 635209, 839, 857]
d=85011530287717179206191836470573856514211831713782635916426092559668777224810
m1=Matrix(GF(q),[[47566868540912475779105819546118874217903268597017385039977593878486632022506 ,86073162301954995219912739344010659248720823814557810528618517154406350653517],[23443866424088482893369441934221448179896589659663581973508963775891809430857, 74567333640177484678138574534395714128854315440076840728428649074147859070975]])
m2=Matrix(GF(q),[[56937964695156855099385034285428853461603799261684034842341841781057485084327, 82459328835322885824854425864023809222717401981993182346342472865578156162544],[85092677346274708324092648597361729755305119435989183201786866456596369562681, 22228861714953585357281182780002271505668586948202416054453861940155538803489]])
m=(m1^d)^(-1)*m2
print(m)
第一次ak还是挺开心的欸再不复习就要挂了

浙公网安备 33010602011771号