西电CTF刷题笔记(crypto)

强壮密码人

现代密码学

0rsa0

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from Crypto.Util.number import *  
from flag import flag

assert flag[0:7] == b'moectf{'
assert flag[-1:] == b'}'
flag = flag[7:-1]
assert len(flag) == 32

m1 = bytes_to_long(flag[0:16])
m2 = bytes_to_long(flag[16:32])

def enc1(m):
p = getPrime(512)
q = getPrime(512)
n = p * q
e = 3
c = pow(m,e,n)
return n,e,c

def enc2(m):
p = getPrime(512)
q = getPrime(512)
e = 65537
d = inverse(e,(p-1)*(q-1))
n = p * q
dp2 = d % (p-1)
c = pow(m,e,n)
return n,e,c,dp2

n1,e1,c1 = enc1(m1)
n2,e2,c2,dp2 = enc2(m2)

print("n1="+ str(n1))
print("e1="+ str(e1))
print("c1="+ str(c1))
print("n2="+ str(n2))
print("e2="+ str(e2))
print("c2="+ str(c2))
print("dp2="+ str(dp2))

'''
n1=133024413746207623787624696996450696028790885302997888417950218110624599333002677651319135333439059708696691802077223829846594660086912881559705074934655646133379015018208216486164888406398123943796359972475427652972055533125099746441089220943904185289464863994194089394637271086436301059396682856176212902707
e1=3
c1=1402983421957507617092580232325850324755110618998641078304840725502785669308938910491971922889485661674385555242824
n2=159054389158529397912052248500898471690131016887756654738868415880711791524038820158051782236121110394481656324333254185994103242391825337525378467922406901521793714621471618374673206963439266173586955520902823718942484039624752828390110673871132116507696336326760564857012559508160068814801483975094383392729
e2=65537
c2=37819867277367678387219893740454448327093874982803387661058084123080177731002392119369718466140559855145584144511271801362374042596420131167791821955469392938900319510220897100118141494412797730438963434604351102878410868789119825127662728307578251855605147607595591813395984880381435422467527232180612935306
dp2=947639117873589776036311153850942192190143164329999603361788468962756751774397111913170053010412835033030478855001898886178148944512883446156861610917865
'''

低指数加密攻击 + dp泄露

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from Crypto.Util.number import *  
import gmpy2

n1=133024413746207623787624696996450696028790885302997888417950218110624599333002677651319135333439059708696691802077223829846594660086912881559705074934655646133379015018208216486164888406398123943796359972475427652972055533125099746441089220943904185289464863994194089394637271086436301059396682856176212902707
e1=3
c1=1402983421957507617092580232325850324755110618998641078304840725502785669308938910491971922889485661674385555242824
n2=159054389158529397912052248500898471690131016887756654738868415880711791524038820158051782236121110394481656324333254185994103242391825337525378467922406901521793714621471618374673206963439266173586955520902823718942484039624752828390110673871132116507696336326760564857012559508160068814801483975094383392729
e2=65537
c2=37819867277367678387219893740454448327093874982803387661058084123080177731002392119369718466140559855145584144511271801362374042596420131167791821955469392938900319510220897100118141494412797730438963434604351102878410868789119825127662728307578251855605147607595591813395984880381435422467527232180612935306
dp2=947639117873589776036311153850942192190143164329999603361788468962756751774397111913170053010412835033030478855001898886178148944512883446156861610917865

m1,_=gmpy2.iroot(c1,3)
print(long_to_bytes(m1))

for i in range(1,e2):
p = (e2 * dp2) // i + 1
if n2 % p == 0:
p2 = p
q2 = n2 // p2
L = (p2 - 1) * (q2 - 1)
d = inverse(e2,L)
m2 = pow(c2,d,n2)
print(long_to_bytes(m2))
break
# b'T8uus_23jkjw_asr'
# b'_3d32awd!5f&#@sd'

BBBBBBBackpack

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import*  
import random

flag = xxxxx
m = bytes_to_long(flag)

backpack = [1]
for i in range(160):
backpack = backpack + [random.randrange(backpack[-1]*2,backpack[-1]*4)]
print(backpack)

