从凯撒到RSA:给CTF萌新的密码学入门实战指南
第一次参加CTF比赛时,面对那些看似天书般的密码学题目,我完全摸不着头脑。直到后来系统性地梳理了密码学的发展脉络和解题思路,才发现原来每个加密算法背后都有其独特的逻辑和破解方法。本文将带你从零开始,构建一套完整的CTF密码学解题框架。
1. 古典密码:密码学的起源与基础
古典密码是理解现代加密技术的基石。这些看似简单的加密方法,却蕴含着密码学最核心的思想。
1.1 凯撒密码与移位加密
凯撒密码是最著名的替换密码之一,其核心思想是将字母表中的每个字母按固定位数进行移位。例如,当移位数为3时:
明文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C破解凯撒密码的Python实现:
def caesar_decrypt(ciphertext, shift): result = "" for char in ciphertext: if char.isalpha(): ascii_offset = ord('a') if char.islower() else ord('A') decrypted_char = chr((ord(char) - ascii_offset - shift) % 26 + ascii_offset) result += decrypted_char else: result += char return result # 示例:解密"khoor zruog" print(caesar_decrypt("khoor zruog", 3)) # 输出: hello world常见变种与解题技巧:
- 尝试0-25所有可能的移位(暴力破解)
- 通过频率分析确定最可能的移位值
- 注意非字母字符通常保持不变
1.2 替换密码与频率分析
简单替换密码将每个明文字母映射到唯一的密文字母,比凯撒密码更安全但仍有规律可循。英语字母的典型频率分布如下:
| 字母 | 频率(%) | 字母 | 频率(%) |
|---|---|---|---|
| E | 12.70 | T | 9.06 |
| A | 8.17 | O | 7.51 |
| I | 6.97 | N | 6.75 |
| S | 6.33 | H | 6.09 |
使用频率分析破解替换密码的步骤:
- 统计密文中各字母出现频率
- 对照英语字母频率表进行初步匹配
- 根据常见单词(如"the"、"and")进一步验证
- 逐步调整直到获得可读明文
2. 现代对称加密:从XOR到AES
对称加密使用相同密钥进行加密和解密,是现代密码学的重要组成部分。
2.1 XOR加密原理与应用
XOR(异或)是最基础的加密操作之一,其特性包括:
- 可逆性:A XOR B XOR B = A
- 比特级操作:逐位进行运算
- 简单高效:计算速度快
单字节XOR加密的Python实现:
def xor_decrypt(ciphertext, key): return ''.join(chr(ord(c) ^ key) for c in ciphertext) # 示例:解密二进制密文"1010011"(ASCII表示) binary_cipher = "1010011" key = 0b0101010 # 十进制42 plaintext = chr(int(binary_cipher, 2) ^ key) print(plaintext) # 输出: '1' (ASCII 49)CTF常见题型:
- 已知明文部分内容推断密钥
- 使用频率分析破解单字节XOR
- 多字节XOR需要更复杂的破解技术
2.2 块加密与AES实战
AES(Advanced Encryption Standard)是最常用的对称加密算法,其特点包括:
- 固定128位块大小
- 支持128、192、256位密钥长度
- 多轮加密确保安全性
使用PyCryptodome进行AES解密的示例:
from Crypto.Cipher import AES from Crypto.Util.Padding import unpad def aes_decrypt(ciphertext, key, iv): cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size) return plaintext.decode() # 示例数据(实际CTF题目会提供具体参数) key = b'Sixteen byte key' iv = b'Initialization V' ciphertext = b'\x9a\x82...\xd6' # 实际密文 print(aes_decrypt(ciphertext, key, iv))解题要点:
- 确认加密模式(ECB、CBC等)
- 检查是否提供初始向量(IV)
- 注意填充方式(通常PKCS#7)
3. 非对称加密:RSA与椭圆曲线
非对称加密使用公钥和私钥对,解决了密钥分发问题。
3.1 RSA算法原理与CTF应用
RSA基于大数分解难题,其加密过程为:
- 选择两个大素数p和q
- 计算n = p * q
- 计算φ(n) = (p-1)*(q-1)
- 选择e使得1 < e < φ(n)且gcd(e, φ(n)) = 1
- 计算d ≡ e⁻¹ mod φ(n)
RSA加密/解密公式:
- 加密:c ≡ mᵉ mod n
- 解密:m ≡ cᵈ mod n
CTF中常见的RSA题型解题脚本:
from Crypto.Util.number import inverse, long_to_bytes # 已知参数 n = 55 e = 3 c = 4 # 分解n得到p=5, q=11 p, q = 5, 11 phi = (p-1)*(q-1) d = inverse(e, phi) m = pow(c, d, n) print(long_to_bytes(m)) # 输出: b'\x04' (原始消息为4)进阶技巧:
- Wiener攻击(当d较小时)
- 共模攻击(相同n不同e)
- 小指数攻击(e=3且明文很小)
3.2 椭圆曲线密码学入门
椭圆曲线密码(ECC)在相同安全强度下使用更短的密钥,其基本运算包括:
- 点加法:P + Q = R
- 标量乘法:kP = P + P + ... + P(k次)
ECC参数通常包括:
- 曲线方程:y² = x³ + ax + b
- 基点G
- 阶n
- 余因子h
使用sage数学软件进行ECC计算的示例:
# 定义椭圆曲线 E = EllipticCurve(GF(p), [a, b]) G = E.gen(0) # 基点 n = G.order() # 阶 # 标量乘法 k = 12345 Q = k * G4. 综合实战:30道CTF密码学题目精解
现在我们将各类密码学知识应用到实际CTF题目中,建立系统的解题思路。
4.1 编码与古典密码题目
Base64变种识别技巧:
- 标准Base64字符集:A-Z, a-z, 0-9, +, /
- 常见变种:URL安全的Base64(用-和_替换+/)
- 识别特征:末尾可能有1-2个=号
自动识别解码的Python代码:
import base64 def try_base64(data): try: return base64.b64decode(data).decode() except: try: return base64.urlsafe_b64decode(data).decode() except: return "Not a valid Base64" print(try_base64("SGVsbG8gQ1RGIQ==")) # 输出: Hello CTF!栅栏密码解题步骤:
- 确定轨道数(通常尝试2-5)
- 按之字形排列密文
- 按行读取得到明文
例如解密"TEITAOERHMNTSGDDY"(轨道数3):
T A H G Y E I T O R M T D D I E N S按行读取:"THEYARESENDINGDUCKS"
4.2 现代密码综合题目
混合加密系统分析:
- 识别各部分加密方式
- 按正确顺序解密
- 注意可能的编码转换
典型解题流程:
Base64 → AES解密 → XOR → 凯撒解密隐写术与密码结合:
- 使用工具如steghide、binwalk
- 检查文件元数据(exiftool)
- 分析最低有效位(LSB)
# 使用binwalk分析文件 binwalk -e suspicious_image.jpg # 检查LSB隐写 stegolsb stegano -i image.png -s 100 -n 14.3 非对称密码挑战
RSA多参数攻击场景:
- 已知n和e,尝试分解n(factordb.com)
- 相同n不同e的共模攻击
- 广播攻击(相同明文用不同n加密)
共模攻击Python实现:
from math import gcd from Crypto.Util.number import inverse, long_to_bytes def common_modulus_attack(c1, c2, e1, e2, n): g, a, b = extended_gcd(e1, e2) if g != 1: return None if a < 0: c1 = inverse(c1, n) a = -a if b < 0: c2 = inverse(c2, n) b = -b m = (pow(c1, a, n) * pow(c2, b, n)) % n return long_to_bytes(m)5. 工具链与资源推荐
高效的密码学解题离不开合适的工具,以下是我的实战工具箱。
5.1 必备在线工具
CyberChef(全能密码学工具箱):
- 支持200多种操作
- 可组合多种转换
- 直观的图形界面
经典组合配方:
From Hex → XOR Brute Force → Frequency analysis Base64 → Gunzip → File analysis其他实用网站:
- dCode.fr(密码识别器)
- Boxentriq(密码分析工具)
- Cryptool(教育用密码软件)
5.2 本地脚本开发
高效的Python密码学库:
# 加密相关 from Crypto.Cipher import AES, DES, ChaCha20 from Crypto.PublicKey import RSA, ECC from Crypto.Protocol.KDF import scrypt # 实用功能 from Crypto.Util.number import bytes_to_long, long_to_bytes from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes # 哈希函数 import hashlib hashlib.sha256(b'data').hexdigest()自动化解题框架结构:
class CTFSolver: def __init__(self, ciphertext): self.ciphertext = ciphertext self.plaintext = None def detect_encoding(self): # 自动检测Base64/Hex/Binary等 pass def try_common_ciphers(self): # 尝试常见加密方式 pass def frequency_analysis(self): # 字母频率统计 pass5.3 系统化学习路径
推荐学习顺序:
- 古典密码(凯撒、替换、转置)
- 编码系统(Base64、Hex、ASCII)
- 对称加密(XOR、AES、DES)
- 非对称加密(RSA、ECC)
- 哈希函数(MD5、SHA)
- 综合挑战
实践建议:
- 从CTFtime.org找简单密码学题目
- 参加picoCTF等新手友好比赛
- 建立自己的解题代码库