1. 从零开始认识CTF密码学第一次接触CTF比赛时看到Crypto题目完全不知道从何下手。后来在BUUCTF平台刷题过程中发现密码学就像侦探破译密文需要掌握各种加密特征和破解工具。举个例子遇到U2FsdGVkX1开头的字符串大概率是Rabbit加密看到结尾的编码可能是Base64或Quoted-printable。密码学题目主要分为三大类古典密码凯撒、栅栏等手工加密方式现代密码RSA、AES等基于数学难题的加密编码转换Base64、URL编码等非加密类转换2. 古典密码实战变异凯撒2.1 题目特征分析遇到密文afZ_r9VYfScOeO_UL^RWUc题目提示变异凯撒。普通凯撒是固定位移而变异凯撒的位移量会变化。通过观察密文中的特殊符号_和^可以联想到ASCII码偏移。2.2 破解步骤详解对比明密文开头明文flag的ASCII码f(102) l(108) a(97) g(103)密文开头afZ_的ASCII码a(97) f(102) Z(90) _(95)计算偏移量# 第一组偏移 102 - 97 5 # f - a 108 - 102 6 # l - f 97 - 90 7 # a - Z 103 - 95 8 # g - _编写解密脚本cipher afZ_r9VYfScOeO_UL^RWUc offset 5 for char in cipher: print(chr(ord(char) offset), end) offset 1 # 输出flag{Caesar_variation}3. 现代密码实战RSA基础3.1 RSA核心公式密钥生成n p × q φ(n) (p-1)(q-1) d ≡ e⁻¹ mod φ(n)加解密加密c ≡ m^e mod n 解密m ≡ c^d mod n3.2 典型题目解法给定参数p 473398607161 q 4511491 e 17求d的值import gmpy2 p 473398607161 q 4511491 e 17 phi (p-1)*(q-1) d gmpy2.invert(e, phi) print(d) # 输出1256313577774275534. 哈希破解丢失的MD54.1 题目场景给出一段Python代码片段要求通过暴力破解找到符合特定MD5特征的字符串。关键特征包括包含子串e9032包含子串da包含子串9115134.2 破解脚本优化原始代码需要三重循环爆破这里用更高效的实现import hashlib from itertools import product chars [chr(i) for i in range(32, 127)] prefix TASC middle O3RJMV suffix WDJKXZM for combo in product(chars, repeat3): s prefix combo[0] middle combo[1] suffix[:5] combo[2] suffix[5:] md5 hashlib.md5(s.encode()).hexdigest() if e9032 in md5 and da in md5 and 911513 in md5: print(fFound: {s} - {md5}) break5. 编码识别技巧总结5.1 常见编码特征表编码类型识别特征工具推荐Base64结尾常带字符集A-Za-z0-9/CyberChefURL编码大量%开头浏览器地址栏自动解码Quoted-printableXX形式XX为十六进制Notepad插件摩斯电码由.和-组成Morse Code Translator5.2 实战案例Quoted-printable密文示例E982A3E4BDA0E4B99FE5BE88E6A392E593A6解码步骤使用在线解码工具直接转换得到UTF-8编码的中文那你也很棒哦最终flag格式flag{那你也很棒哦}6. 密码学工具链推荐6.1 必备工具清单Python库pycryptodome支持主流加密算法gmpy2大数运算hashlib哈希计算在线工具CyberChef 瑞士军刀式编解码factordb 大数分解专用工具RSATool2RSA密钥生成John the Ripper密码爆破7. 解题思维训练遇到新题型时的思考路径观察特征查看密文结构、特殊符号尝试分类判断属于古典/现代密码或编码工具验证用相应工具测试常见加密方式逆向分析研究题目给的源代码或提示暴力破解作为最后手段需控制范围以Rabbit加密为例特征密文以U2FsdGVkX1开头工具使用在线Rabbit解密工具技巧若无密码提示可尝试空密码解密8. 常见踩坑记录编码问题Python2/3的字符串处理差异中文字符需要encode(utf-8)工具误用把Base64当作加密算法处理混淆MD5和SHA1的特征值长度数学错误RSA计算时漏掉φ(n)大数运算时忘记转换数据类型一个真实案例在解RSA题目时我曾因为直接用pow(c,d,n)而卡住后来发现需要先用long_to_bytes转换结果。这提醒我们不仅要懂数学原理还要注意编程实现的细节。