backpack = backpack[::-1]
l_list = []
for i in backpack:
l_list.append(m//i)
m = m % i
print(l_list)
print(m)

'''
[1, 3, 6, 23, 81, 199, 670, 1844, 5535, 19547, 75437, 259056, 974664, 2399609, 7304021, 18537736, 38733276, 143785607, 300890806, 778420517, 3112554961, 9955080778, 34625138877, 103531993246, 294207209833, 632363887456, 2341888528510, 8736224869982, 33727228149167, 113026240109398, 334534210335245, 754812282783351, 2871232541211362, 7147990367228081, 16813142520913249, 62232346665698392, 132813746566508109, 436969187287191174, 1371311321857557068, 3465499917202578303, 10761115866584374884, 25998484366411649657, 81986464388691181616, 324842980726420787162, 1063428202306999892763, 3318046410585817603032, 12569059003729082352479, 29822650425811094387624, 89829868596281155601134, 207467076929560545986692, 424101883375592006882573, 1410057940679583010646572, 4795250448769489602371933, 12419955465903295439689190, 32127052925660652338148413, 121768246803017981541739592, 286293639144639999224246905, 876618562849333372078886060, 3495370549956845610130431964, 13777448384830441398471073019, 45339968634224370226443992856, 159636974047457043534720001443, 403806399587759901542286515690, 1190949464093267805434271517577, 2625636206558220580206955200643, 5447410189447132699195152662348, 13798370097217657917056458399390, 42652195271813913821236091812630, 87624112365004035907264763291796, 295833079631922620770335225824586, 717255284196409248439771704866883, 2119024457898120787521595829459142, 8097762744600097674390735606807128, 22990496332708170421088808438995636, 55268619563994680834441597248247582, 157779112538179073738464223501777499, 553561084981889545670380643023607621, 2094594867042850711386606235023415160, 7427564397983932982484534762285032864, 28541899514275079822011638819911534081, 59854615377110931361953157015440306520, 137071568336121640486639449884477676903, 434368553369190183317274206512577489165, 1607515956833802196435755021284640023303, 4247439813046769661567823675143526066989, 12252982336388472725165513300377051313644, 43586970358791422986656986286232849952290, 94754002216262928157061686798919700234151, 205403633516427560050027271636224615375855, 727922215919878343821825296552148942903123, 1541646353685774868780093433673052445519807, 5703469721749658936787093922654529457118594, 20762100689139896330208273986505541316962105, 80195197197818086812949239946286778357513961, 198522126001869063688321920177617046841212852, 719060816608760633741229682178956301630549900, 2171712751463320729665634385979825928332317622, 7968526190188064156742281507099763347000210904, 20302513556821857703528100337806260797703562338, 54967103106163860243927426134510653397499429384, 189866376897538250029834405810321956080892995934, 516088075785491414669664215795496674103100750375, 1531616665488077085604100033058238685259376456655, 4795563798371064843556375420641263389159268373753, 12715206263244537077480789152826620386135239585589, 45628223673569886022145657218662773486560769778049, 127988774487590162169660910342623736153210927472871, 429761810968391607465089641939438991272623610573254, 1694286408402338132220805654166083638884822137745848, 5577419986858786911316434594350519553014729018524982, 22146179230778265190752372551893625479326089828877879, 78983119075073724439850825731329386811892547014513513, 165805826557531832743325076551678254671357810872202277, 525687524776397669648788242907896052104054917192402349, 1596680185629512867035574394423929715498386636216930988, 3808351509446054183279144714875260973968494634290203802, 10792542598439044383994436390450612942036864538927761344, 31776077718298264756461043701077481610506447838959767949, 69483787236434708634666641366101673156349500969799745632, 212620878051727200345257734337176214877612639791408110401, 565705372069455623425268706185184158331866127768259060570, 2228971348185635371906791535156337404926063871528397270892, 4859328204121938264839760465087547752629065763656619388434, 14185348803209161448182653444177464165713091554806223414499, 44242932119616103779840255273986809836494122475150635493273, 156176016196847319874949580221731690886061627436916661422852, 472567672907289753186461661432798790751774534772655287936877, 1765317440470718113352833182911767208733594355879647245836603, 5835719030771522391675663002032404790451900100534570526468736, 14528961633147270325279483890277955669830128461595478399405580, 53503137764341373520101774208921450303897226002280491351371881, 153340302591307960181257267214621247064964249027062324798966650, 467036429085212303265974827129085622046910166509299763268535756, 1760478013800716951650816419888923889893355872867499404847043361, 4791886951911545137378952129838133145784256723738609871941913863, 19126760116038883506408830737976498053029475253123685318001466609, 51635927378821965754946959553487670084314385367430813170544188707, 203944552994591250724882161307279862158139878326498083669171922709, 718868928147325949276701359623063723395455731358210896767864810436, 2005627527854915017699090052821431775394584514441537184407714355949, 6108484926321410509000933490330125849664844216966621898372849074206, 15273733259375332107091552084526951416159646708621190826219429490015, 34145117254940196604842578208457005181132408450899191627170638987883, 120825229084143066199868275091825674337472013226784591902132114229359, 387687667198606192147021527980207738864855944986764666796629571317797, 1461874344207808204456192497546273455901754164965322967295868406627707, 3258300231591322626530795072101331694347928535549768492906530809069244, 8874418273687545553519370439384854004509761935319681848589844232674343, 26555971104148502495508475192114409958713364020252024170586326291995544, 56653286369586527413345416396708661964062474995701742952261047069623359, 154383566127721041301459355493059400704799197964228029280865862358894596, 341393868848806018386217706353404785528207249510734290203621418976352706, 1171362524761660822765817023463786914069613269413196584856696440695273738, 4194882148022101614597714583113090146333385168895367467002069867303753334, 10081717223153632058965668126630772845024206141591578024505075742926631137, 39590555580101758090745061229221178837429140073072263518741551403983751377, 124978669991117804453179514660098523434116842472570073354436333226196401318, 285677744249355467333640461312079508294900634926466871637187648581093663108, 685643590088926190360498081484403342771108281930489395367499236756131358960, 2509513194338799699151211958956210034789618340347017416940796124375457114430, 7869725510782496795692771133398729561144872690341264618424961946628895219979]
[0, 0, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 0, 2, 1, 0, 1, 2, 1, 1, 1, 2, 0, 0, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 0, 0, 2, 1, 0, 0, 1, 0, 1, 1, 1, 0, 2, 1, 3, 0, 2, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 2, 0, 0, 1, 0, 1, 3, 0, 2, 0, 0, 1, 1, 3, 1, 2, 2, 1, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 2, 1, 0, 1, 2, 0, 1, 3, 1, 0, 2, 2, 0, 1, 0, 1, 2, 1, 2, 3, 1, 0, 2, 1, 1, 2, 1, 2, 1, 0, 2, 0, 2, 2, 2, 1, 2, 1, 1, 1, 2, 3, 0, 1, 1, 2, 0, 1, 0, 0, 2, 2, 3, 2, 1, 2, 1, 1, 1, 3, 1, 0]
'''

很简单的背包密码,了解一下背包密码就能解这道题

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
from Crypto.Util.number import *  

backpack = [1, 3, 6, 23, 81, 199, 670, 1844, 5535, 19547, 75437, 259056, 974664, 2399609, 7304021, 18537736, 38733276, 143785607, 300890806, 778420517, 3112554961, 9955080778, 34625138877, 103531993246, 294207209833, 632363887456, 2341888528510, 8736224869982, 33727228149167, 113026240109398, 334534210335245, 754812282783351, 2871232541211362, 7147990367228081, 16813142520913249, 62232346665698392, 132813746566508109, 436969187287191174, 1371311321857557068, 3465499917202578303, 10761115866584374884, 25998484366411649657, 81986464388691181616, 324842980726420787162, 1063428202306999892763, 3318046410585817603032, 12569059003729082352479, 29822650425811094387624, 89829868596281155601134, 207467076929560545986692, 424101883375592006882573, 1410057940679583010646572, 4795250448769489602371933, 12419955465903295439689190, 32127052925660652338148413, 121768246803017981541739592, 286293639144639999224246905, 876618562849333372078886060, 3495370549956845610130431964, 13777448384830441398471073019, 45339968634224370226443992856, 159636974047457043534720001443, 403806399587759901542286515690, 1190949464093267805434271517577, 2625636206558220580206955200643, 5447410189447132699195152662348, 13798370097217657917056458399390, 42652195271813913821236091812630, 87624112365004035907264763291796, 295833079631922620770335225824586, 717255284196409248439771704866883, 2119024457898120787521595829459142, 8097762744600097674390735606807128, 22990496332708170421088808438995636, 55268619563994680834441597248247582, 157779112538179073738464223501777499, 553561084981889545670380643023607621, 2094594867042850711386606235023415160, 7427564397983932982484534762285032864, 28541899514275079822011638819911534081, 59854615377110931361953157015440306520, 137071568336121640486639449884477676903, 434368553369190183317274206512577489165, 1607515956833802196435755021284640023303, 4247439813046769661567823675143526066989, 12252982336388472725165513300377051313644, 43586970358791422986656986286232849952290, 94754002216262928157061686798919700234151, 205403633516427560050027271636224615375855, 727922215919878343821825296552148942903123, 1541646353685774868780093433673052445519807, 5703469721749658936787093922654529457118594, 20762100689139896330208273986505541316962105, 80195197197818086812949239946286778357513961, 198522126001869063688321920177617046841212852, 719060816608760633741229682178956301630549900, 2171712751463320729665634385979825928332317622, 7968526190188064156742281507099763347000210904, 20302513556821857703528100337806260797703562338, 54967103106163860243927426134510653397499429384, 189866376897538250029834405810321956080892995934, 516088075785491414669664215795496674103100750375, 1531616665488077085604100033058238685259376456655, 4795563798371064843556375420641263389159268373753, 12715206263244537077480789152826620386135239585589, 45628223673569886022145657218662773486560769778049, 127988774487590162169660910342623736153210927472871, 429761810968391607465089641939438991272623610573254, 1694286408402338132220805654166083638884822137745848, 5577419986858786911316434594350519553014729018524982, 22146179230778265190752372551893625479326089828877879, 78983119075073724439850825731329386811892547014513513, 165805826557531832743325076551678254671357810872202277, 525687524776397669648788242907896052104054917192402349, 1596680185629512867035574394423929715498386636216930988, 3808351509446054183279144714875260973968494634290203802, 10792542598439044383994436390450612942036864538927761344, 31776077718298264756461043701077481610506447838959767949, 69483787236434708634666641366101673156349500969799745632, 212620878051727200345257734337176214877612639791408110401, 565705372069455623425268706185184158331866127768259060570, 2228971348185635371906791535156337404926063871528397270892, 4859328204121938264839760465087547752629065763656619388434, 14185348803209161448182653444177464165713091554806223414499, 44242932119616103779840255273986809836494122475150635493273, 156176016196847319874949580221731690886061627436916661422852, 472567672907289753186461661432798790751774534772655287936877, 1765317440470718113352833182911767208733594355879647245836603, 5835719030771522391675663002032404790451900100534570526468736, 14528961633147270325279483890277955669830128461595478399405580, 53503137764341373520101774208921450303897226002280491351371881, 153340302591307960181257267214621247064964249027062324798966650, 467036429085212303265974827129085622046910166509299763268535756, 1760478013800716951650816419888923889893355872867499404847043361, 4791886951911545137378952129838133145784256723738609871941913863, 19126760116038883506408830737976498053029475253123685318001466609, 51635927378821965754946959553487670084314385367430813170544188707, 203944552994591250724882161307279862158139878326498083669171922709, 718868928147325949276701359623063723395455731358210896767864810436, 2005627527854915017699090052821431775394584514441537184407714355949, 6108484926321410509000933490330125849664844216966621898372849074206, 15273733259375332107091552084526951416159646708621190826219429490015, 34145117254940196604842578208457005181132408450899191627170638987883, 120825229084143066199868275091825674337472013226784591902132114229359, 387687667198606192147021527980207738864855944986764666796629571317797, 1461874344207808204456192497546273455901754164965322967295868406627707, 3258300231591322626530795072101331694347928535549768492906530809069244, 8874418273687545553519370439384854004509761935319681848589844232674343, 26555971104148502495508475192114409958713364020252024170586326291995544, 56653286369586527413345416396708661964062474995701742952261047069623359, 154383566127721041301459355493059400704799197964228029280865862358894596, 341393868848806018386217706353404785528207249510734290203621418976352706, 1171362524761660822765817023463786914069613269413196584856696440695273738, 4194882148022101614597714583113090146333385168895367467002069867303753334, 10081717223153632058965668126630772845024206141591578024505075742926631137, 39590555580101758090745061229221178837429140073072263518741551403983751377, 124978669991117804453179514660098523434116842472570073354436333226196401318, 285677744249355467333640461312079508294900634926466871637187648581093663108, 685643590088926190360498081484403342771108281930489395367499236756131358960, 2509513194338799699151211958956210034789618340347017416940796124375457114430, 7869725510782496795692771133398729561144872690341264618424961946628895219979]
L = [0, 0, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 0, 2, 1, 0, 1, 2, 1, 1, 1, 2, 0, 0, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 0, 0, 2, 1, 0, 0, 1, 0, 1, 1, 1, 0, 2, 1, 3, 0, 2, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 2, 0, 0, 1, 0, 1, 3, 0, 2, 0, 0, 1, 1, 3, 1, 2, 2, 1, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 2, 1, 0, 1, 2, 0, 1, 3, 1, 0, 2, 2, 0, 1, 0, 1, 2, 1, 2, 3, 1, 0, 2, 1, 1, 2, 1, 2, 1, 0, 2, 0, 2, 2, 2, 1, 2, 1, 1, 1, 2, 3, 0, 1, 1, 2, 0, 1, 0, 0, 2, 2, 3, 2, 1, 2, 1, 1, 1, 3, 1, 0]
backpack = backpack[::-1]

print(len(backpack))
print(len(L))
m = 0
for i in range(len(L)):
m += L[i] * backpack[i]
print(long_to_bytes(m))
# b'moectf{BBBBBB4ckp4ck_i5_br0k3n}'

BabyMultiple

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def encode(msg,mul):
c = b''
for i in msg:
index = table.find(i)
index_after = (index * mul) % 63
c = c + bytes.fromhex(hex(table[index_after])[2:])
return c

table = b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
FLAG = xxxxx

assert len(table) == 63
assert FLAG[:7] == b'moectf{'
assert FLAG[-1:] == b'}'

Mul = 58
msg = FLAG[7:-1]

c = encode(msg,Mul)
print(c)

#b'g3AfJPOfHPOJFfJuf_AYux1JFx39'

简单的模运算
脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import *

table = b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
c = b'g3AfJPOfHPOJFfJuf_AYux1JFx39'
Mul = 58

def decrypt(c,mul):
m = b''
for i in c:
index = table.find(i)
index_true = index * inverse(mul,63) % 63
m = m + bytes.fromhex(hex(table[index_true])[2:])
return m

m = decrypt(c,Mul)
print(m)
# b'moectf{y0u_4r3_gr34t_47_Mu17ic4ti0n}'

密码技术能力提升

Day1

BabyGo

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
"fmt"
)

