1. CTF密码学入门基础
密码学是CTF竞赛中最基础也是最核心的领域之一。作为CTF选手,掌握密码学知识不仅能帮助我们解决专门的密码学题目,还能在其他类型的题目中发挥重要作用。第一周的密码学学习主要围绕以下几个基础知识点展开:
1.1 古典密码与替换加密
古典密码是密码学的起源,主要包括凯撒密码、栅栏密码、维吉尼亚密码等。这些密码虽然简单,但在CTF比赛中经常以各种变体形式出现。
凯撒密码是最典型的替换密码,通过将字母表中的每个字母按照固定位数进行替换。例如,位移为3时:
- 明文:HELLO
- 密文:KHOOR
在实际CTF题目中,凯撒密码可能会:
- 使用非字母字符
- 结合其他编码方式(如Base64)
- 需要先识别出是凯撒加密
提示:当遇到看似随机的字母组合时,可以尝试用凯撒密码暴力破解,观察是否有可读的英文单词出现。
1.2 现代对称加密算法
现代对称加密算法在CTF中非常常见,主要包括:
- AES:最常用的对称加密算法,支持128/192/256位密钥
- DES:较老的加密标准,现在主要出现在历史题目中
- RC4:流加密算法,在Web题目中偶尔出现
典型的解题思路:
from Crypto.Cipher import AES key = b'this_is_a_key123' iv = b'initial_vector456' cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = cipher.decrypt(ciphertext)常见考察点:
- 弱密钥(如全0密钥)
- ECB模式下的图案泄露
- CBC模式的位翻转攻击
2. 非对称加密与RSA
RSA是非对称加密的代表,也是CTF密码学题目中出现频率最高的算法之一。
2.1 RSA基础原理
RSA的核心在于大数分解难题,主要参数:
- p,q:大质数
- n = p*q
- φ(n) = (p-1)*(q-1)
- e:公钥指数(通常为65537)
- d:私钥指数,满足 e*d ≡ 1 mod φ(n)
加密过程:c = m^e mod n 解密过程:m = c^d mod n
2.2 常见RSA攻击方法
小公钥指数攻击: 当e很小时(如e=3),如果m^e < n,可以直接开方得到明文
共模攻击: 相同n不同e的情况下,可以通过扩展欧几里得算法恢复明文
因数分解攻击: 当n较小时(如512bit),可以用工具直接分解
python -m primefac -vs -m=pollardrho_brent 12345678901234567890Wiener攻击: 当d较小时,可以通过连分数展开恢复私钥
3. 编码与杂项密码
3.1 常见编码方式
Base家族:
- Base64:最常用,特征是有"="填充
- Base32:全大写字母和数字
- Base16(Hex):纯十六进制
ASCII码:
- 十进制、十六进制、八进制表示
- 题目常给出形如"104 101 108 108 111"的数字串
Unicode:
- UTF-8编码
- 题目可能给出"\u5927\u5bb6\u597d"形式的编码
3.2 其他杂项密码
莫尔斯电码:
- 由"."和"-"组成
- 注意区分单词间隔和字母间隔
培根密码:
- 使用两组不同字符表示二进制
- 如ABABA代表字母A
二维码与条形码:
- 需要识别并解码图片中的编码信息
4. 实战技巧与工具
4.1 常用工具推荐
在线解密网站:
- CyberChef(瑞士军刀式工具)
- dcode.fr(支持多种古典密码)
Python库:
from Crypto.Util.number import long_to_bytes, bytes_to_long from base64 import b64decode, b64encode命令行工具:
# Base64解码 echo "SGVsbG8=" | base64 -d # Hex解码 echo "48656c6c6f" | xxd -r -p
4.2 解题通用思路
观察密文特征:
- 是否有明显的模式(如固定前缀)
- 字符集范围(是否只有字母和数字)
尝试常见编码:
- 先尝试Base64/Hex解码
- 查看ASCII码范围
分析加密方式:
- 题目描述中的提示
- 附件中可能包含加密脚本
暴力破解:
- 对于简单密码可以尝试所有可能
- 编写脚本自动化测试
5. 典型题目解析
5.1 凯撒密码变种
题目给出:
密文:XJHWJY RJXXFLJ 提示:位移不固定解题步骤:
- 发现都是大写字母,可能是凯撒变种
- 尝试发现第一个单词5字母,可能是"HELLO"
- 计算H→X位移:X(23)-H(7)=16
- 验证E(4)+16=20→T(19)不符
- 考虑位移递减:第一个字母+16,第二个+15...
- 成功解密出"HELLO WORLD"
5.2 RSA因数分解
题目给出:
n = 1234567890123456789012345678901234567890123456789012345678901234 e = 65537 c = 1234567890123456789012345678901234567890123456789012345678901234解题步骤:
- 发现n较小,尝试分解:
import sympy p,q = sympy.factorint(n).keys() - 计算φ(n)和d
- 解密得到flag
6. 学习资源与进阶方向
6.1 推荐学习路径
入门:
- 《图解密码技术》
- Crypto 101在线课程
进阶:
- 《应用密码学》
- Cryptopals挑战题
专业:
- 密码学数学基础
- 现代密码学理论
6.2 常见比赛考点
混合题型:
- 密码学+逆向
- 密码学+Web
新颖密码系统:
- 自定义加密算法
- 基于区块链的密码题目
侧信道攻击:
- 时间攻击
- 错误注入攻击
密码学的学习需要理论与实践相结合。建议每周至少完成3-5道密码学题目,并建立自己的解题笔记库。随着经验的积累,你会逐渐形成对各种密码题目的敏感度和快速解题能力。