NSSCTF-Round17

NSSCTF————Round17————Crypto题解

Round17

Level 1

task.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#真签到题
from Crypto.Util.number import bytes_to_long, getPrime
from secret import getflag

e1 = getPrime(1024)
e2 = getPrime(1024)
n = e1 * e2
m = bytes_to_long(getflag().encode())
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
print(n)
print(c1)
print(c2)
print(e1)
print(e2)

# n = 22517647586235353449147432825948355885962082318127038138351524894369583539246623545565501496312996556897362735789505076324197072008392656511657262430676945685471397862981216472634785622155317188784494912316440866051402627470561626691472280850273482836308002341429493460677206562201947000047718275995355772707947408688836667011206588727438261189233517003341094758634490421007907582147392858070623641389171229435187248184443645883661560636995548332475573072064240073037558031928639832259001407585962782698021735648128101459118863015844905452823095147248865104102562991382119836061161756978764495337874807458182581421229
# c1 = 1432393096266401187029059077791766305797845826173887492889260179348416733820890797101745501984437201566364579129066414005659742104885321270122634155922766503333859812540068278962999824043206496595825886026095484801291802992082454776271149083516187121160475839108002133113254134626407840182541809478892306748590016896975053434021666376203540725254480252049443975835307793528287818262102688334515632062552114342619781840154202525919769192765621085008206581226486157149883898548933475155236509073675387541466324512294079413938239828341890576923100769181401944289365386552139418728492565319685207500539721582552448971814
# c2 = 13299679392897297864252207869444022461237574801991239380909482153705185317634241850084078027230394830079554676426505967970943836811048777462696506309466535820372917756458083553031417406403895116557560548183674144457502601887632495739472178857537011190162283185735114683172731936834993707871636782206418680404006299140864001776588991141011500807549645227520128216130966268810165946959810884593793452437010902774726405217517557763322690215690606067996057037379898630878638483268362526985225092000670251641184960698506349245915816808028210142606700394584541282682338561482561343076218115042099753144875658666459825545602
# e1 = 155861690390761931560700906834977917646203451142415617638229284868013723431003139974975998354830978765979365632120896717380895021936387027045347260400512396388028781862427862974453223157509702913026222541667006325100878113871620322023188372501930117363623076837619478555007555970810681502521309925774889678793
# e2 = 144471983652821947847253052623701746810204736865723159569786739658583884214397562204788127484897909964898113250509653721265240138487697822089282456150238116811225975640330930854549232972314642221382625614304415750165289831040623741828600283778523993251940904896081111235859249916040849697146542311990869696453

很基础的共模攻击

exp

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
from Crypto.Util.number import *
import gmpy2

n = 22517647586235353449147432825948355885962082318127038138351524894369583539246623545565501496312996556897362735789505076324197072008392656511657262430676945685471397862981216472634785622155317188784494912316440866051402627470561626691472280850273482836308002341429493460677206562201947000047718275995355772707947408688836667011206588727438261189233517003341094758634490421007907582147392858070623641389171229435187248184443645883661560636995548332475573072064240073037558031928639832259001407585962782698021735648128101459118863015844905452823095147248865104102562991382119836061161756978764495337874807458182581421229
c1 = 1432393096266401187029059077791766305797845826173887492889260179348416733820890797101745501984437201566364579129066414005659742104885321270122634155922766503333859812540068278962999824043206496595825886026095484801291802992082454776271149083516187121160475839108002133113254134626407840182541809478892306748590016896975053434021666376203540725254480252049443975835307793528287818262102688334515632062552114342619781840154202525919769192765621085008206581226486157149883898548933475155236509073675387541466324512294079413938239828341890576923100769181401944289365386552139418728492565319685207500539721582552448971814
c2 = 13299679392897297864252207869444022461237574801991239380909482153705185317634241850084078027230394830079554676426505967970943836811048777462696506309466535820372917756458083553031417406403895116557560548183674144457502601887632495739472178857537011190162283185735114683172731936834993707871636782206418680404006299140864001776588991141011500807549645227520128216130966268810165946959810884593793452437010902774726405217517557763322690215690606067996057037379898630878638483268362526985225092000670251641184960698506349245915816808028210142606700394584541282682338561482561343076218115042099753144875658666459825545602
e1 = 155861690390761931560700906834977917646203451142415617638229284868013723431003139974975998354830978765979365632120896717380895021936387027045347260400512396388028781862427862974453223157509702913026222541667006325100878113871620322023188372501930117363623076837619478555007555970810681502521309925774889678793
e2 = 144471983652821947847253052623701746810204736865723159569786739658583884214397562204788127484897909964898113250509653721265240138487697822089282456150238116811225975640330930854549232972314642221382625614304415750165289831040623741828600283778523993251940904896081111235859249916040849697146542311990869696453

