本文主要是介绍NSSCTF习题练习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.[AFCTF 2018]你能看出这是什么加密么
该题题目已经给出了p,q,e,c,按照常规解密即可,解密脚本如下:
from Crypto.Util.number import *
from gmpy2 import *p = 0x928fb6aa9d813b6c3270131818a7c54edb18e3806942b88670106c1821e0326364194a8c49392849432b37632f0abe3f3c52e909b939c91c50e41a7b8cd00c67d6743b4fq = 0xec301417ccdffa679a8dcc4027dd0d75baf9d441625ed8930472165717f4732884c33f25d4ee6a6c9ae6c44aedad039b0b72cf42cab7f80d32b74061e = 0x10001
p = int(p)
q = int(q)
e = int(e)
n = p * q
c = 0x70c9133e1647e95c3cb99bd998a9028b5bf492929725a9e8e6d2e277fa0f37205580b196e5f121a2e83bc80a8204c99f5036a07c8cf6f96c420369b4161d2654a7eccbdaf583204b645e137b3bd15c5ce865298416fd5831cba0d947113ed5be5426b708b89451934d11f9aed9085b48b729449e461ff0863552149b965e22b6
c = int(c)
phi = (p - 1) * (q - 1)
d = invert(e, phi)
m = powmod(c, d, n)
print(long_to_bytes(m))
有意思的是,得到的结果一开始为乱码,但发现flag在最后面
b'\x02\xd3\xe4v\xea\x80r\x83\xda\x99\x88\xf5#\x08\xbbAT\x8b\xaf\xd2\xf4\xdc\x9f\xd3\xbf\xb7A\xc3\xcc\xc5`\xa1\x8b\x86\x18y\xd0&\x88\x10\xef\xbe\x83\xcer\xceC\x17\xec[\xb7%\x08\xef\x16\x1f\xab\x0c\x96\xa3\xdc N^\x8e,\xa3\x11{\x99U\xcd\x15o\xd7B\xf4L\x8f}&\xc5$\xca\xd5;\xf9\x02Y\xc1\xbbS\xfd4\x83M\x96\xa9\xbd;\x83/\xf7\x00afctf{R54_|5_$0_$imp13}'
最终flag为:NSSCTF{R54_|5_$0_$imp13}
二.[SWPUCTF 2021 新生赛]crypto5
观察题目附件
flag= 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333
n= 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419
发现flag的长度很短,判断e也很小,为低加密指数和小明文攻击;这里要进行一些数学分析:
c等于m的e次方模n,所以k*n+c就等于m的e次方
所以我们可以令m1 = k*n+c;m1为m的e次方;
gmpy2的iroot函数用于开n次方,两个参数m,n,返回结果为一个数字(对m开n次方),结果为整数,和一个布尔数(结果的n次方是否刚好等于原来的数)
在一定范围内进行枚举求出k,脚本如下:
import libnum
import gmpy2
from Crypto.Util.number import *n = 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419
e = 3
c = 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333def exp(n, e, c):k = 0while 1:m1 = k * n + c#我们知道iroot函数传入双参,对于下式,如果m1可以被e开更号(精确开更),则m就是开更后的结果,t就是truem, t = gmpy2.iroot(m1, e)if t:print(m)print(k)# print(libnum.n2s(int(m)))print(long_to_bytes(m))breakk += 1
exp(n, e, c)
最终得出flag:NSSCTF{because_i_like};
三.[HGAME 2022 week3]RSA attack 3
看该题目的标签为维纳攻击,就先了解一下什么是维纳攻击:
这里参考了一篇文章:https://www.cnblogs.com/wandervogel/p/16805992.htmlhttps://www.cnblogs.com/wandervogel/p/16805992.html
在有了一个基本了解后我们看给出的附件:
n = 507419170088344932990702256911694788408493968749527614421614568612944144764889717229444020813658893362983714454159980719026366361318789415279417172858536381938870379267670180128174798344744371725609827872339512302232610590888649555446972990419313445687852636305518801236132032618350847705234643521557851434711389664130274468354405273873218264222293858509477860634889001898462547712800153111774564939279190835857445378261920532206352364005840238252284065587291779196975457288580812526597185332036342330147250312262816994625317482869849388424397437470502449815132000588425028055964432298176942124697105509057090546600330760364385753313923003549670107599757996810939165300581847068233156887269181096893089415302163770884312255957584660964506028002922164767453287973102961910781312351686488047510932997937700597992705557881172640175117476017503918294534205898046483981707558521558992058512940087192655700351675718815723840568640509355338482631416345193176708501897458649841539192993142790402734898948352382350766125000186026261167277014748183012844440603384989647664190074853086693408529737767147592432979469020671772152652865219092597717869942730499507426269170189547020660681363276871874469322437194397171763927907099922324375991793759
e = 77310199867448677782081572109343472783781135641712597643597122591443011229091533516758925238949755491395489408922437493670252550920826641442189683907973926843505436730014899918587477913032286153545247063493885982941194996251799882984145155733050069564485120660716110828110738784644223519725613280140006783618393995138076030616463398284819550627612102010214315235269945251741407899692274978642663650687157736417831290404871181902463904311095448368498432147292938825418930527188720696497596867575843476810225152659244529481480993843168383016583068747733118703000287423374094051895724494193455175131120243097065270804457787026492578916584536863548445813916819417857064037664101684455000184987531252344582899589746272173970083733130106407810619258077266603898529285634495710846838011858287024329514491058790557305041389614650730267774482954666726949886313386881066593946789460028399523245777171320319444673551268379126203862576627540177888290265714418064334752499940587750374552330008143708562065940245637685833371348603338834447212248648869514585047871442060412622164276894766238383894693759347590977926306581080390685360615407766600573527565016914830132066428454738135380178959590692145577418811677639050929791996313180297924833690095
c = 165251729917394529793163344300848992394021337429474789711805041655116845722480301677817165053253655027459227404782607373107477419083333844871948673626672704233977397989843349633720167495862807995411682262559392496273163155214888276398332204954185252030616473235814999366132031184631541209554169938146205402400412307638567132128690379079483633171535375278689326189057930259534983374296873110199636558962144635514392282351103900375366360933088605794654279480277782805401749872568584335215630740265944133347038070337891035560658434763924576508969938866566235926587685108811154229747423410476421860059769485356567301897413767088823807510568561254627099309752215808220067495561412081320541540679503218232020279947159175547517811501280846596226165148013762293861131544331444165070186672186027410082671602892508739473724143698396105392623164025712124329254933353509384748403154342322725203183050328143736631333990445537119855865348221215277608372952942702104088940952142851523651639574409075484106857403651453121036577767672430612728022444370874223001778580387635197325043524719396707713385963432915855227152371800527536048555551237729690663544828830627192867570345853910196397851763591543484023134551876591248557980182981967782409054277224
可以看出e很大,应使用维纳攻击
脚本如下
from Crypto.Util.number import *
from gmpy2 import *class ComtinuedFraction:def __init__(self, numerator, denumerator):self.numberlist = []self.fractionlist = [] # k,d的值self.GenerateNumberList(numerator, denumerator)# GenerateNumberList方法用于生成连分数的每一项,直到分子变为1。每次循环将商添加到numberlist列表中,并更新分子和分母的值。self.GeneraterFractionList()# GeneraterFractionList方法用于生成连分数的每一项,即分子和分母的列表。通过一个循环遍历numberlist列表,计算每一项的值,并将结果添加到fractionlist中。def GenerateNumberList(self, numerator, denumerator):while numerator != 1:quotient = numerator // denumeratorremainder = numerator % denumeratorself.numberlist.append(quotient)numerator = denumeratordenumerator = remainderdef GeneraterFractionList(self):self.fractionlist.append([self.numberlist[0], 1])for i in range(1, len(self.numberlist)):numerator = self.numberlist[i]denumerator = 1for j in range(i):temp = numeratornumerator = denumerator + numerator * self.numberlist[i - j - 1]denumerator = tempself.fractionlist.append([numerator, denumerator])n = 507419170088344932990702256911694788408493968749527614421614568612944144764889717229444020813658893362983714454159980719026366361318789415279417172858536381938870379267670180128174798344744371725609827872339512302232610590888649555446972990419313445687852636305518801236132032618350847705234643521557851434711389664130274468354405273873218264222293858509477860634889001898462547712800153111774564939279190835857445378261920532206352364005840238252284065587291779196975457288580812526597185332036342330147250312262816994625317482869849388424397437470502449815132000588425028055964432298176942124697105509057090546600330760364385753313923003549670107599757996810939165300581847068233156887269181096893089415302163770884312255957584660964506028002922164767453287973102961910781312351686488047510932997937700597992705557881172640175117476017503918294534205898046483981707558521558992058512940087192655700351675718815723840568640509355338482631416345193176708501897458649841539192993142790402734898948352382350766125000186026261167277014748183012844440603384989647664190074853086693408529737767147592432979469020671772152652865219092597717869942730499507426269170189547020660681363276871874469322437194397171763927907099922324375991793759
e = 77310199867448677782081572109343472783781135641712597643597122591443011229091533516758925238949755491395489408922437493670252550920826641442189683907973926843505436730014899918587477913032286153545247063493885982941194996251799882984145155733050069564485120660716110828110738784644223519725613280140006783618393995138076030616463398284819550627612102010214315235269945251741407899692274978642663650687157736417831290404871181902463904311095448368498432147292938825418930527188720696497596867575843476810225152659244529481480993843168383016583068747733118703000287423374094051895724494193455175131120243097065270804457787026492578916584536863548445813916819417857064037664101684455000184987531252344582899589746272173970083733130106407810619258077266603898529285634495710846838011858287024329514491058790557305041389614650730267774482954666726949886313386881066593946789460028399523245777171320319444673551268379126203862576627540177888290265714418064334752499940587750374552330008143708562065940245637685833371348603338834447212248648869514585047871442060412622164276894766238383894693759347590977926306581080390685360615407766600573527565016914830132066428454738135380178959590692145577418811677639050929791996313180297924833690095
c = 165251729917394529793163344300848992394021337429474789711805041655116845722480301677817165053253655027459227404782607373107477419083333844871948673626672704233977397989843349633720167495862807995411682262559392496273163155214888276398332204954185252030616473235814999366132031184631541209554169938146205402400412307638567132128690379079483633171535375278689326189057930259534983374296873110199636558962144635514392282351103900375366360933088605794654279480277782805401749872568584335215630740265944133347038070337891035560658434763924576508969938866566235926587685108811154229747423410476421860059769485356567301897413767088823807510568561254627099309752215808220067495561412081320541540679503218232020279947159175547517811501280846596226165148013762293861131544331444165070186672186027410082671602892508739473724143698396105392623164025712124329254933353509384748403154342322725203183050328143736631333990445537119855865348221215277608372952942702104088940952142851523651639574409075484106857403651453121036577767672430612728022444370874223001778580387635197325043524719396707713385963432915855227152371800527536048555551237729690663544828830627192867570345853910196397851763591543484023134551876591248557980182981967782409054277224
a = ComtinuedFraction(e, n)
for k, d in a.fractionlist:s = long_to_bytes(powmod(c, d, n))#print(f'd={d}')try:print(s.decode())print("\n")except Exception:pass
得到flag:NSSCTF{dO|YOU:kNOw!tHE*PRINcIplE*bEhInd%WInNEr#aTTacK}
四.[LitCTF 2023]factordb (中级)
根据题目提示,利用该网站来进行分解(其实yafu也可以)factordb.comhttp://www.factordb.com/
套用基础脚本即可:
from Crypto.Util.number import *
import gmpy2
e = 65537
n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
c = 87677652386897749300638591365341016390128692783949277305987828177045932576708p=275127860351348928173285174381581152299
q=319576316814478949870590164193048041239
ph1=(p-1)*(q-1)
b=gmpy2.invert(e,ph1)
m=pow(c,b,n)
print(long_to_bytes(m))
得到flag:NSSCTF{factordb!!!}
五.[黑盾杯 2020]Factor
这道题目的n也是可以分解的,分解出来有三个数,需要找出来与e互质的数。再去求解
n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208
gcd(m, n) = 1
分解后发现逆元不存在,需求新的逆元
from gmpy2 import *
from Crypto.Util.number import *n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208# 对n进行分解,然后取与e互质的因数,得到新的phi和n。然后求得私钥和m
p = [17172929050033177661,11761833764528579549,17100682436035561357]
phi = 1
n = 1
for i in p:if gcd(e, i-1) == 1:phi *= i-1n *= id = invert(e, phi)
print(long_to_bytes(powmod(c, d, n)))
得到flag:CMISCCTF{3_RSA};
这篇关于NSSCTF习题练习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!