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加密,欧拉函数与乘法逆元(哼啊啊不会
- 欧拉函数(Euler’s totient function)
- 模意义下乘法运算的逆元(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))
|
解题如下
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)
|
解题如下:
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之路任重道远,不仅需要代码能力还需要数学方面的相关知识,嗯,学吧!