介绍
在CTF(Capture The Flag)竞赛中,Crypto(密码)是指与密码学相关的题目。这类题目主要考察参赛者对 加密、解密、编码、哈希等 密码学知识的理解和应用能力。Crypto题目通常涉及多种加密算法、编码方式以及解密技巧,涵盖从基础到高级的密码学知识。
认识Crypto¶
Crypto题到底在考什么?¶
很多人刷 CTF Crypto,会卡在一个错觉里:
“Crypto = 很难的数学推导”。
但真实情况更像——比赛把现实里最常见的密码学错误,打包成一个可解的谜题。你不需要发明新理论,你需要做的是:识别系统、还原链条、抓住薄弱环节。
如果用一句话概括 Crypto 的核心能力,就是:
把题目里那套“密码系统的设计/实现流程”逆向拆回去:它依赖什么安全前提?哪一步没满足?一旦没满足,攻击者能推出什么?
Crypto 的核心考点,也可以归结为三件事(对应 MISC 的“识别-处理-提取”):
1. 识别:这是哪一种密码体制?题目在让你相信什么?¶
你拿到题目的第一步,不是算式,而是判断“它属于哪类密码问题”。常见分类:
(1) 古典密码:统计特征 + 结构规律¶
典型如:凯撒、维吉尼亚、仿射、替换、栅栏等。
它们的“安全性”其实依赖:人看不出规律。所以比赛通常给你:
- 明文有语义(英文/flag 格式固定)
- 密文有频率特征
- key 很短 / 可爆破
识别信号:全是字母、密文长度不大、flag 格式明显、频率很像自然语言。
(2) 现代密码:算法本身通常安全,漏洞在“用法”¶
你看到 AES/RSA/ECC/Hash,别下意识觉得“算法会被破”。CTF 里更多考:
- 模式选错(ECB、CTR nonce 重用)
- 参数太弱(RSA 小 e、素数太近)
- 随机数坏(nonce/私钥重复)
- 协议拼装错(签名/认证流程漏洞)
识别信号:题目出现 n,e,c、iv,nonce、p,q、signature、token、mac、hash 等关键词,或者给了“服务端交互”。
(3) 协议/实现题:信息泄露与“可区分性”¶
比如 padding oracle、错误回显、时间差、长度差、重复请求可观察等。
这类题考的不是数学,而是你能否意识到:
“只要能区分两种情况,就能一点点把秘密抠出来。”
识别信号:题目给你一个接口让你试、返回错误类型不同、延迟不同、长度不同。
很多 Crypto 题,不是让你“算”,而是让你回答这**三个问题:**
- 这系统依赖什么安全前提?(随机性?不可区分?不可伪造?难分解?)
- 题目里哪一步没满足它?(nonce 重用?参数弱?模式错?泄露 oracle?)
- 没满足以后,攻击者能推出什么?(明文?密钥?伪造?)
Crypto 的本质:逆向“安全假设”——当假设被破坏,整个系统就从“不可解”变成“可推”。
常见的的子类型与典型套路¶
1) 古典密码(Classical Ciphers)¶
题面信号:全是字母/少量符号;密文不长;flag 格式明显(如 flag{});提示“key is word / shift”。
典型套路
- 移位/凯撒:爆破 26;用 flag 结构对齐验证。
- 维吉尼亚:先猜 key 长(Kasiski/重合指数),再按分组做频率分析。
- 仿射/替换:利用频率、常见二元组/三元组;或已知 flag{ 做已知明文约束。
- 栅栏/置换:枚举参数(层数/步长);看能否出现可读片段。
核心逻辑:语言统计 + 格式约束 + 可枚举参数。
2) XOR 与流密码(One-time pad / Stream Cipher)¶
题面信号:出现 xor、key reused、stream、keystream;或给你两段密文;或密文是 hex/base64 且长度相同。
典型套路
- 重复密钥 XOR(many-time pad):
多段密文同 key → 互相 xor 得到明文异或 → 用可猜前缀(flag{、JSON、HTTP)拖拽(crib dragging)。
- CTR nonce 重用:
C = P ⊕ KS,nonce 重用 → KS 相同 → 两密文 xor = 两明文 xor。
- “看似加密”的 XOR 链:
xor + 反转 + 分段拼接 + base64… 按可逆操作逐层还原。
核心逻辑:流密码最怕“重复”;一重复就能把系统变成代数题。
3) AES 对称加密(ECB/CBC/CTR/GCM)¶
题面信号:出现 AES、iv、mode、padding、oracle,或提供一个“加密/解密接口”。
3.1 ECB 模式(泄露结构)¶
套路:相同明文块→相同密文块。
- 图片/重复块可视化(“企鹅题”)
- 字节对齐 + 字典攻击(byte-at-a-time):服务端给你 encrypt(prefix + secret),你靠枚举每个字节匹配输出块。
3.2 CBC 模式(Padding Oracle / 位翻转)¶
套路
- Padding Oracle:错误回显能区分 padding 正误 → 逐字节解密。
- CBC Bit Flipping:你可控前一块密文 → 可控下一块明文的特定位,构造 admin=true 等。
3.3 CTR 模式(流密码化)¶
套路
- nonce 重用同 XOR
- 可编辑 oracle(提供 edit 接口)可直接恢复 keystream
3.4 GCM/AEAD(实现细节坑)¶
套路(比赛常见方向)
- nonce 重用导致严重问题(取决于实现与泄露)
- 把 tag 验证放在解密之后 / 报错可区分
核心逻辑:AES 本体很难破,能破的几乎都是**模式/接口/错误信息**。
4) RSA(最常见的公钥题型)¶
题面信号:给 n, e, c,或者多个 n/多个 c;或者小e,p和q
典型套路
-
共享素数:多个 n 有共同因子 → gcd(n1, n2) 秒分解。
-
p、q 太近:费马分解(p≈q)。
-
低指数 e(如 ⅗)+ 无 padding:
明文太小或结构简单 → 低指数开方/广播攻击(同 m 对不同 n)。
-
泄露部分信息:给了 dp/dq、phi(n)、p+q、d mod (p-1) 等 → 推回 p q。
-
同模不同指数/相关明文:共模攻击、线性组合还原 m。
核心逻辑:RSA 题多数在考“分解变简单了”或“padding/参数不规范”。
7) LCG/MT19937/弱 PRNG(随机数题)¶
题面信号:出现 “random”、“seed”、“timestamp”、“next()”、或给你一串输出让你预测下一个。
典型套路
- LCG:足够输出可解参数 a,b,m,进而预测后续。
- 时间种子:seed 是时间戳 / PID / 可枚举空间 → 爆破。
- MT19937:输出够多可恢复内部状态,或 seed 可猜。
核心逻辑:密码系统的“钥匙”往往是随机数;随机数弱 = 密钥弱。
常见坑点¶
很多编码就会设置坑,比如BASE系列可能就会换表
算法没问题,问题在“用法”
AES/RSA/ECC 通常不直接破,优先看:模式(ECB/CBC/CTR/GCM)、接口回显、验证顺序、错误信息是否可区分(oracle)。
随机数翻车是最高频漏洞
重点盯:CTR/GCM 的 nonce 重用、ECDSA/DSA 的 k 重用/可预测、时间戳 seed、弱 PRNG。
有些需要爆破的题目,我们要提前观察flag的标志头