def dec(n,e1,e2,c1,c2):
t = gmpy2.gcd(e1,e2)
if t == 1:
s,x,y = gmpy2.gcdext(e1,e2)
m = (pow(c1,x,n)*pow(c2,y,n))%n
flag = long_to_bytes(m)
return flag
else:
s,x,y = gmpy2.gcdext(e1,e2)
k = 0
while 1:
m = gmpy2.iroot((pow(c1,x,n)*pow(c2,y,n)+k*n)%n,t)
if m[1]:
print(long_to_bytes(m[0]))
break
else:
k += 1
flag = dec(n,e1,e2,c1,c2)
print(flag)
# NSSCTF{Y0u_Hav3_S01v3d_Crypt0_Leve1_i}

level 2

task.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 猜猜我是谁 猜对了直接秒出flag喔
from Crypto.Util.number import bytes_to_long, getPrime
from secret import getflag

p = ***
q = getPrime(1024)
e = you guess!
n = p * q
m = bytes_to_long(getflag().encode())
c=pow(m, e, n)
print(q)
print(c)

#p=one of ps
#q=145721736470529261146573065574028992352505611489859183763269215489708531333597694809923949026781460438320576519639268582565188719134157402292313959218961804213310847081787824780075530751842057663327444602428455144829447776271394663729996984613471623158126083062443634493708467568220146024273763894704649472957
#c=17441814714407189483380175736850663249578989775568187792928771544069162420510939242665830363276698262009780462912108642025299275146709817979705069095332726251759039923303627023610865046363171692163473939115438686877494878334016463787558794121885354719336139401336137097548305393030069499625065664884238710759260231321106291200849044147840392021931720902340003746946851806025722944795391356835342258387797980787437188976704677008092850181043891802072500430200735973581081228711070923822341261809453662427341958883142789220800541626034573952425948295446202775198692920613709157662831071515700549093766182579873408465779
#flag=NSSCTF{*}

ps.txt

1
一堆p的值,数据量挺大的,就不放上来了

猜测flag不长,直接把q当模解了

exp

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

q=145721736470529261146573065574028992352505611489859183763269215489708531333597694809923949026781460438320576519639268582565188719134157402292313959218961804213310847081787824780075530751842057663327444602428455144829447776271394663729996984613471623158126083062443634493708467568220146024273763894704649472957
c=17441814714407189483380175736850663249578989775568187792928771544069162420510939242665830363276698262009780462912108642025299275146709817979705069095332726251759039923303627023610865046363171692163473939115438686877494878334016463787558794121885354719336139401336137097548305393030069499625065664884238710759260231321106291200849044147840392021931720902340003746946851806025722944795391356835342258387797980787437188976704677008092850181043891802072500430200735973581081228711070923822341261809453662427341958883142789220800541626034573952425948295446202775198692920613709157662831071515700549093766182579873408465779
d = gmpy2.invert(65537,q-1)
m = pow(c,d,q)
print(long_to_bytes(m))
# NSSCTF{Y0u_g0t_1t!!!}

level 3

题目

解666次共模攻击即可

exp

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
from Crypto.Util.number import *
import gmpy2
from pwn import *
from tqdm import *

def dec(n,e1,e2,c1,c2):
t = gmpy2.gcd(e1,e2)
if t == 1:
s,x,y = gmpy2.gcdext(e1,e2)
m = (pow(c1,x,n)*pow(c2,y,n))%n
flag = long_to_bytes(m)
return flag
else:
s,x,y = gmpy2.gcdext(e1,e2)
k = 0
while 1:
m = gmpy2.iroot((pow(c1,x,n)*pow(c2,y,n)+k*n)%n,t)
if m[1]:
print(long_to_bytes(m[0]))
break
else:
k += 1
sh = remote("host",port)

for i in trange(666):
data = sh.recvuntil(b" y0u J01n In th3 NSS t3am?\n py?\n")
n = eval(sh.recvline().decode().strip().split("=")[-1])
e1 = eval(sh.recvline().decode().strip().split("=")[-1])
e2 = eval(sh.recvline().decode().strip().split("=")[-1])
c1 = eval(sh.recvline().decode().strip().split("=")[-1])
c2 = eval(sh.recvline().decode().strip().split("=")[-1])

flag = dec(n,e1,e2,c1,c2)
sh.sendlineafter(b"[+] Pl Give Me flaag :",flag)
sh.interactive()

Round18

New Year Ring1

task.py

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
from Crypto.Util.number import *
from random import *
from secret import flag

p = getPrime(128)
n = 64
assert len(flag) < n

PRp.<x> = PolynomialRing(Zmod(p))
f = x^n+2*x^3+0*x^2+2*x+4 #welcome to 2024!
PR = PRp.quo(f)
assert f.is_irreducible()

A = [randint(0, p) for i in range(n)]
E = [randint(-4, 4) for i in range(n)]
S = [ord(flag[i]) for i in range(len(flag))]

B = PR(A)*PR(S)+PR(E)
print(A)
print(B.list())
print(p)

