11.25-Crypto-WP

2023-11-25 密码WP

第一题-[SWPUCTF 2021 新生赛]crypto8(Uuencode的特征)

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

开始以为是base85,试了老久发现不是。

看wp才发现Uuencode。

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

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

解码时它将4个字符分别转换为4个6位字符后,截取有用的后六位放入一个 24 位的缓冲区,即得3个二进制代码。

第二题-[SWPUCTF 2021 新生赛]crypto7(MD5的特征)

69f7906323b4f7d1e4e972acf4abfbfc

以为是16进制,看了wp,嘿MD5。

md5加密后是16位或者32位的字符,由字母和数字组成,字母大小写统一。

第三题-[SWPUCTF 2021 新生赛]ez_rsa(简单rsa,知道p,q,e求d)

p = 1325465431
q = 152317153
e = 65537
计算出d,将d用MD5加密后包裹NSSCTF{}提交

我们知道这涉及了rsa加密,欧拉函数与乘法逆元(哼啊啊不会

  1. 欧拉函数(Euler’s totient function)
  2. 模意义下乘法运算的逆元(Modular Multiplicative Inverse)
1
2
3
4
5
6
7
8
9
10
11
12
13
import gmpy2
from hashlib import md5

p = 1325465431
q = 152317153
e = 65537

phi = (p-1)*(q-1)

d= gmpy2.invert(e,phi)

flag = md5(str(d).encode())
print("flag is : NSSCTF{%s}"%flag.hexdigest())

第四题-[SWPUCTF 2021 新生赛]crypto2(共模攻击,有两个e)

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
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

解题如下

1
2
3
4
5
6
7
8
9
10
11
12
from xenny.ctf.crypto.modern.asymmetric.rsa import same_module
from Crypto.Util.number import *

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


m = same_module.attack(n, e1, e2, flag1, flag2)
print(long_to_bytes(m))

第五题-[羊城杯 2021]Bigrsa(共享素数,有两个n)

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

n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073

e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n1)
c = pow(c, e, n2)

print("c = %d" % c)

# output
# c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
#n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073

解题如下:

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

n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
e = 65537
c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264

q = GCD(n1,n2)
p1 = n1 // q
p2 = n2 // q

d1 = inverse(e, (q-1)*(p1-1))
d2 = inverse(e, (q-1)*(p2-1))

print(long_to_bytes(pow(pow(c, d2, n2), d1, n1)))

第六题-[AFCTF 2018]BASE(用代码解决多重base加密问题)

[AFCTF 2018]BASE | NSSCTF

题解如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import base64
with open("E:\cft_questions\\base\\flag_encode.txt","r") as f:
data = f.read()
f.close()
while True:
if "{" in str(data):
print(data)
break
try:
data = base64.b16decode(data)
except Exception:
try:
data = base64.b32decode(data)
except Exception:
try:
data = base64.b64decode(data)
except Exception:
data = base64.b85decode(data)

总结:Crypto之路任重道远,不仅需要代码能力还需要数学方面的相关知识,嗯,学吧!


11.25-Crypto-WP
http://example.com/2023/11/25/11-25-Crypto-WP/
作者
clotten
发布于
2023年11月25日
许可协议