0%

NSSCTF Crypto 01

记录下近期在NSSCTF Crypto的刷题记录 .... 密码学新手菜鸡简单记录。数学基础不是很好 还在慢慢补......

[SWPUCTF 2021 新生赛]crypto1 共模攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

题目分析:

1.e1*e2=3087 尝试分解e1 e2

2.flag1 flag2【c1 c2】 公用同一个模进行加密【共模攻击】

利用前提: RSA在生成密钥过程中使用相同的模数 n

已知 n c1 c2 e1 e2 求m 【在不知d1 d2情况下得到m】

WP:

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

# 已知c1 c2 n 分解e1e2得到e1\e2 使用共模攻击
c1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594
c2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408
n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437
e1e2 = 3087
# factordb 可以将e1e2分解成 3^2*7^3
# 相比与爆破 2~3087 效率会高很多
fac = [3,7,3*3,3*7,3*7*7,3*7*7*7,7*7,3*3*7,3*3*7*7,3*3*7*7*7]
# print(len(fac))

for e1 in fac:
if e1e2 % e1 == 0:
e2 = e1e2 // e1
# 欧几里得拓展 e1*s1+e2*s2=1
s0,s1,s2 = gmpy2.gcdext(e1,e2)
# print(s0,s1,s2)
# # 共模攻击
m_s0 = pow(c1, s1, n) * pow(c2, s2, n) % n
m = long_to_bytes(gmpy2.iroot(m_s0,s0)[0])
print(m)

# b'NSSCTF{d64dba66-b608-4255-b888-0b0f25c2f90e}'

[SWPUCTF 2021 新生赛]crypto2 共模攻击

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
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
e1 = getPrime(32)
e2 = getPrime(32)
print()

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

#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
#e1= 3247473589
#e2= 3698409173
#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

WP:

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

def rsa_gong_N_def(e1,e2,c1,c2,n): #共模攻击函数
e1, e2, c1, c2, n=int(e1),int(e2),int(c1),int(c2),int(n)
s = gmpy2.gcdext(e1, e2)
s1 = s[1]
s2 = s[2]
if s1 < 0:
s1 = - s1
c1 = gmpy2.invert(c1, n)
elif s2 < 0:
s2 = - s2
c2 = gmpy2.invert(c2, n)
m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n
return int(m)

c1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
c2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
e1= 3247473589
e2= 3698409173
n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

m = rsa_gong_N_def(e1,e2,c1,c2,n)
print(long_to_bytes(m))

[SWPUCTF 2021 新生赛]crypto3 [-]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

共模n 已知c1 c2 但是e1 e2未知

[SWPUCTF 2021 新生赛]crypto4 素数分解

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

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

flag = '**********'

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

e = 0x10001
n = p*q

flag1 = pow(m1,e,n)
print('flag= '+str(flag1))
print('n= '+str(n))

flag= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243
n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153


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

e = 0x10001

c= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243
n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153
# factordb 分解素数n
p = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956044421
q = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956045093
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)
m = pow(c,d,n)
print(long_to_bytes(m))
# b'NSSCTF{no_why}'

[SWPUCTF 2021 新生赛]crypto5 低指数e攻击

1
2
3
4
flag= 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333
n= 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419


下载附件后 只得到了 n c

没有其他条件 就只能先考虑低指数e去试了 e 1~3

e=3 可直接得到flag 套代码即可

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

c = 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333
n = 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419

e = 3
k = 0
while 1:
res = gmpy2.iroot(c+k*n,e)
if(res[1] == True):
print(libnum.n2s(int(res[0])))
break
k = k+1

# b'NSSCTF{because_i_like}'

[SWPUCTF 2021 新生赛]crypto6 base

1
2
3
4
5
6
var="************************************"
flag='NSSCTF{' + base64.b16encode(base64.b32encode(base64.b64encode(var.encode()))) + '}'
print(flag)

小明不小心泄露了源码,输出结果为:4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D,你能还原出var的正确结果吗?

已知密文 分别进行了 b16 b32 b64加密

对应 b64 b32 b16解密即可

1
2
3
4
5
6
7
8
9
import base64
from base64 import *

# flag='NSSCTF{' + base64.b16encode(base64.b32encode(base64.b64encode(var.encode()))) + '}'
c = '4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D'

print(b'NSSCTF{'+base64.b64decode(base64.b32decode(base64.b16decode(c))) +b'}')

# b'NSSCTF{5e110989-dc43-1bd3-00b4-9009206158fe}'

[SWPUCTF 2021 新生赛]crypto7 md5

题目:

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

md5直接解密即可

[SWPUCTF 2021 新生赛]crypto8 UUencode

题目:

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

http://www.hiencode.com/uu.html UUencode解码

1
NSSCTF{cheese_is_power}

UUencode【Unix-to-Unix encoding】编码特征:

编码时将 3个字符 顺序放入一个24位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为4个部分,高位在先,每个部分6位,用下面的64个字符重新表示

3个字符 24bit 6bit为一组分成4组,每组以十进制表示出现的字节数值,数值在0~63之间,然后加上32 得到ascii对应字符

64个字符【对应ascii码32(空格) - 95(_)】

1
!”#$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_

[SWPUCTF 2021 新生赛]crypto9

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984}
脚本给你了,去解吧

letter_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' # 字母表