func XORCipher(data []byte, key string) []byte {
keyBytes := []byte(key)
keyLen := len(keyBytes)
result := make([]byte, len(data))

for i := range data {
keyByte := keyBytes[i%keyLen]
intermediate := data[i] ^ keyByte
shifted := (intermediate << 3) | (intermediate >> 5)
result[i] = shifted
}

return result
}

func main() {
flag := "flag{*************}"
key := "s3cr3tK3y"
dataToEncrypt := []byte(flag)
encryptedData := XORCipher(dataToEncrypt, key)

fmt.Printf("Ciphertext: ")
for _, b := range encryptedData {
fmt.Printf("%02x", b)
}
// Output: a8fa10a842b1fb8b0061a29a12185998185992901278
}

虽然还没学过go,但根据python的基础,还是能理解得大差不差
关键加密在

1
2
3
4
5
6
7
for i := range data {
keyByte := keyBytes[i%keyLen]
intermediate := data[i] ^ keyByte // 明文 xor key
shifted := (intermediate << 3) | (intermediate >> 5) // 循环移位
result[i] = shifted
}
// 例如 m 的一个byte为 ‘11122222’ ,得到的 shifted 是 ‘22222111’

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from math import gcd
from Crypto.Util.number import *

c = bytes.fromhex("a8fa10a842b1fb8b0061a29a12185998185992901278")
print(c)
key = b's3cr3tK3y'
print(len(c))
print(len(key))