#[25628433222756085994492259068849402115, 108192689210265022288173745176216677895, 85974352459523213168503152436203993854, 41828313114844948099739205193013146660, 15961445864161535368425735570577871568, 59860624089211511801244965491114405123, 72238114736535717286419734164194491146, 1731419769773538054984020741260144321, 110926179088722293171658261432626666958, 4729059639835826882559436203284470206, 168495809056757598731123948067040373565, 3338360642630078653320363127167526308, 19389936220034072874232261675901806153, 10438117635879553768611012406691341169, 153667038046207304584441437937384897775, 72166665774655568880543097047667804863, 95319528381704092095798376951073542165, 62898039808274250589921375492358418705, 38256076367009076141369526506747299307, 116682168147974451260364221046574659055, 26917522774848180141649752130328445540, 155767907175579627310170473659502971153, 77475859845928815191730640478115081925, 70014064310214050035280946814599808820, 85993451838284022745989979544017241858, 1559588202521630621698182776746048258, 52424771201426327411234245307354332594, 92380990205273211168316314938871853614, 55868954214861940284812204603983552046, 86766496415006406161245997036503548760, 65631024912623216715877274133399692328, 165552413066518454864366169079315182837, 27090806019996818214310558040178209015, 24884235560487406082425405304334927881, 167131388381252997695719535111304864318, 84309157064049564271714180786273613498, 53226032826639984552629376026393806036, 10043888404273006035387494091731007691, 12579929759225042382751229048796566699, 166363316914893642035801926729741157934, 37839073681950914796852925854557791313, 59823734019834883911363191453005985507, 72713054697995652053446065501322532087, 7355549923971285393506940087861413681, 21734747677920938504945342916533076569, 93933129166049277428941778125233010374, 58955842096425290408052247755008181893, 35959399375270454336325579486716264076, 134512300913738209016228764504703580317, 156877088942396466398635185398252103142, 104513294126348280186621088034948750337, 58139022317938952038809444482141783106, 98565612260156356115401166878515345986, 114416081175175578305854221578018095237, 22901750234260702478992290068664968479, 156611313609023033314989985233189973832, 125083132555321363078288077242345281728, 41404163164349704408020008746598776378, 148785934103979787297708145558354509586, 60576000474984112015781658795707443603, 157378782433123699827402744836263199181, 115808625117495689666174307128964343007, 55532885470248050887252206269085843644, 167226824329071601899518640284153209079]
#[125436276837023032466255967451858640606, 144448119937248956307846718982491347769, 162306129951573761575068204811168998078, 83181011846487027653033036479190112408, 40957533970438134530667298492545012058, 39781894692503876914564462045404705807, 164051006333092368306831348749408921012, 111012742481005666423330275146981180733, 7715720858029882578293974044643808669, 157677217515339873901600902409190036650, 47743593975916243882559558507891093023, 157986164305142738632123943371346719550, 127635891927296917312348404019956617317, 29559276398124624593609203169860820474, 65960871111768788316941346555260753893, 168042316135611110131429808009369471733, 1212659292467585393525194729053590464, 131142075720852427381782478157244639696, 102842995705164719704337121568124710266, 34358829636338044181518280022135929086, 46061675284276849395800943167734760351, 135977825342856793359560567810384022667, 79194609568617048147045548433187673199, 3676419995870098657902754244090307337, 129102404404523795672123957629514020212, 132931883751740337774987369503377603250, 157631873978881249131112881234813720862, 25064634967243118171242164160769943822, 90201135758213533081777343764941590513, 28708219563163506588485189820706388938, 56568253458138625936076514562071708932, 6347413009696777418004642228340087455, 142708918733729617152197380466325161544, 90675635242552386205397936839615479057, 92501808867676816791538575898905495372, 119574898086174634261072854178847743198, 109965735435324316785759245560872940757, 88027969746581556885954470651939385855, 134321591115155640446804238393795645472, 138737181251155600814378949277591209336, 99644145229459444132485749993357552167, 72102411291892187794699247448258325603, 83762370748394317206974170435605895442, 50088402451174667055894866569295371337, 151985189458457003469569692195947019009, 94074842589490698882361618773816024181, 73064286019059695311967281427732071049, 15926695040044471692620032927734856548, 92040182094543438421700664648795356800, 72067816134410856572981520568082148623, 51543145349488111975169803932104264498, 133476358234399233123899184886685568681, 138871089323661273034769987507240180967, 135182088478518211398715618356312799892, 142132493504501637417871042380487888261, 152821195684002682180600788766787854997, 108605984719600234041614912160255546443, 107009285527858918462712915168386920973, 142315287684855833566016316758770217595, 120564701831156855156008640956601967150, 76342952544707200039421682949094541165, 1616883292120605398623492917180224681, 114803483209077151333130433872010751344, 59602734024539592667147877839382863851]
#p = 171384865635734387982308861436753436427
-------------已经到底啦!-------------