Crypto 新手上手操作指南¶
Crypto 题最重要的第一步是识别题型。不要一拿到数字、密文或脚本就立刻爆破;先判断它是编码、古典密码、RSA、PRNG、对称加密,还是实现漏洞。
这类题先看什么¶
先问:
- 给了什么:密文、源码、参数、交互服务、附件还是多组样本?
- 输出像什么:Base64、Hex、大整数、矩阵、随机数序列、分组密文?
- 是否给了源码?源码里真正的 secret 是怎么参与计算的?
- 目标是解密、伪造、预测随机数,还是恢复私钥/明文?
最小工具集¶
| 工具 | 用途 |
|---|---|
| Python | 大整数、字节转换、脚本复现 |
| CyberChef | 编码/哈希/简单变换快速试探 |
| SageMath / sympy | 数论、矩阵、多项式、格相关计算 |
openssl |
常见对称算法和证书格式检查 |
| RsaCtfTool / 自写脚本 | RSA 参数攻击与验证 |
首轮 10 分钟操作流程¶
Step 1:先判断数据形态¶
- 全是可打印字符:先看 Base64 / Base32 / URL / Morse / 古典密码。
- 全是十六进制:先转 bytes,看是否可打印或有文件头。
- 很大的整数:优先考虑 RSA、模运算或离散对数。
- 多组输出:考虑 PRNG、同 key 多次加密、广播攻击、nonce 重用。
- 有源码:直接读 secret 参与的位置,不要只看变量名。
Step 2:整理参数¶
把题目给出的内容整理成表:
| 名称 | 含义 | 是否已知 |
|---|---|---|
n |
RSA modulus | 已知 |
e |
public exponent | 已知 |
c |
ciphertext | 已知 |
p/q/d/m |
私钥或明文 | 待求 |
整理参数能避免把“看起来像密钥”的东西误当成真正密钥。
Step 3:先试最常见弱点¶
- RSA:小指数、共模、广播、
n可分解、p/q太近、e/d异常。 - CBC/CTR/GCM:IV/nonce 是否重用,是否有 padding oracle,是否可控明文。
- Hash/MAC:是否存在长度扩展、CBC-MAC 使用场景错误。
- PRNG:是否是 LCG、MT19937、时间种子或弱随机。
- 古典密码:频率、周期、已知 flag 格式。
典型突破口¶
| 现象 | 优先尝试 |
|---|---|
e = 3 且明文短 |
RSA low exponent |
多个不同 n 加密同一明文 |
Håstad broadcast |
同一个 n 不同 e |
common modulus |
p、q 很接近 |
Fermat 分解 |
| nonce/IV 重用 | XOR 两个密文或恢复 keystream |
| 给了加密 oracle | 构造可控明文观察差异 |
| 随机数递推明显 | 还原 PRNG 参数 |
新手常见误区¶
- 不整理参数,直接乱套脚本。
- 把编码当加密,或把哈希当可逆加密。
- 只看密文,不读源码里真实的加密流程。
- 忽略 flag 格式,它常常是已知明文的一部分。
- 没有验证中间结果是否能重新加密回原密文。
仓库内参考阅读¶
- CBC-MAC 常见问题解答 — MAC 场景和误用理解。
- RSA 与模运算知识点扩展 — RSA 入门数论基础。
- CPCTF Dualcast — Crypto 题型识别和分流思路。
- kashiCTF Broadcast — RSA 广播类问题。
一页式检查清单¶
- 判断了数据是编码、密文、大整数还是源码逻辑
- 整理了所有参数和待求量
- 识别了算法或至少缩小到一类算法
- 检查了常见弱点:小指数、共模、nonce 重用、弱随机
- 利用了 flag 格式作为已知明文或验证条件
- 写脚本前先手算/小样本验证了公式
- 最终结果能通过重新加密、校验或格式检查