cc = bytes((i >> 3 & 0xff) | (i << 5 & 0xff) for i in c)
print(cc)

m = b''
for i in range(len(cc)):
    m += bytes([cc[i] ^ key[i % len(key)]])

print(m)
# flag{B4By_g000_X0R!!!}

Base套娃

直接将密文扔进随波逐流一键解码,
base64 -> base58 -> base32
flag{af7bfd4a-7399-48ff-808d-0aa888ac708f}

TA04

一道流量分析题(misc魂觉醒)
把文件放进wireshark中,追踪流,发现流一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.b..AES-256-CBC. .."3DUfw.........."3DUfw..................
..
.....CBC..PKCS7......20251013105545Z.b..AES-256-CBC. .."3DUfw.........."3DUfw..................
..
.....CBC..PKCS7......20251013105545Z.b..AES-256-CBC. .."3DUfw.........."3DUfw..................
..
.....CBC..PKCS7......20251013105545Z

很明显的AES加密,将流转成原数据:
a062810b4145532d3235362d434243822000112233445566778899aabbccddeeff00112233445566778899aabbccddeeff83100102030405060708090a0b0c0d0e0f1084034342438505504b43533786020100890f32303235313031333130353534355a

a062810b4145532d3235362d434243822000112233445566778899aabbccddeeff00112233445566778899aabbccddeeff83100102030405060708090a0b0c0d0e0f1084034342438505504b43533786020100890f32303235313031333130353534355aa062810b4145532d3235362d434243822000112233445566778899aabbccddeeff00112233445566778899aabbccddeeff83100102030405060708090a0b0c0d0e0f1084034342438505504b43533786020100890f32303235313031333130353534355a

