ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NSSCTF_SWPU新生赛Crypto_wp

2021-10-23 21:32:31  阅读:506  来源: 互联网

标签:Crypto mod wp print c2 c1 e2 e1 SWPU


这是复现的题目的wp及个人心得,有很多借鉴了大佬的文章及wp,这里就不一一粘贴链接了

Crypto 8

题目:

73E-30U1&>V-H965S95]I<U]P;W=E<GT`

UUencode:

Uuencode是二进制信息和文字信息之间的转换编码

Uuencode将输入文字以每三个字节为单位进行编码,如此重复进行。如果最后剩下的文字少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中

Crypto 7

题目:

69f7906323b4f7d1e4e972acf4abfbfc,得到的结果用NSSCTF{}包裹。

由0-9;a-f组成的不一定是十六进制转换

也有可能是md5加密后的密文;md5加密又分为16位加密或者32位加密;这里的密文是16位的(可以当作判断条件)

Crypto 5

题目:

flag= 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333
n= 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419

试着分解n,在线网站和yafu都不可以

但是这里的c相对n很小;

由 c = m e ( m o d n ) c = m^e (mod n) c=me(modn)

这里有两种情况:

m e > n : m^e > n: me>n:

c + k ∗ n = m e c + k * n = m^e c+k∗n=me

这样就爆破k;当c+k*n能够被e整除时即为m

m e < n : m^e < n: me<n:

c开e次方即为m

由于这里e也未知;但是常见的e一般是3,代进去试一试,或者爆破e也可

代码实现:

import gmpy2
from Crypto.Util.number import *

c = 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333
n = 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419


e = 3 # 假设
k = 0 #注意k是从0开始的;因为还有可能是m^e小于n
while True:
    if gmpy2.iroot(c + k * n,e)[1]:
        m = gmpy2.iroot(c + k * n,e)[0]
        break
    else:
        k += 1
flag = long_to_bytes(m)
print(flag)
# if m**e < n:
#     print("s")

Crypto 3

题目:

from gmpy2 import *
from Crypto.Util.number import *
flag  = '******************'

p = getPrime(512)
q = getPrime(512)
m1 = bytes_to_long(bytes(flag.encode()))

n = p*q

flag1 = pow(m1,p,n)
flag2 = pow(m1,q,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('n= '+str(n))


#flag1= 17893542812755845772427795161304049467610774531005620109503081344099161906017295486868699578946474114607624347167976713200068059018517606363517478396368430072890681401898145302336139240273132723451063402106360810413024642916851746118524166947301681245568333254648265529408446609050354235727237078987509705857
#flag2= 95580409405085606847879727622943874726633827220524165744517624606566789614499137069562997931972825651309707390763700301965277040876322904891716953565845966918293178547100704981251056401939781365264616997055296773593435626490578886752446381493929807909671245959154990639046333135728431707979143972145708806954
#n= 140457323583824160338989317689698102738341061967768153879646505422358544720607476140977064053629005764551339082120337223672330979298373653766782620973454095507484118565884885623328751648660379894592063436924903894986994746394508539721459355200184089470977772075720319482839923856979166319700474349042326898971

观察题目

c 1 = m p   %   n = m p   %   ( p ∗ q ) c1 = m^p~\%~n = m^p~\%~(p*q) c1=mp % n=mp % (p∗q)​

c 2 = m q   %   n = m q   %   ( p ∗ q ) c2 = m^q ~\% ~ n = m^q~\%~(p*q) c2=mq % n=mq % (p∗q)​

所以:

c 1   %   p = m p   ( m o d   p ) c1~\%~p = m^p~(mod~p) c1 % p=mp (mod p)

c 2   %   q = m q   ( m o d   q ) c2~\%~q = m^q~(mod~q) c2 % q=mq (mod q)

又由费马小定理:

a p − 1 ≡ 1   ( m o d   p ) a^{p-1} \equiv 1 ~(mod~p) ap−1≡1 (mod p)

可知: p ) p) p)​

联立可得:

c 1 ≡ m   ( m o d   p ) c1\equiv m~(mod~p) c1≡m (mod p)

c 2 ≡ m   ( m o d   q ) c2\equiv m~(mod~q) c2≡m (mod q)

也即:

c 1 = m + k 1 ∗ p c1 = m+k_1*p c1=m+k1​∗p

c 2 = m + k 2 ∗ q c2 = m+k_2*q c2=m+k2​∗q

所以

c 1 ∗ c 2 = m 2 + m ∗ ( k 1 ∗ p + k 2 ∗ q ) + k 1 ∗ k 2 ∗ p ∗ q c1*c2 = m^2+m*(k_1*p+k_2*q)+k_1*k_2*p*q c1∗c2=m2+m∗(k1​∗p+k2​∗q)+k1​∗k2​∗p∗q

m ∗ ( c 1 + c 2 ) = 2 m 2 + m ∗ ( k 1 ∗ p + k 2 ∗ p ) m*(c1+c2) = 2m^2+m*(k_1*p+k_2*p) m∗(c1+c2)=2m2+m∗(k1​∗p+k2​∗p)

两式抵消:

m 2 − m ∗ ( c 1 + c 2 ) + c 1 ∗ c 2 = k 1 ∗ k 2 ∗ p ∗ q = k ∗ n ≡ 0   ( m o d   n ) m^2-m*(c1+c2)+c1*c2 = k_1*k_2*p*q=k*n\equiv0~(mod~n) m2−m∗(c1+c2)+c1∗c2=k1​∗k2​∗p∗q=k∗n≡0 (mod n)

所以这时可以使用sagemath进行同余式方程的求解

#sagemath代码
c1 = 17893542812755845772427795161304049467610774531005620109503081344099161906017295486868699578946474114607624347167976713200068059018517606363517478396368430072890681401898145302336139240273132723451063402106360810413024642916851746118524166947301681245568333254648265529408446609050354235727237078987509705857
c2 = 5580409405085606847879727622943874726633827220524165744517624606566789614499137069562997931972825651309707390763700301965277040876322904891716953565845966918293178547100704981251056401939781365264616997055296773593435626490578886752446381493929807909671245959154990639046333135728431707979143972145708806954
n = 140457323583824160338989317689698102738341061967768153879646505422358544720607476140977064053629005764551339082120337223672330979298373653766782620973454095507484118565884885623328751648660379894592063436924903894986994746394508539721459355200184089470977772075720319482839923856979166319700474349042326898971
 
PR.<m> = PolynomialRing(Zmod(n))
f = m^2-(c1+c2)*m+c1*c2
x0= f.small_roots(X=2^400) #经计算m的范围是在2^400以内
for i in x0:
    print(i)

得到i也即是m;转换为bytes类型即可

Crypto 1

题目:

from gmpy2 import *
from Crypto.Util.number import *



flag  = '****************************'
flag = {"asfajgfbiagbwe"}
p = getPrime(2048)
q = getPrime(2048)
m1 = bytes_to_long(bytes(flag.encode()))

e1e2 = 3087
n = p*q
print()

flag1 = pow(m1,e1,n)
flag2 = pow(m1,e2,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('n= '+str(n))


#flag1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594
#flag2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408
#n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437

观察题目

相同的m,不同的e,很像共模攻击;

但是e1,e2的具体值不确定只有乘积知道;

分解e1,e2的乘积得到32*73

由于这个有多种组合方式,导致e1,e2不一定是互质的

而共模攻击的原理:

c 1 x ∗ c 2 y ≡ m g c d ( e 1 , e 2 ) ( m o d n ) c1^x*c2^y\equiv m^{gcd(e1,e2)} (modn) c1x∗c2y≡mgcd(e1,e2)(modn)

其中 e 1 ∗ x + e 2 ∗ y = 1 e1*x + e2*y = 1 e1∗x+e2∗y=1

在原来的应用过程中,一般e1,e2互素;所以 g c d ( e 1 , e 2 ) = 1 gcd(e1,e2) = 1 gcd(e1,e2)=1

而这里e1,e2不一定互素;就直接带入最大公约数即可

使得等式左侧加上 k ∗ n k*n k∗n直接开方得到m;其中k是需要爆破的

代码实现:

import gmpy2
from Crypto.Util.number import *

flag1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594
flag2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408
n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437
e1e2 = 3087

fac = [3,3,7,7,7]
factor = [3,7,3*7,3*3,7*7,3*7*7,3*3*7,7*7*7,3*7*7*7,3*3*7*7]
for e1 in factor:
    if e1e2 % e1 == 0:
        e2 = e1e2 // e1
        _,s,t = gmpy2.gcdext(e1,e2)
        gcd = gmpy2.gcd(e1,e2)
        temp = pow(flag1,s,n) * pow(flag2,t,n) % n
        for k in range(2**20):
            temp2 = gmpy2.iroot(temp + k*n,gcd) 
            if temp2[1]:
                m = temp2[0]
                print(long_to_bytes(m))
                break

标签:Crypto,mod,wp,print,c2,c1,e2,e1,SWPU
来源: https://blog.csdn.net/qq_51999772/article/details/120926547

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有