NSSCTF平台

[SWPUCTF 2021 新生赛]traditional

【题目】

西方的二进制数学的发明者莱布尼茨,从中国的八卦图当中受到启发,演绎并推论出了数学矩阵,最后创造的二进制数学。二进制数学的诞生为计算机的发明奠定了理论基础。而计算机现在改变了我们整个世界,改变了我们生活,而他的源头却是来自于八卦图。现在,给你一组由八卦图方位组成的密文,你能破解出其中的含义吗?

震坤艮 震艮震 坤巽坤 坤巽震 震巽兑 震艮震 震离艮 震离艮

【题解】

从网上随便找一张八卦图,看看怎么个事。

《太平御览》:“伏羲坐于方坛之上,听八风之气,乃画八卦。”以“—”为阳,以“—”为阴,组成八卦:乾为天,坤为地,震为雷,巽为风,坎为水,艮为山、离为火,兑为泽,以类万物之情。

然后翻译一下:震坤艮 震艮震 坤巽坤 坤巽震 震巽兑 震艮震 震离艮 震离艮

得到:001000100 001100001 000110000 000110001 001110011 001110001 001101100 001101100

二进制我只能想到ASCII,但是似乎多了一位,那就删掉一个0试一试。。。

【flag】

Da01sall

神奇小靶场

RSA1

【题目】

入门RSA,稍微了解一下RSA加密就可以知道如何解密了,不要忘了,使用Python中的gmpy2求逆元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import gmpy2
import libnum
from Crypto.Util.number import *
flag = b'flag{test}'
p = getPrime(1024)
q = getPrime(1024)
n = p*q
e = 65537
m = bytes_to_long(flag)
c = pow(m,e,n)
print("p=",p)
print("q=",q)
print("e=",e)
print("c=",c)
"""
p= 134130727184729155940851906536949448046976385327177522137990391474539419419150196275422094467596857126675909800667909567817321531261174157923782118086071324636466346132431796997355181071784321615122709146943468613538827812626312720367745542766669403924397418997862259112119161663165099380707770356703209567383
q= 149506366518724374646241921031435641256819623876897705005311499966590301960846354126794983822080515305516014490652476028118088640422511069027229114463544993552704917602460060412734699178437558722896253154024696768397193511961122555537728964027370082563066439239309051965874762422767337368463780733047722605897
e= 65537
c= 4761811396964418944310732231450768407798854201505560093997908060867829330236573717011132357475866918361945136103972428836546238625620404710531239286378593196394685884612257738837386032546917870085223488559404728667390877539704309112463393019974597250307629166779366192548151376348343011123779042667579933600144738498343518699107784861635385679880319433546574472420533269490129654054223683910971113458698392505924858266425592172877559906303611990246455467677753797745356634283994472963454818554437027075673359612152415909979360203926411861757525830938940327063812221930101829798941568203018239341255035926228617593037
"""

【题解】

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

p= 134130727184729155940851906536949448046976385327177522137990391474539419419150196275422094467596857126675909800667909567817321531261174157923782118086071324636466346132431796997355181071784321615122709146943468613538827812626312720367745542766669403924397418997862259112119161663165099380707770356703209567383
q= 149506366518724374646241921031435641256819623876897705005311499966590301960846354126794983822080515305516014490652476028118088640422511069027229114463544993552704917602460060412734699178437558722896253154024696768397193511961122555537728964027370082563066439239309051965874762422767337368463780733047722605897
e= 65537
c= 4761811396964418944310732231450768407798854201505560093997908060867829330236573717011132357475866918361945136103972428836546238625620404710531239286378593196394685884612257738837386032546917870085223488559404728667390877539704309112463393019974597250307629166779366192548151376348343011123779042667579933600144738498343518699107784861635385679880319433546574472420533269490129654054223683910971113458698392505924858266425592172877559906303611990246455467677753797745356634283994472963454818554437027075673359612152415909979360203926411861757525830938940327063812221930101829798941568203018239341255035926228617593037