分析一下,
a062
810b 4145532d3235362d434243
8220 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff
8310 0102030405060708090a0b0c0d0e0f10
8403 434243
8505 504b435337
8602 0100
890f 32303235313031333130353534355a

81 是算法名,后跟的数据也就是AES-256-CBC;
82 后接的20,是0x20,表示32字节的数据,在这里就是key
83 后接的10,是0x10,表示16字节的数据(后面同理),在这里就是iv。
key和iv知道了,直接找密文解密就行,但在这里还是说一下其他tag

84 指CBC模式
85 指padding是PKCS7模式
86 指版本为0100
89 指时间,20251013105545Z

在最后一个流发现密文6231393032613961303338326235333663616431373331343065666664616130343231313135336135613962303439643965326233303532323064376365313736343662303461643461346334656536336138383533333139393137376364610a

脚本:

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Util.number import *
from Cryptodome.Cipher import AES

iv = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
key = b'\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff'
c = bytes.fromhex('b1902a9a0382b536cad173140effdaa04211153a5a9b049d9e2b305220d7ce17646b04ad4a4c4ee63a88533199177cda')

aes_ecb = AES.new(key, AES.MODE_CBC,iv)
m=aes_ecb.decrypt(c)
print(m)
# b'flag{af0630ff-09d8-4960-9a71-53fa6f1aeb29}\x06\x06\x06\x06\x06\x06'

