XOR基础
XOR基础
本文适合
CTF 密码学 入门学习者。学完你能:理解 XOR基础 的核心概念和基本用法
一句话判断
XOR 题的核心是“同一个值异或两次会抵消”。看到 ^、逐字节加密、重复 key、已知文件头或多条密文共用密钥流时,优先尝试用已知明文恢复 key 或消掉 keystream。
题目中常见信号
说明:直接 XOR 或循环 XOR
说明:逐字节异或常见
说明:many-time pad 或重复密钥
说明:用 magic bytes 反推 key
说明:OTP 误用
说明:多字节循环 XOR
核心概念
XOR 满足 a ^ b ^ b = a。如果知道密文 C 和明文片段 P,就能得到对应密钥流 K = C ^ P。如果两条密文共用密钥流,C1 ^ C2 = P1 ^ P2,密钥流会消失,剩下的就是语言统计和已知明文问题。
XOR 本身不是漏洞,漏洞通常来自 key 太短、key 重复、keystream 复用、明文格式固定,或者把 XOR 当成真正加密。
最小分析流程
- 判断输入编码:先把 Hex/Base64 转成 bytes。
- 检查是否有已知明文:
flag{、文件头、JSON、HTTP、PNG、ZIP。 - 尝试单字节 XOR 枚举,用可打印比例和 flag 前缀筛选。
- 尝试多字节 key 长度,按位置分组做频率分析。
- 如果有多条密文,先两两 XOR,寻找空格、flag 前缀和常见词。
- 恢复 key 后必须重新解密全文验证,而不是只验证一个片段。
最小验证示例
ct = bytes.fromhex("2c090400164e1d0a0d031c0d")
for k in range(256):
pt = bytes(b ^ k for b in ct)
printable = sum(32 <= x < 127 for x in pt) / len(pt)
if printable > 0.9:
print(hex(k), pt)如果候选里出现 flag{ 或清晰英文,就说明单字节 XOR 假设成立。多字节循环 XOR 则把 k 扩展成多个 key byte,逐列重复这个判断。
常见利用 / 解题路线
路线总览:
- 单字节 XOR:枚举 0-255,用可打印字符、英文频率、flag 前缀筛选。
- 重复密钥 XOR:估计 key 长度,按
i % key_len分组破解每个 key byte。 - 已知文件头:PNG、ZIP、PDF、ELF 等 magic bytes 与密文 XOR 得到 key 片段。
- many-time pad:多密文互 XOR,用 crib dragging 猜常见词和 flag 结构。
- XOR 图片题:两张图 XOR、通道 XOR 或用已知图片头恢复密钥流。
常见失败原因
排查动作:尝试多字节循环 XOR 或先解码输入
排查动作:利用文件头、尾部标记或更多明文片段扩展 key
排查动作:CTF flag 不一定像自然语言,加入 flag{、_、} 得分
排查动作:key 不是简单循环,或存在偏移、压缩、二次编码
排查动作:先固定一条高置信明文,再逐步传播 key
迷你案例
一个文件 secret.bin 无法识别,但题目提示图片。读取前 8 字节密文,与 PNG 文件头 89 50 4e 47 0d 0a 1a 0a 异或得到 key 前缀。若 key 前缀呈现短周期,例如 keykeyke,就用该周期解密全文件,再用 file 或图片查看器验证是否恢复 PNG。
这个案例的证据链是:文件类型异常 -> 猜 PNG magic bytes -> XOR 得到周期 key -> 解密后文件头恢复 -> 图片可打开。