# 根据输入的key生成key列表
def Get_KeyList(key):
key_list = []
for ch in key:
key_list.append(ord(ch.upper()) - 65)
return key_list


# 加密函数
def Encrypt(plaintext, key_list):
ciphertext = ""

i = 0
for ch in plaintext: # 遍历明文
if 0 == i % len(key_list):
i = 0
if ch.isalpha(): # 明文是否为字母,如果是,则判断大小写,分别进行加密
if ch.isupper():
ciphertext += letter_list[(ord(ch) - 65 + key_list[i]) % 26]
i += 1
else:
ciphertext += letter_list[(ord(ch) - 97 + key_list[i]) % 26].lower()
i += 1
else: # 如果密文不为字母,直接添加到密文字符串里
ciphertext += ch
return ciphertext


# 解密函数
def Decrypt(ciphertext, key):
plaintext = ""

i = 0
for ch in ciphertext: # 遍历密文
if 0 == i % len(key_list):
i = 0
if ch.isalpha(): # 密文为否为字母,如果是,则判断大小写,分别进行解密
if ch.isupper():
plaintext += letter_list[(ord(ch) - 65 - key_list[i]) % 26]
i += 1
else:
plaintext += letter_list[(ord(ch) - 97 - key_list[i]) % 26].lower()
i += 1
else: # 如果密文不为字母,直接添加到明文字符串里
plaintext += ch
return plaintext

if __name__ == '__main__':
print("加密请按D,解密请按E:")
user_input = input();
while (user_input != 'D' and user_input != 'E'): # 输入合法性判断
print("输入有误!请重新输入:")
user_input = input()

print("请输入密钥:")
key = input()
while (False == key.isalpha()): # 输入合法性判断
print("输入有误!密钥为字母,请重新输入:")
key = input()

key_list = Get_KeyList(key)

if user_input == 'D':
# 加密
print("请输入明文:")
plaintext = input()
ciphertext = Encrypt(plaintext, key_list)
print("密文为:\n%s" % ciphertext)
else:
# 解密
print("请输入密文:")
ciphertext = input()
plaintext = Decrypt(ciphertext, key_list)
print("明文为:\n%s" % plaintext)

WP key尝试遍历3位

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
50
51
52
53
54
55
56
57
58
59
60
letter_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'  # 字母表

# 根据输入的key生成key列表
def Get_KeyList(key):
key_list = []
for ch in key:
key_list.append(ord(ch.upper()) - 65)
return key_list

# 加密函数
def Encrypt(plaintext, key_list):
ciphertext = ""

i = 0
for ch in plaintext: # 遍历明文
if 0 == i % len(key_list):
i = 0
if ch.isalpha(): # 明文是否为字母,如果是,则判断大小写,分别进行加密
if ch.isupper():
ciphertext += letter_list[(ord(ch) - 65 + key_list[i]) % 26]
i += 1
else:
ciphertext += letter_list[(ord(ch) - 97 + key_list[i]) % 26].lower()
i += 1
else: # 如果密文不为字母,直接添加到密文字符串里
ciphertext += ch
return ciphertext
# 解密函数
def Decrypt(ciphertext, key):
plaintext = ""

i = 0
for ch in ciphertext: # 遍历密文
if 0 == i % len(key_list):
i = 0
if ch.isalpha(): # 密文为否为字母,如果是,则判断大小写,分别进行解密
if ch.isupper():
plaintext += letter_list[(ord(ch) - 65 - key_list[i]) % 26]
i += 1
else:
plaintext += letter_list[(ord(ch) - 97 - key_list[i]) % 26].lower()
i += 1
else: # 如果密文不为字母,直接添加到明文字符串里
plaintext += ch
return plaintext

if __name__ == '__main__':

key = []
for i in range(len(letter_list)):
for j in range(len(letter_list)):
for k in range(len(letter_list)):
key_list = [i,j,k]
ciphertext = 'AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984}'
plaintext = Decrypt(ciphertext, key_list)
if "NSSCTF" in plaintext:
print("明文为:\n%s" % plaintext)

# NSSCTF{dd5f0021-7a8e-ee05-f25e-7882abc5d984}

AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984} -》 NSSCTF{ 像凯撒变种

维吉尼亚加密 利用网站 https://www.dcode.fr/vigenere-cipher 爆破 NSSCTF{dd5f0021-7a8e-ee05-f25e-7882abc5d984}

[SWPUCTF 2021 新生赛]crypto10 [维吉尼亚]

AFFPGS{pbatenghyngvbaf!!!},建议直接秒了 维吉尼亚直接爆破 NSSCTF{congratulations!!!}

[SWPUCTF 2021 新生赛]pigpig [猪圈]

猪圈密码 http://www.hiencode.com/pigpen.html

w h e n t h e p i g w a n t t o e a t

[SWPUCTF 2022 新生赛]小明文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflag

e = 3
p = getPrime(1024)
q = getPrime(1024)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("c=" + str(c))
#c=128198926274489803523728445192921664
#flag=NSSCTF{c}

c = k*n + m^e → m

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

c = 128198926274489803523728445192921664
e = 3
n = 504229359204

k = 0
while 1:
res = gmpy2.iroot(c+k*n,e)
if(res[1] == True):
print(libnum.n2s(int(res[0])))
break
k = k+1
#c=128198926274489803523728445192921664
#flag=NSSCTF{c}

# b'ufind'

[SWPUCTF 2022 新生赛]爆破MD5

1
2
3
4
data='Boom_MD5****'
flag=MD5(data)
print(flag)
#0618ac93d4631df725bceea74d0*****

刚开始只跑了大小写+数字 没加符号没跑出来

随后加了符号 然后就是漫长的等待......

但是没跑出来 。 。 脚本好像有问题 额 。。

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

# data='Boom_MD5****'
# flag=MD5(data)
# print(flag)
#0618ac93d4631df725bceea74d0*****

import hashlib
import string


def md5_encrypt(input_string):
try:
# 创建 MD5 加密对象
md5 = hashlib.md5()
# 将输入字符串编码为字节
input_bytes = input_string.encode('utf-8')
# 更新 MD5 对象
md5.update(input_bytes)
# 获取 MD5 加密结果
encrypted_string = md5.hexdigest()

return encrypted_string
except Exception as e:
return f"加密失败: {e}"

additional_chars = ''.join([chr(i) for i in range(36, 128)])

all_letters_and_digits = string.ascii_letters + string.digits + additional_chars
# string.ascii_uppercase 大写字母
for i in all_letters_and_digits:
for j in all_letters_and_digits:
for k in all_letters_and_digits:
for m in all_letters_and_digits:
str = "Boom_MD5" + i + j + k + m
md5str = md5_encrypt(str).lower()
print(str,md5str)

if "0618ac93d4631df725bceea74d0" in md5str:
print(str)
print(md5str)
break


[SWPUCTF 2022 新生赛]yafu分解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflag

e = 65537
p = getPrime(140)
q = getPrime(140)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("n=" + str(n))
print("c=" + str(c))
#n=1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
#c=1165608868963663237838494928147497339359377331987999335624507621030816298293537918937

p q不是很大 yafu去分解素数

C:>yafu-Win32.exe "factor(1851012829537540993346897265450988006921329733937556249710137670254755668838970157221)"

分解得到

P43 = 1362310363870711901033415700690289289304517

P43 = 1358730637766188714476624560503309609820513

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


p = 1362310363870711901033415700690289289304517
q = 1358730637766188714476624560503309609820513
e = 65537
n = 1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
c = 1165608868963663237838494928147497339359377331987999335624507621030816298293537918937

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

# b'AFFPGS{snzv1l_ov9_gur_g0_Jr1p0zr}'

然后凯撒解密 NSSCTF{fami1y_bi9_the_t0_We1c0me}

[SWPUCTF 2022 新生赛]AES

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
import base64
from Crypto.Cipher import AES
from flag import getflag
iv = '1229002635654321'
key = 'nssctfneedcrypto'
data = getflag()

# 位数不足十六位用空格填充
def pad(data):
pad_data = data
for i in range(0, 16 - len(data)):
pad_data = pad_data + ' '
return pad_data

def AES_en(key, data):
if len(data) < 16:
data = pad(data)
AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
AES_en_str = base64.b64encode(AES_en_str)
AES_en_str = AES_en_str.decode("utf-8")
return AES_en_str

data = AES_en(key, data)
print(data)
#data=862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8=

WP

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
import base64
from Crypto.Cipher import AES

# 位数不足十六位用空格填充
def pad(data):
pad_data = data
for i in range(0, 16 - len(data)):
pad_data = pad_data + ' '
return pad_data

def AES_en(key, data):
if len(data) < 16:
data = pad(data)
AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
# AES后 进行utf8加密 base64编码 utf8解密
AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
AES_en_str = base64.b64encode(AES_en_str)
AES_en_str = AES_en_str.decode("utf-8")
return AES_en_str

iv = '1229002635654321'
key = 'nssctfneedcrypto'
data= "862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8="

def AES_de(key, data):
cipher = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
data = data.encode("utf-8")
data = base64.b64decode(data)
data = cipher.decrypt(data)
data = data.decode("utf-8")
print(data)
return data

AES_de(key,data)

# NSSCTF{NSS_CRYPTO_NEED_YOU_0000}

[SWPUCTF 2023 新生赛]EasyRSA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import libnum  

p=libnum.generate_prime(1024)
q=libnum.generate_prime(1024)
e=65537
m="NSSCTF{*******************}"
m=libnum.s2n(m)
n=p*q
phi_n=(p-1)*(q-1)
d=libnum.invmod(e,phi_n)
c=pow(m,e,n)

print("p=",p)
print("q=",q)
print ("e=",e)
print ("c=",c)

#p= 122912801126049869009003839542545176400185213365268209105714006257803073428638629824801261702125287814910668428403367391355051987389837804474055637991864563803834741161217607848968821280710324766558457056004037592628178078680121173634128054936108782807954132605887275556228703383455969903056759874047110115433
#q= 120790113700754477830062212762518406876786376726996249661848284428829412089402183812692045970711341815805796005449714738748110749559462448861357011272792817313060401380148108517705435100103533857957024851181447994572972501120774586405811257420853542417275740953525627232008812587423053626515513859653865873671
#e= 65537
#c= 7094224488947659163318199615533819770556597977720767621640224798887506152292861133457571683713587909779712343346370719403811813233693263526316785431883833118583425528830238629831001255198236686372518770451273159769779374149881346761523688131115323441973953523582174059584087249568245044443295176738493785560215046375056269378223045128094953923926250055718405799885041115025529297362914403732661935017257507786348635366480744933193471899621592092711962814949533564454932121056035003021428158830645604347966849572981124877683317022116903132719663958775850982016292384237647664448371811915879714093710876989697939277005


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


p= 122912801126049869009003839542545176400185213365268209105714006257803073428638629824801261702125287814910668428403367391355051987389837804474055637991864563803834741161217607848968821280710324766558457056004037592628178078680121173634128054936108782807954132605887275556228703383455969903056759874047110115433
q= 120790113700754477830062212762518406876786376726996249661848284428829412089402183812692045970711341815805796005449714738748110749559462448861357011272792817313060401380148108517705435100103533857957024851181447994572972501120774586405811257420853542417275740953525627232008812587423053626515513859653865873671
e= 65537
c= 7094224488947659163318199615533819770556597977720767621640224798887506152292861133457571683713587909779712343346370719403811813233693263526316785431883833118583425528830238629831001255198236686372518770451273159769779374149881346761523688131115323441973953523582174059584087249568245044443295176738493785560215046375056269378223045128094953923926250055718405799885041115025529297362914403732661935017257507786348635366480744933193471899621592092711962814949533564454932121056035003021428158830645604347966849572981124877683317022116903132719663958775850982016292384237647664448371811915879714093710876989697939277005

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

# b'NSSCTF{RSA_1s_so_ea3y_and_interest1ng!}'

[NSSRound#4 SWPU]ezcrypto LCG

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


class Symbol:
def __init__(self):
self.alpha = getRandomNBitInteger(32)
self.beta = getRandomNBitInteger(32)
self.n = getPrime(32)
self.seed = getRandomNBitInteger(32)

def next(self):
self.seed = (self.alpha * self.seed + self.beta) % self.n
return self.seed >> 16

def output(self):
print("alpha = {}\nbeta = {}\nn = {}".format(self.alpha, self.beta, self.n))
print("res1 = {}".format(self.next()))
print("res2 = {}".format(self.next()))

symbol = Symbol()
symbol.output()
c = b''.join([long_to_bytes(ord(flag[i]) ^ (symbol.next() % 10))
for i in range(len(flag))])
print(bytes_to_long(c))

alpha = 2659869614
beta = 3138014669
n = 2171187379
res1 = 32421
res2 = 32382
628427670713408045832213770914678202267468957347245535228951062583137095137644250375583786099578

alpha beta seed 32位随机整数

n 32位素数

seed =(a * seed + b ) mod n

已知前两个连续的res值 res = seed >> 16

c[i] = flag[i] ^ ( ((a*seed+b)mod n )>>16 )%10

flag 前几位是 NSSCTF 为默认已知条件

X0 = c[0]^N

seed =(a * seed + b ) mod n

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 long_to_bytes
from tqdm import tqdm

alpha = 2659869614
beta = 3138014669
n = 2171187379
res1 = 32421
res2 = 32382
c = 628427670713408045832213770914678202267468957347245535228951062583137095137644250375583786099578
c = long_to_bytes(c)

# print(c[0]^ord('N'))

# 需要转成二进制在左移 十进制不行
# for i in range(32421,32421<<16):
for i in tqdm(range(0b111111010100101 << 16, (0b111111010100101 << 16) + 2 ** 16)):

x = (alpha*i + beta)%n
if x >> 16 == res2:
y = (alpha*x + beta)%n
if (y >> 16 )%10 == c[0]^ord('N'):
print(i,x)
# 2124788500 2122226329
else:
continue

res1=2124788500
res2=2122226329
def lcg(a,b,c):
x = (a*b+c)%n
return x

for i in c :
res2 = lcg(res2,alpha,beta)
print( chr(((res2>>16)%10)^i),end='')

[SWPUCTF 2023 秋季新生赛]小明文?

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
from Crypto.Util.number import *
import random
m1=flag = b'NSSCTF{*******}'

def encrypt1(m1):
p = getPrime(700)
q = getPrime(700)
n = p * q
e = 5

a = getPrime(128)
b = getPrime(128)
m1 = bytes_to_long(m1)
mm1 = a * m1 + b

c1 = pow(m1, e, n)
c2 = pow(mm1, e, n)

print(f'n = {n}')
print(f'a = {a}')
print(f'b = {b}')
print(f'c1 = {c1}')
print(f'c2 = {c2}')

# n = 13026126941826887019162872735099540876106694302074884925200107036130428843197729140372377590706535217469477301361486550282890330093772372813532795303163348233096919179478061917423707929667355386062657434467799360617526194768968700908096844475960205671302377364202483195391706116078632202015938962280529309403244885363904094804118278167720593581764017089021116316636464533785051436622916960956665030100255641288863474938703
# a = 280807370135687531454416708417179457159
# b = 210598260561987226227971066630761929397
# c1 = 5484670538103757119990644460454986219076673914082966464351809153114702100411054106785392646801736865489738145857425179185164710603704198643749378051371008266521829572436350080663825339915763509501690398283916091505443322384568973565599179112299853287766734493187659418383619877040013434926843623979979122417950089001830664273269598688130410251828579862218274297572192961909808728768317567218412746711665911495028223620671
# c2 = 249587944874112168607313602465869274336587750392364868939732783502223999305089384749508572630699199927194600499968110646290832205640569694933539973256281796631433129626712361622584048439446364992886884217198680921278383770604919381329363647924261642857483728973331091285820401689502291336332199019252649615680893389557508558362194551939434128389351824194393680744241807605416750291337127085044177563509645273228457253193

Related Message Attack:

利用条件:

如果两个信息之间M1 M2只存在已知的固定差异【线性关系】,并且使用相同的模数N下进行RSA加密

具体原理不看了【详细可看这里https://ctf-wiki.org/crypto/asymmetric/rsa/rsa_coppersmith_attack/#related-message-attack】

最终可推出如下式子

题目已知条件 c1 c2 a b,M2=aM1+b 线性关系,所以可以求出M2

直接套轮子[sage看不懂 直接拿过来了]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import libnum
n = 13026126941826887019162872735099540876106694302074884925200107036130428843197729140372377590706535217469477301361486550282890330093772372813532795303163348233096919179478061917423707929667355386062657434467799360617526194768968700908096844475960205671302377364202483195391706116078632202015938962280529309403244885363904094804118278167720593581764017089021116316636464533785051436622916960956665030100255641288863474938703
a = 280807370135687531454416708417179457159
b = 210598260561987226227971066630761929397
c1 = 5484670538103757119990644460454986219076673914082966464351809153114702100411054106785392646801736865489738145857425179185164710603704198643749378051371008266521829572436350080663825339915763509501690398283916091505443322384568973565599179112299853287766734493187659418383619877040013434926843623979979122417950089001830664273269598688130410251828579862218274297572192961909808728768317567218412746711665911495028223620671
c2 = 249587944874112168607313602465869274336587750392364868939732783502223999305089384749508572630699199927194600499968110646290832205640569694933539973256281796631433129626712361622584048439446364992886884217198680921278383770604919381329363647924261642857483728973331091285820401689502291336332199019252649615680893389557508558362194551939434128389351824194393680744241807605416750291337127085044177563509645273228457253193
e=5
def franklinReiter(n,e,c1,c2,a,b):
PR.<x> = PolynomialRing(Zmod(n))
g1 = (x)^e - c1
g2 = (a*x+b)^e - c2

def gcd(g1, g2):
while g2:
g1, g2 = g2, g1 % g2
return g1.monic() #
return -gcd(g1, g2)[0]

m=franklinReiter(n,e,c1,c2,a,b)
print(libnum.n2s(int(m)))
# b'NSSCTF{89c507f3-4a21-11ee-a71e-c03c59457d4d}'

[SWPUCTF 2022 新生赛]Phishing【没做出来 后面在研究下】

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

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

p = getPrime(1024)
q = getPrime(1024)
n = p * q
eAlice = 0x10001
eBob = 0x10003
phi = (p - 1) * (q - 1)

def chatEncrypt(pepole, message):
if pepole == 'Alice':
sender = hashlib.sha256(str(pepole).encode()).hexdigest()
sign = hashlib.sha256(str(message).encode()).hexdigest()
encryptMessage = hex(pow(bytes_to_long(message), eAlice, n))
return sender, encryptMessage, sign
elif pepole == 'Bob':
sender = hashlib.sha256(str(pepole).encode()).hexdigest()
sign = hashlib.sha256(str(message).encode()).hexdigest()
encryptMessage = hex(pow(bytes_to_long(message), eBob, n))
return sender, encryptMessage, sign

chatLog = open("Chatting.log", "rb")
encryptedChatLog = open("ChatEncrypted.log", "w+")
log = []
for line in chatLog:
log.append(line)
chatLog.close()

encryptedChatLog.write(hex(n)+'\n')

for i in range(int(len(log)/2)):
if log[i*2] == b'Alice\r\n':
encryptedChatLog.write(str(chatEncrypt('Alice', log[i*2+1]))+'\n')
print(chatEncrypt('Alice', log[i*2+1]))
elif log[i*2] == b'Bob\r\n':
encryptedChatLog.write(str(chatEncrypt('Bob', log[i*2+1]))+'\n')
print(chatEncrypt('Bob', log[i*2+1]))
encryptedChatLog.close()

已知 eAlice = 0x10001、eBob = 0x10003

c = pow(m,e,n)

输出文件中包含 hex(n) 及 十六组 str(chatEncrypt('Alice', log[i*2+1])) ,其中sender和sign sha256加密 密文未加密

所以已知内容为 n 和16组c

使用同一个模数n进行加密 优先考虑共模攻击

n = 0x63651c7146a0e7b724297d4212b5128ede8631b886179f7c7770877317d0d7d91d74aa9a8763ef0b8640f0d3ec80ae2581af3bec1928a308d6e220e2b7bc7dbee675445c7503b8469ccb3b6d36b69a19e67aad605e83886f274308904e5cd660fb627899075dca6ba585001d4e0c4b496c79ea1952d961421eeda77b80ed3716d6eaba40de17848499adbf098b85e6807ee4fdea7059d5faf3b2b58d1e17322ce6f3747f1cd138db0593d630e97573bd42c8b02bac2d780b8b0b6ac915cb18f082af21c3c5a4849b6e8e19862b1160888bb069adb8bcbcf93693ea8993bc26c1321d36b137a215bf56dfe9af8ba511f5d89b016a68ca03d9bd14091c04027b01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0x44e199407b72439f4fad42a3a13ff31fe22daacd0b1ec17f34f260ffa8a7be74b75ac624ab147b8342b0cd97024b1d7d40d5071bc65d62377b3eb2b718e086096084219360d7bf967ba961afa05054d968d8b3493870831e92622ead173ba41e3d345e068cc7640bb43f3ff9654ab48183f6dbe752ee26b9c908d4b31fcb8e445963ef261e99bc238441a2c0e82fdf07359702d0ab664ab216995c7e27d91e885a5ee37ae1f6895a7d38155edcd8990c36fa2ac6d7e14abec471cc96a8ba34497f3073e0906f683145e03fc38c8fa40ba4250d2d907f3071c3db30d941b321c349d9d800bed6be61b00a3797aef85f7fb2cc36413556f6438fae3b9476adab6e
0x10cde6bdf0ac17952be139709d97fa574bfbeffd22e9a0c0fde85811797decfd4b8c669df862a476c66ae47e2831d23f1dde85290a58489a8cabf9f8bf4e94c80009634ee2deb13391c1ede5005a4fd3a58b08b185eb4d10081f34676c3bf546ae641141e63bab05ca9e40bdd5c9422857f5da5a3f3f14f87a2235196dad758065d0108b8a450939fe5084cea40d8ab8e1f5b87df21def507285464cb26e2cc5ad3ade03d83ac74557ec51c4eb2422dc45b7022cca62a4d1896bf13fef9bb38f5dc44d2ce6ab28222655ed27104b1e18f2baaa9bbc4200e8cf531cda25c9ae4f07e79885efc7b7fb3dcad0f07de66a1a1708f6bc96906a184caea4d23d1af4cf
0x31d25cdd014ad6ccef4e417ee1a1a59ebff514979887b9e05bda8a577dd8f3b62fa4ef09780b96d5878957a2ab11116b3a1d77e26cc4a0510f83fb86247170798aa0470215ea0cf1646291ee111e70fb83094a73d6f4540957ac428094c806ed2a6fb68db8c47170ae747375277deda72aaf887c09c06e372c62af6ee559f96e13b9f2d4f7a72df4b4d9bfb8975510ae165da5d0ed9727c9168669d2bc762cd49bcf316d3bc4d29e9429016f4ba5f1b12390c433248cb443c97df5fe6992016543054150af623edaf29ef81b231491bafbbbe0f607dd754f5d6d702a44a9b99533174a6c4bb6e727683c05a908bffdfdb629972f51f4ef698bbffebed566a0c5
0x7b1ef6b4cb43ca5747d17ebf5a42d49b0f24b65a13101dfeb995a9cf753f45afd65c93d908629c008ea8d6577cb6c32960486b838d335974ab15a58d38a39a8d8f6b16a0369da059d2a5298bc4efb6491ef4537e958e693c17acdded7fd527548a0800f6f1a79ba484f2c4b15662b2bee4e5286b1972b3fd78b2d9ba5b5b1c58cb6e226fb55f4e6c266ef69aff05971a9594fc9f96ffbb98022fb744c3e081e59afccaf9258f6f5921765c5324b2ff3dc3d64c6164d2f26cbaadec66669e8e77b9f9196cfa46e68cb3f5f53435e016297f9d0ce9131d9dbaee616b34eb5ebd871d50226dae36e648a3e351cb9e46969ad7d578d367ca546d062f3ab0313eb9b
0x401156c77529718d7a5fff5889703d9d000f1e8324d76eb05728fe83b3a9f9a689abd4b01af9c036c35025c21603d4256b5edd12803192030ca198be70ead4f6113b147e8e3f0d3743cf3e7aebf22151b468ccacd681989158afdfc61dbd46d8d67e85d09491217a065ec04d4b12f2e31098802e1094f06aaa8a8c43785496243e881f81fb90254dd3342699e6c433f8f603c00605d6b34c6ec3117cf78fcb1a72a9bab83e05d1b489148a90f7816fa5f84fde195ba1bcddb26df6b78ceb09d919807b7bb7b7cce257b23fb34508d1ffaaec17cf5e1f66ea31e692d077859ca16ee24cd2d6923744c98cafbf39c41c0bbf68a6c086b62614792e23038643c955
0x469ff6f3649b902be1e3b59aa68eee1b10a1056e109872b42c00a3d574ab13337e4b09d094e1a43b16d4c5ebd266266e2564cf3b630a3d3207b5aacfa7f50ab621034a7dfcd231ed3247e74093c4836bfefc6af53857ee09d242bcd346bcb9e6e1cfae3c38fcee9f3cc22fe51d7a9ac96f914a0f0985639c8aeafd254f0c6304398138c256c1c80e4969d7d3d4ce2e8885608bc2d8d83bf7a218aaae015341bbf7d873d54a4ec0afce0b6a7898df840b4b682276c394ca3a38e688b8aeea675ede5d28908a89d59c98321b3c14900d4a89249784a12066d385312ae307a8438c8e49b42b1d234546e46c1536ae0b5178abc609d9061b5a8711ae6c2a7140a23e
0x1c39de925a76c7207714684fc339567cd439a106ee1b2c09232652f899f798c459629de9d4ba464666d1a050642964d446762b9be80bb417aa411ae81d30751acdda9d914581fb8715853aaa8869bcf6050c0a9f6a0060a888f3353298e5617f0c1807a711418ef91d7662864187c360c48a6988a7004e6a786a3071bebfb1198456f7fa5a2a651fa31cd8b0c1e9fbb515a37977dccfce79784617e83c760d6bba6e65cc566e96a01143c9ee7dfca95bae3a4af0f30eb579a0ad8a8be453bbcf147dc9c2a048d877621e507d208e6105929d5beb28bc86e58570b8e2d32927d7d7f65dc4ee929abb85a7cc73194ebb4f4ff84213f28dabfd81eaac5c8ad9ab5
0x256996daa2c9dae14a986ff70f0f453b1b12bcbbce4232380e4145e141684fbbe91ab67c524159487ca26726690f8da588cc7af61801ab3065290bfa4d440b85803fc3b9d010d346c7b4f7f2b8f0b3253102f10e6812592bac933712b71baf0cf470d0b782894693dd256c2ead766c3c271fb45d65008316511710d22ea318cef51731c598314101846a7f9674fba6adbddffa16bb15ea03021c54038e46c7a4846f45211ba17e733577153a78a7ec1d463d07e7e7c1ac8cfe06625ff3aac27d2f651ef04618ec6107652b0627528748640b0c9e7a446e5cdece79080b0009eab5ba41e0db367049ce69687ba2cae8481761b87fd0e6a7ba5e84ac55a5231d0f

0x5a045180ce4cbcdb8d4f48ae4fafb4dab8b3a1a829afd15f3aa5afa90c03aca9eb6b1dec208594580fba45b8af15cf7ac60031cb9c28e402a0a563fcf9feeed7c05de10104560fb1e66463be3573fc98d7b4178fb1d9c99af7cbc4da65fbb40b5fe26bd78bb83e94236136e0ab86f9228963b90d926abb8002f9e6a8ad695a826c12454e6bf6d44624188d8454e4afa133ed9cffcf504239bc2df4eddb0910f47047858da710dd1ef7b96b2430b69fc78b3a8e4d19657b4fb2fbcbac656e851d86fee14f487a4e4fcca93fef24eb9e3f72ee3aebe0aa27e14a2889c13410a22a4ff99802729a1e802b1e343abe51f99f9b131e6e932ef6336cb2539befc7ad2b
0x2ca6110b03ecad45d9f8969c6a47e4e434708288bb35738f4e1974647ae4ac5782377117bf96a25936c5f049ce5fb89aeb9022c99f1eb2085f0a2e9e06f5bdd7c512dea7fa839ae55eb78d95f8ed9a34e35fe901cd499efe116142976e6170c85987cb1355ddf1d7cf6e66120a355ae02cce4ccef86ae27860f55c61249cf5b6daf728c570bfeb8f03f6dfab1cf168ab16e7e1efe1582f9717d449984184c604ec5af6070837b1350dfaf188b6bb76ad81f5c70804fa7a79d2c1c5f8de9b5cb9ed859bf75f912c445fed04252edfa590e2354b72d08331ab631b9d59835435e6c0e80e418ba6c2e1655ca7ef19555b792f768c2d07bc7deabfc8c06a9061d987
0x148dce72b5b82bcc8bda6d5d2aa0ef4c665b647edb4e588058519c9b4fd3c25fc24f73569bdf14491d5a6ecc01aa6ee797711e612b7e271f2f551407b7f73c2b5fe9bba6168777bd82a4ef3c5ac46bdb339a43ccdea2ca913141eb909ae7e03cba79331556f3111679878748819175f921a114c57c001d22fe4ef26bed7c56725fd982d4fa356b2e25e962a88471feef63e82c9640b0293b98e1971ab78111e76fd485dc6c53ec656266759c2c9b4a2465ad1618fa7d89454161b1d799c90af1d055d9749a49c8aa9a1d956683841c234641e0ca30d97865355da3c5879db378ef9c44e78320c4f97ae50c385cb1e4877c2ec2c1fa64915625654ba0c8c01efa
0x4449cb7346cd8bc4c4fc0e0c492cc40a1b4f1a3f93815eb19353fb82a3c34cfdfe91bc01a80f779998185a6a36cf68094641367fd912f146d9ec793bf88d2fea7f793375ea4d79e95c8c18e8dc83e0d7590fe007862024e82786e11754ecb4b93c19c01550631196fcaa34b73646125b1baa8fd8726d99f9752abad9a5e2136e0a909700a0423fbd97865b87790c6e16b85a51aa7dd987e84cc7a8f4617a0de31f4d1c538587a8fd8b91b50f8551c306c3240339c8d89f9a6842f65f59db0ac935640f998e705ec6dad8b5403e786bcbc901b9cdaa671fe5d05707d637772199779bce17e7942eb185aa86ce668863261f85539696b5a5835826f67cd25acd49
0x2197e3bc7c4bc600dac76f2b4dce190bba84f5a2df71e086efa5d9e1891d93ef7a722a8912c65c71a39fd495da83078ba4ecfae537e7cce6ca4cc2621e6f019fc10a322fffc66d4a2f9d0674c300df5c5cb290d8ad0228b5a22d86a4e99c171ce2d29f0ad52fa07b17fb6accfba6e78af4c3c1f5f578c7b496df797cc38b9c8a61b6b1fdc5648291753283d6dc3dc11e10ad5513bbb4b579a0b1c07c92fdb59df8a4f036e050e4d4668586f16685810f2e8cf62763d1d17fc493ad04ded7fd64e09b8299eeb5aa51b2e4287bec9b042285e49e04adfee80235eea001b3443976e460dd87710343c503129924e8cbb5b71849f3cb07fe9d7956c688e7521cbbae
0x224fda6f7940f6a120d586691428da3a93baec1d4be63ddad058b00a78d311a111aaf3174d6ab8bffb5403c8b721cd64d5440da5607d7d8729ee732fd86e2407c2fdc8ad3bba763e856c2a517cafeae8465952ff0854d712fdbb410f924e5bac561411beaaddf5c02536f273704a14b5de13c51cba3dc029bd2c7250f972b1679e1f21acdc27cda6c33b72a4258f68d00395e82c2f0d92c153ad5240b26ef581e0b5ba78c0c9409a5fb02f4d49707e9b941e0ad37e22ef9c42a568a10b000e91059650b620fd69552c4d267ed1b479378e60870cfd2026d248d32b9600f3b8ba2c7d05c6872847e43760d51d3b69e85449d21a3eb5eeef82d450a803b4500b79
0x32b9ecdea94109ebb2fac3a1bbc8605a2e7f3622a2559e1e0811921881b736de43771ba97d0c071ea05caa613c84f4f3b8f553f2ca2eccc1c3c8708ded528a7fc34881530a95d95dae4bdd27967f0b8b706530725d62447d732615825aadd901fa86675431e245aa1c3937d5f4d76f06a52caa8ca2100a9568c1817f14c6e6bb01f7d4543bd0d985ad2e1ee4310db1eafa37ae90b38582ef6212552e8bf6c6cbd483ae580a65b4171dd6bb767b3ae50d6a0f8bc9d45ca7d2ec12bea582b7aa39c3df3e20c2de9851456f111719b4ea6fe2d9c3ada0787ec83e4a7e5a2348b58526d4d267db693e508599f9cd31729a36d510aec40c756974a6f1e825fbcfc1d1
0x1ceec14e3fea63e688f500df76526d391cb411aba993a7407671e234698441e4c3c80efdf0092f0f7af0e14cedde5efe144ee8db2b5a0e7f8f300ca49f81dd189a83527f0c846ac1cbed4ba909f8df04efdeacaa616c005a609f43cdafac49ce49b482a5e244e1cd96fb4643066887d8d858314e816dd08df711b46fded216c4b8bee5a24379522e73a84e53ae0d778e47e7c5e96869a1666d90abea5638719932baf857745e50d3f32933d62d9bbffdc8d6b1ca6232e2bca8533afdd5b4175ed61db1e604d9645594b3dcf89e0550175bbb6d3de99598c665911c26e824f36b277681cfa802989c8b010d2143fe94ebef8dee4da4e5a4f097fb3a22b1242c52

[SWPUCTF 2023 秋季新生赛]dpdp 【dp泄露】

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 *
from libnum import *

flag = b'NSSCTF{******}' + b'1010101010101010101010101010101010101010100010101010101010101010101101'
p = getPrime(512)
q = getPrime(512)
n = p*q
e = 65537
d = inverse(e, (p-1)*(q-1))
dp = d % (p-1)
m = s2n(flag)
c = pow(m, e, n)
print(f'n = {n}')
print(f'c = {c}')
print(f'dp = {dp}')


n = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441
c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274
dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973

dp泄露 可用下面这个板子

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

n = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441
c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274
dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973
e = 65537

for i in range(1, e): # 在范围(1,e)之间进行遍历
if (dp * e - 1) % i == 0:
if n % (((dp * e - 1) // i) + 1) == 0: # 存在p,使得n能被p整除
p = ((dp * e - 1) // i) + 1
q = n // (((dp * e - 1) // i) + 1)
phi = (q - 1) * (p - 1) # 欧拉定理
d = gmpy2.invert(e, phi) # 求模逆
m = pow(c, d, n) # 快速求幂取模运算

print(m)
print(hex(m)[2:])
print(bytes.fromhex(hex(m)[2:]))
# b'NSSCTF{CTFCTFNSSNSS}1010101010101010101010101010101010101010100010101010101010101010101101'


[SWPUCTF 2023 秋季新生赛]dpdpdpdp [还没做]

和上面题相比 e变得很大 所以无法用之前遍历的方式

可以使用维纳攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Util.number import *
flag = b'NSSCTF{******}'
p = getPrime(512)
q = getPrime(512)
n = p*q
e = getPrime(128)
d = inverse(e, (p-1)*(q-1))
dp = d % (p-1)
m = bytes_to_long(flag)
c = pow(m, e, n)

print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
print(f'dp = {dp}')


n = 92288362151232755164303382554034496430634785857894506752180261103500715219090974532177552845107426542175470207920267802066773828210866572070045093611090322738109527534622730588618668861998969946471756352024368486322527057077613762697792913167023012077178671066981439295386486943067698150993422039585259179729
e = 229991316986730339421575788374847647237
c = 66178170892880340054212366602556925884485962775832591797127163461420023986798822926684824340567060840259672460835004142425374706821346941926520921852009455818529825976414766339170445233789109526300838535719649346266975388774091834431039678689254534566870194580604694419819400454951059125553501095973278807456
dp = 8987556601717285362487353965045062789633142861774364363374961991445049127918653163458814169532860957264061203394944931114888144611267605606197232438332289

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------