抽奖盒

很简单的一道题,直接用pwntools爆破连接就行

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python3
from pwn import *
import base64

for i in range(1000):

io = remote('127.0.0.1',43733)
#context(log_level='debug')

io.send(b'GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n')
response = io.recvall()
l = len(b'RFdSbXJCNW5NMXlwMTdjY0xRZmNNS0xJcEY2dU0wUEZIQzR4bUNDYkFE')
c = response[-l:]
c = c.decode()
print(c)
m = base64.b64decode(c)
print(m)
print(f'第 {i} 次')
if b'flag' in m :
print(m)
break

io.close()


# [+] Opening connection to 127.0.0.1 on port 43733: Done
# [+] Receiving all data: Done (491B)
# [*] Closed connection to 127.0.0.1 port 43733
# ZmxhZ3syMTQwZGQwZS01ZjQwLTRmNDctYWI5OS00YzIwYjk4OGI5ODB9
# b'flag{2140dd0e-5f40-4f47-ab99-4c20b988b980}'
# 第 9 次
# b'flag{2140dd0e-5f40-4f47-ab99-4c20b988b980}'

Day2

rsa1

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

from Crypto.Util.number import*
from sympy import nextprime
from flag import flag
m = bytes_to_long(flag)
p = getPrime(512)

q = nextprime(p)

