今天,我在 BUUCTF 网站的 crypto section 开启了一场充满挑战的密码学之旅。
这次我一口气完成了 12 个板块的任务,虽然耗时较长,但每一次解密成功的瞬间都让我无比满足,那种沉浸在密码世界里的感觉真的很棒。
接下来,我想和大家分享一下我的解题经历,希望能给密码学爱好者尤其是新手们一些启发和帮助。
一、任务概况
本次任务涵盖了多种密码类型,如 Base64 编码、MD5、Url 编码、摩丝密码、变异凯撒密码等,共 12 个板块,每个板块都像是一座等待攻克的城堡,充满了未知和神秘。
二、解题思路与收获
1. 一眼就解密
题目
给定字符串ZmxhZ3tUSEVfRkxBR19PRI9USEITX1NUUKIOR30=
,解密后获得flag,需包上flag{}
提交。
解题思路
观察字符串特征,疑似Base64编码。
解题步骤
使用Base64解码工具对字符串进行解码,得到flag{THE_FLAG_OF_THIS_STRING}
,提交成功。
2. MD5
题目
已知MD5值27120bd8 - e...
,求原始字符串作为flag提交。
解题思路
利用在线MD5破解工具,尝试各种可能的组合。
解题步骤
通过CMD5等在线工具,找到原始字符串为admin1
,提交flag{admin1}
成功。
3. Url编码
题目
给出Url编码字符串%66%6c%61%67%7b%61%6e%64%2031%3d31%7d
,求flag。
解题思路
根据Url编码特征,使用编码转换工具进行解码。
解题步骤
使用CaptfEncoder V2工具进行Url解码,得到flag{and 1=1}
,提交正确。
4. 看我回旋踢
题目
一个压缩包1784aa2b - cfcb - 428e - 94..360压缩
,需找到解压密码获取flag。
解题思路
分析压缩包名称和提示信息,尝试常见密码组合。
解题步骤
经过多次尝试,找到解压密码,解压后得到flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}
,提交成功
5. 摩丝
题目
解题思路
查阅摩丝密码编码规则,对照解码。
解题步骤
根据摩丝密码规则,逐个字符解码,得到flag{ILOVEYOU}
,提交正确。
6. password
题目
已知姓名为张三,生日19900315,key格式为key(xxxxxxxxxx)
,求flag。
解题思路
按照题目要求,根据给定信息生成key。
解题步骤
根据格式要求,生成flag{zs19900315}
并提交成功。
7. 变异凯撒
题目
加密密文af2_r9VYfScOeO_UL RWUC
,加密类型为变异凯撒,求flag。
解题思路
- 找出密文字符的ASCII码值,如
a - > 97
,f - > 102
等。 - 分析对应关系,得出加密规则:从第一个字母开始,每对一位字母进行加密,偏移量依次增加1(偏移量从5开始)。
- 编写Python代码实现解密。
解题步骤
编写代码如下:
txt = 'afZ_r9VYfScOe0_UL RWUc'
j = 5
for i in txt:print(chr(ord(i) + j), end='')j += 1
运行代码得到flag{Caesar_variation}
,提交成功。
8. Quoted-printable
题目
给出编码字符串=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
,求flag。
解题思路
使用在线的Quoted-printable编码转换工具进行解码。
解题步骤
利用在线工具解码,得到flag{那你也很棒哦}
,提交正确。
9. 篱笆墙的影子
题目
星星还是那颗星星哟月亮还是那个月亮山也还是那座山哟梁 也还是那道梁碾子是碾子缸是缸哟爹是爹来娘是娘麻油灯呵 还吱吱响点的还是那么丁点亮哦哦
,求flag。
解题思路
-
仔细阅读文本,寻找隐藏规律。
-
尝试对文本进行处理,如移除标点符号等操作。
解题步骤
通过移除标点符号等操作,得到flag{wethinkwehavethefag}
,提交成功(但此处可能存在不准确,根据文本信息可能还有其他解读方式)。
10. Rabbit
题目
给出加密字符串U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
,求flag。
解题思路
使用相关Rabbit解密工具。
解题步骤
通过网站https://tool.iitang.com/tools/base_rabbitencrypt
进行解密,得到flag{Cute_Rabbit}
,提交成功。
11. RSA
题目
在一次RSA密钥对生成中,假设p = 473398607161
,q = 4511491
,e = 17
,求解出d
作为flag提交(格式为flag{}
)。
解题思路
- 根据RSA算法原理,计算
φ(n)
,其中φ(n)=(p - 1)(q - 1)
。 - 使用扩展欧几里得算法计算
d
,使得de ≡ 1 (mod φ(n))
。
解题步骤
编写Python代码如下:
from math import gcd# 定义扩展欧几里得算法
def extended_gcd(a, b):if b == 0:return a, 1, 0g, x1, y1 = extended_gcd(b, a % b)x = y1y = x1 - (a // b) * y1return g, x, y# 输入数据
p = 473398607161
q = 4511491
e = 17# 计算φ(n)
phin = (p - 1) * (q - 1)# 计算d
g, d, _ = extended_gcd(e, phin)
d = d % phin # 保证d为正数print(f"私钥d: {d}")
运行代码得到d = 125631357777427553
,提交flag{125631357777427553}
成功。
12. 丢失的MD5
题目
通过代码暴力破解找到满足特定条件的字符串的MD5值,条件为MD5值中包含e9032
、da
、911513
。
解题思路
- 编写代码,使用三重循环遍历所有可能的字符组合。
- 计算每个组合的MD5哈希值,并检查是否满足条件。
解题步骤
改进后的代码如下:
import hashlib# 定义子串条件
target_substrings = ['e9032', 'da', '911513']# 遍历所有可能的字符组合
for i in range(32, 127):for j in range(32, 127):for k in range(32, 127):# 构造字符串candidate = f"TASC{chr(i)}03RMV{chr(j)}WDJKX{chr(k)}ZM"# 计算MD5哈希m = hashlib.md5()m.update(candidate.encode('utf-8'))md5_hash = m.hexdigest()# 检查是否满足所有条件if all(sub in md5_hash for sub in target_substrings):print(f"Found:{candidate},MD5:{md5_hash}")
运行代码得到Found:TASCJ03RJMVKWDJKXLZM,MD5:e9032994dabac08080091151380478a2
提交flag{e9032994dabac08080091151380478a2}
成功。
我的心得总结 💪💪💪
这次 BUUCTF 的 crypto section实操,对我来说不仅仅是一次解题的过程,更是一次成长和学习的机会。
在这个过程中,我遇到了各种各样的困难,但每一次克服困难后的成就感都让我更加坚定了继续探索密码学世界的决心。
对于新手来说,密码学可能看起来很复杂、很神秘,但只要你有一颗热爱学习的心,勇于尝试,不怕失败,就一定能够逐渐掌握密码学的奥秘。
每一次的解题都是一次积累经验的过程,每一次的错误都是一次成长的机会。就像我这次完成 12 个板块的任务一样,虽然用时较长,但在这个过程中我学到了很多知识和技能,也收获了满满的成就感。
希望我的分享能够给大家带来一些鼓励和启发,让我们一起在密码学的道路上不断前行,探索更多的未知领域!