加密与解密¶
REVERSE · 知识域。逆向题中的算法识别与还原。标签:算法魔改、XOR、ROT、栅栏密码、仿射密码、BASE编码。
触发特征¶
- 逆向拿到"加密函数 + 密文",要求逆出明文。
- 核心:识别原算法 → 找魔改点 → 手写逆函数或符号求解。
算法魔改¶
- 识别原算法(常量指纹):
0x67452301(MD5/SHA1)、0x9E3779B9(TEA/XTEA)、AES S-Box、CRC32 表、BASE64 表("ABCDEFGH...")、RC4 KSA 结构。 - 常见魔改点:
- S 盒/置换表被替换 → 提取新表代入。
- 轮数增减(TEA 32 轮 → 16/64 轮)。
- 密钥编排改变、IV 硬编码。
- 换常量(delta、初始向量、模数)。
- 输出位序/字节序颠倒。
- 还原套路:提取全部常量表(FindCrypt/signsrch)→ 与标准算法 diff → 改标准实现为"题面版" → 跑解密;校验函数给"正确输出样例"时先正向验证实现正确。
- TEA 系变体(XTEA/XXTEA)轮函数差异表;DELTA 值魔改直接搜。
XOR¶
- 单字节/重复密钥/位置相关(
x ^ i ^ key[i%len])。 - 逆向:已知明文差分;密钥流从 check 对象提取。
- 变体:异或+交换、异或+滚动移位;栈字符串 XOR 构造(.rodata XOR blob 反混淆,Nullcon 2026)。
- 单字节 ROM 去混淆扫描(X-MAS CTF 2018);嵌入 ZIP + XOR license(MetaCTF 2026)。
ROT¶
- ROT13/ROT47 及自定义字母表旋转;常叠加在真加密外层做"迷雾"。
- 逆向:字符集确认(是否含数字符号)→ 枚举偏移。
栅栏密码¶
- 逆向上常见:加密前把 flag 栅栏化再 XOR;还原:枚举栏数(2-8)。
- 组合形态:栅栏 + 字符替换(→ Crypto-其他古典)。
仿射密码¶
(a·x+b) mod n嵌在字节变换里;逆向:两组已知点解 a,b;注意 n 非 26 的变体(0x100、0x80)。
BASE编码¶
- 表魔改:自定义 64 字符表(字符串常量里找)→ 换回标准表再解。
- 变体家族:base32/58/62/85/91、base65536(CJK)、base2048;非标 padding。
- 识别:字符集 + 长度比;逆向:按表重排后走标准解码。
常见算法识别清单(逆向视角)¶
拿到加密函数先对照这张"常量指纹表"识别原算法,再 diff 魔改点:
| 算法族 | 识别特征(常量/结构) |
|---|---|
| MD5/SHA1/SHA2(HASH 族) | 0x67452301/0xEFCDAB89 初始链值、64/80 轮常量表 |
| SM3/SM4(国密) | SM3 链值 0x7380166F、SM4 S-Box 0xD6 0x90 0xE9… 固定表 |
| DES/3DES | S-Box 8 张 4x16 表、PC1/PC2 置换表;3DES = 三次轮转调用 |
| AES | S-Box 0x63 0x7C 0x77…、轮常量 Rcon |
| BlowFish/TwoFish | BlowFish 的 π 表(4 张 256 项)+ 18 个 P 盒 |
| TEA/XTEA/XXTEA | 0x9E3779B9 delta;轮数魔改是最常见出题点 |
| RC4 | 256 字节 S 盒 + KSA/PRGA 双循环结构 |
| ChaCha20/Salsa20 | 常量 "expand 32-byte k"(sigma) |
| PRESENT/轻量分组 | 4-bit S-Box 0xC 0x5 0x6 0xB… + 位置换层 |
| RC4 变体/LCG算法 | LCG:x = a·x + c mod m 结构 + 小常数;识别后套参数恢复(→ Crypto-LCG) |
| RSA | 大数模幂结构(modexp 循环)、n/e/d 逐段存储 |
| CRC 系列 | 查表结构(256×4B)或逐位多项式;表首项定多项式 |
方程组与矩阵运算(非线性化的解法面)¶
- 逆向出的"加密"本质是 GF(2)/GF(2^8) 线性变换(矩阵乘 + 异或):把校验关系展成线性方程组高斯消元(→ Crypto-数理 GF(2) 工具)。
- 矩阵运算加密(希尔密码族、GF(2^8) 列混淆变体):已知明密对求逆矩阵或解系数;不可逆矩阵时用多组对齐方程最小二乘/Z3。
- 方程组规模大/非线性:Z3 建模(→ Crypto-Z3),逐字符约束 + 可打印域。
其他加密与解密¶
- 自研轻量算法:先确认是否为已知算法的"换常量版"(对照上表),再决定手写逆函数/逐字节爆破/约束求解。
- 逐字节可独立校验时优先**正向爆破**(调用式偷懒,unicorn 直接跑加密函数);全块耦合再上逆推。
- 哈希截断/魔改哈希:输出位数减少时小空间反解(生日/暴力),结构没变可复用标准实现。
通用工作流¶
- 定位加密函数(字符串引用/比较点回溯)。
- 识别常量 → 确定基算法(→ 常量表)。
- diff 找魔改;决定:手写逆函数 / 正向爆破(单字节可逐位)/ Z3 求解(→ Crypto-Z3)。
- 调用式偷懒:Unicorn/动态执行直接调加密函数,避免理解细节(逐字节暴力校验位)。