N = p*q
phi_N = (p-1)*(q-1)
e = 65537
assert GCD(e,phi_N) == 1
d = pow(e,-1,phi_N)
c = pow(m,e,N)
print(f'{c = }')
print(f'{N = }')

简单的p、q相差太小的题目,直接对N开方,再将得到的数值nextPrime(),就可得到q

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from math import gcd, isqrt
from Crypto.Util.number import *
from sympy import nextprime

c = 24694587387650920645996270549211207170638993154632740677659084672997106533269276167283114218006415216641778758173753050155613881125870891753812944825531433039125347447982352594932373137761585259271639546067263493692092183112083130016947631246281337375914696856286638623891178019397226234217383695239175194718
N = 47962015206855458418156612725688458795417626954963597347756764792325394700898782582998766219844198304624745810354449960976267092231860696089438097898628350928536758251238231355081269322175805806583435953523659093358712086737791909740621824243858233262611396937190733869654279420922758507262756820538256710701
e = 65537

mid = isqrt(N)
q = nextprime(mid)
p = N // q
print(isPrime(p)) # true

L = (p-1) * (q-1)
d = inverse(e,L)
m = pow(c,d,N)
print(long_to_bytes(m))
# b'hello'

rsa2

题目:

1
2
3
4
5
6
7
8
9
import gmpy2  
from Crypto.Util.number import *

c = 90143305010218464651239068244550223
e = 3
n = 23033888059215652914547372571639832513795208553023368309294724398833696153243240439540505594523127438687598867850463867115334519418669023090322343378415503624073754318569038171789384345983857238854755806950088416689190107162861217850425292065837477205856204633063820787468124190181429310472692074161706160393611060419616313295013372404855581583756301983942208908189883172993963465850312578716718513001692084948798489419907453255919259237500207921922678923274075451935962157001214124804211340585033630247456567290613345126133871450507594280438724958688392815919099272303738741921577077656382506193257888572604276774991

m = gmpy2.iroot(c,3)[0]
print(long_to_bytes(m))

低加密指数攻击

脚本:

1
2
3
4
5
6
7
8
9
10
import gmpy2  
from Crypto.Util.number import *

c =
e =
n =

m = gmpy2.iroot(c,3)[0]
print(long_to_bytes(m))
# b'hello'

rsa8

题目:

1
2
3
4
5
6
7
8
9
from Crypto.Util.number import*

p = getPrime(512)
q = getPrime(512)
N = p*q
p>>200

# phigh = 7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902
# N = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147

coppersimth恢复低位
脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from Crypto.Util.number import*

phigh = 7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902
N = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147

phigh = phigh << 200
PR.<x> = PolynomialRing(Zmod(N))
f = x + phigh
plow = f.small_roots(X = 2^200,beta = 0.5)[0]

p = plow + phigh
print(isPrime(int(p))) # true
print(plow)
# 974603322091149829361232367132035607671713832582876467663271

rsa9

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from Crypto.Util.number import *
from secret import flag
def get_gift(p, q):
noise = getPrime(40)
p, q = p + 2 * noise + 1, q - pow(noise, 2)
gift = 2024 * (p + q)
return gift


p = getPrime(512)
q = getPrime(512)
n = p * q
e = 0x10001
m = bytes_to_long(flag)

c = pow(m, e, n)
gift = get_gift(p, q)