n = q * p
# print(n)
d = gmpy2.invert(e, (p - 1) * (q - 1))
print("d=", d)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))

【flag】

flag{you_know_RSA}

RSA2

【题目】

只给了n,但是p、q好像很接近,爆破还是分解?yafu可是好工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Util.number import *
import flag
import libnum
import gmpy2
p = getPrime(512)
q = gmpy2.next_prime(p)
n = p*q
flag = flag.flag0.encode("utf-8")
m = bytes_to_long(flag)
e = 65537
c =pow(m,e,n)
print("n=",n)
print("e=",e)
print("c=",c)
"""
n= 75351801028309096913653671449892383422166541134441035181326895773755065423995545871268190636567949446201328493978194007866684801547757553323446231811416525820720242526394481243894981193603407436110497709210465573464621834469605704944363576763669648490519972617948347287776916197611004986848293196246393563703
e= 65537
c= 43878612450283913722397161886579995423116518180274313541359804326216013176911163229488503206082624454218338427157555364144524659034606422092213298112856768949267313002160978975669631526786184844197096653486450564474291459251951057962094911262330928308242061885075104928051815080810767342055964426435340234545
"""

【题解】

题目给了个很大的n,不妨用yafu分解一下。

image-20250116195725982

得到p和q的值

再用脚本解密:

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

p= 8680541516997029887176660952794000677499455575593179374603125042832345347646452033335393551662804186942536632802239143713654438930907149491649630029600327
q= 8680541516997029887176660952794000677499455575593179374603125042832345347646452033335393551662804186942536632802239143713654438930907149491649630029599889
e= 65537
c= 43878612450283913722397161886579995423116518180274313541359804326216013176911163229488503206082624454218338427157555364144524659034606422092213298112856768949267313002160978975669631526786184844197096653486450564474291459251951057962094911262330928308242061885075104928051815080810767342055964426435340234545

n = q * p
# print(n)
d = gmpy2.invert(e, (p - 1) * (q - 1))
print("d=", d)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))

【flag】

flag{222d1c22-3b28-430c-a6fd-5db32e6fae51}

RSA3

【题目】

这个e怎么这么小啊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import libnum
from Crypto.Util.number import *
import flag
flag = flag.flag1.encode('utf-8')
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
e = 3
c = pow(m,e,n)

print("c=",c)
"""
c= 175676150266426385777488960398437411080564871372619514362479249283222674118823348014700859315580475571180545369853838258426366884831194989919272272857667569146797227939406529667929979645271850983414750436697805559244234436965428282253389069272832594322143917792559152710464068415235930067950784352373093
"""

【题解】

这题是低加密指数攻击。

假设$e=3$, 公钥$Q$中的加密指数$e$很小,但是模数$n$很大,有RSA加密公式:$c\equiv m^e(mod n)$ ($c$密文,$m$明文) ,则:

​ 当$m^e<n$时,$c=m^e$,所以对$c$开方就能得到$m$ ;

​ 当$m^e>n$时,此时用爆破的方法:

​ 假设我们$m^e/n$的商为$k$余数为$c$,则$m^e=kn+c$,对$k$进行爆破,只要$k$满足$kn+c$能够开e次方就可以得明文。

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

e=3
c=175676150266426385777488960398437411080564871372619514362479249283222674118823348014700859315580475571180545369853838258426366884831194989919272272857667569146797227939406529667929979645271850983414750436697805559244234436965428282253389069272832594322143917792559152710464068415235930067950784352373093

e = int(e)
c = int(c)

m = iroot(c, e)
if m[1]:
m = m[0]
print(long_to_bytes(m))

【flag】

flag{82ad5d36-3ee5-47cf-a370-f84d3fc8fac4}

RSA4

【题目】

简单的解方程,sage是个好工具

1
2
3
4
n = 24585768801100871989460458412563674690545986652089097718040761783186739174559136657307807040444318337561194142282186006216583089898423180103199568738639814413601595196467099996734334212909157604318709957690532885862891927163713619932622153281344607898846228206181834468325246573910857887714824338949742479585089251882243488454602710292507668577598274622372304293403731722318890268908300308478539449464617438721833942643889296634768118375076052778833640986893990732882252524850152650060780854621796349622086656401914022236044924841914313726991826438982902866584892213702893596657746111940812657202364588469026832387629
p - q = 14048479366496281701869293063643750801596179514889914988732592464154208813942939793532694949932787548745769133200541469022315588864587160064703369956054828780928008235304461825448872454098086255531582368864754318040219023548966787642948010656526691472780392631956031751285174567712974691729142190835749586660
e = 65537
c = 13043206753625359891696429504613068427529111016070088678736297291041435652992434742862062899975037273524389833567258051170507686131853178642412748377655159798601888072877427570380109085131089494464136940524560062629558966202744902709909907514127527274581612606840291391818050072220256661680141666883565331886278443012064173917218991474525642412407692187407537171479651983318468186723172013439034765279464665108704671733067907815695414348312753594497823099115037082352616886076617491904991917443093071262488786475411319592529466108485884029307606114810451140886975584959872328937471166255190940884805476899976523580343

【题解】

用sage跑一下,得出p、q的值。注意p和q均为正数。

image-20250116212405283

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

p= 163979993780473228636250944509658100304105288291161815533296974391197924208241177469979929848925840413549589001337016682107921402071171221384247679860925727646585534725356410523705767408370013103023547625067109338180880560875828450693640775629005283101707663609483220395891338395873247794351441082424506156057
q= 149931514413976946934381651446014349502509108776271900544564381927043715394298237676447234898993052864803819868136475213085605813206584061319544309904870898865657526490051948698256894954271926847491965256202355020140661537326861663050692764972478591628927270977527188644606163828160273102622298891588756569397
e= 65537
c= 13043206753625359891696429504613068427529111016070088678736297291041435652992434742862062899975037273524389833567258051170507686131853178642412748377655159798601888072877427570380109085131089494464136940524560062629558966202744902709909907514127527274581612606840291391818050072220256661680141666883565331886278443012064173917218991474525642412407692187407537171479651983318468186723172013439034765279464665108704671733067907815695414348312753594497823099115037082352616886076617491904991917443093071262488786475411319592529466108485884029307606114810451140886975584959872328937471166255190940884805476899976523580343

n = q * p
# print(n)
d = gmpy2.invert(e, (p - 1) * (q - 1))
print("d=", d)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))

【flag】

nctf{my_M4th_1s_t00_b4d!!!}

RSA5

【题目】

还是解方程,以后看到除p*q外的p、q的另外的关系要看看能不能解方程哦

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

m = bytes_to_long(flag)
e = 65537
p = getPrime(512)
q = getPrime(128)
n = p*q
hint = p**3-q**5
c = pow(m,e,n)
print(f'n = {n}')
print(f'c = {c}')
print(f'hint = {hint}')
'''
n = 2230791374046346835775433548641067593691369485828070649075162141394476183565187654365131822111419512477883295758461313983481545182887415447403634720326639070667688614534290859200753589300443797
c = 2168563038335029902089976057856861885635845445863841607485310134441400500612435296818745930370268060353437465666224400129105788787423156958336380480503762222278722770240792709450637433509537280
hint = 392490868359411675557103683163021977774935163924606169241731307258226973701652855448542714274348304997416149742779376023311152228735117186027560227613656229190807480010615064372521942836446425717660375242197759811804760170129768647414717571386950790115746414735411766002368288743086845078803312201707960465419405926186622999423245762570917629351110970429987377475979058821154568001902541710817731089463915930932142007312230897818177067675996751110894377356758932
'''

【题解】

【flag】

RSA_费马1

【题目】

【题解】

【flag】

RSA_费马2

【题目】

【题解】

【flag】