print(f'c = {c}')
print(f'n = {n}')
print(f'gift = {gift}')
'''
c = 24901048984142704853633433027448547116825299004084316241682312231028756073435254517957207224242702547343847243257330804436268227848181223777965694582622809771970139201388868164298214700943651590360063637935420876853787453713938651706081666674987445803879789749190457183998405307437738182310399215763059574014
n = 91959628228529567041071118117027894029700274934376165747236009046400559582804524329175892084338295472268220471037396745487136101440838784431319445321267546485170554118213526830708392117938504184546463286348807373000557573402523660379528649472231624780720997908481712095738525219431101454049375883874306299427
gift = 39547655338591268416024892946343460747211218550535995617642903613170150955997840152715201498906344562997468416098343128362185851706762400674501008847952116336
'''

思路是,gift可以求出p+q的高位(低80位丢失),通过式子 n = (p + q - q) * q求出q高位,再coppersmith求出完整的q

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from Crypto.Util.number import *

# noise = getPrime(40) ** 2
# print(noise.bit_length())

c = 24901048984142704853633433027448547116825299004084316241682312231028756073435254517957207224242702547343847243257330804436268227848181223777965694582622809771970139201388868164298214700943651590360063637935420876853787453713938651706081666674987445803879789749190457183998405307437738182310399215763059574014
n = 91959628228529567041071118117027894029700274934376165747236009046400559582804524329175892084338295472268220471037396745487136101440838784431319445321267546485170554118213526830708392117938504184546463286348807373000557573402523660379528649472231624780720997908481712095738525219431101454049375883874306299427
gift = 39547655338591268416024892946343460747211218550535995617642903613170150955997840152715201498906344562997468416098343128362185851706762400674501008847952116336
e = 0x10001

gift = gift // 2024
# n = p * q = (p + q - q) * q
p_q_high = ((gift >> 80) + 1) << 80

PR.<x> = PolynomialRing(RealField(432))# 512 - 80 = 432 现在可以简单这样理解。本质是精度损失,一般会在432上浮动
f = (p_q_high - x) * x - n
print(f.roots())
q = int(f.roots()[0][0])

PR.<x> = PolynomialRing(Zmod(n))
f = ((q >> 80) << 80) + x
q_low = int(f.small_roots(X=2^81,beta=0.2)[0])
# print(q_low)
q = ((q >> 80) << 80) + q_low
print(isPrime(q))# true
print(n % q) # 0

p = n // q
L = (p-1)*(q-1)
d = inverse(e,L)
m = int(pow(c,d,n))
print(long_to_bytes(m))
# flag{afhkhkahkjafshkjafshfahkjfa}

Day3

Ez_aes

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Cipher import DES
import secrets
import string

flag = 'moectf{???}'
characters = string.ascii_letters + string.digits + string.punctuation
key = 'ezdes'+''.join(secrets.choice(characters) for _ in range(3))
assert key[:5] == 'ezdes'
key = key.encode('utf-8')
l = 8

def encrypt(text, key):
cipher = DES.new(key, DES.MODE_ECB)
padded_text = text + (8 - len(text) % 8) * chr(len(text))
data = cipher.encrypt(padded_text.encode('utf-8'))
return data

c = encrypt(flag, key)
print('c =', c)

# c = b'\xe6\x8b0\xc8m\t?\x1d\xf6\x99sA>\xce \rN\x83z\xa0\xdc{\xbc\xb8X\xb2\xe2q\xa4"\xfc\x07'

直接爆破key就行

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import *
from Cryptodome.Cipher import DES
import string

characters = string.ascii_letters + string.digits + string.punctuation
c = b'\xe6\x8b0\xc8m\t?\x1d\xf6\x99sA>\xce \rN\x83z\xa0\xdc{\xbc\xb8X\xb2\xe2q\xa4"\xfc\x07'

for i in characters:
for j in characters:
for k in characters:
key = f'ezdes{i}{j}{k}'.encode('utf-8')
try:
m = DES.new(key, DES.MODE_ECB).decrypt(c)
if b'moectf' in m:
print(m)
except:
pass

西电CTF刷题笔记(crypto)
https://baymax-fools.github.io/2026/03/12/crypto/西电CTF刷题笔记-crypto/
Author
Baymax
Posted on
March 12, 2026
Updated on
March 24, 2026
Licensed under