加密与解密

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 直接跑加密函数);全块耦合再上逆推。
  • 哈希截断/魔改哈希:输出位数减少时小空间反解(生日/暴力),结构没变可复用标准实现。

通用工作流

  1. 定位加密函数(字符串引用/比较点回溯)。
  2. 识别常量 → 确定基算法(→ 常量表)。
  3. diff 找魔改;决定:手写逆函数 / 正向爆破(单字节可逐位)/ Z3 求解(→ Crypto-Z3)。
  4. 调用式偷懒:Unicorn/动态执行直接调加密函数,避免理解细节(逐字节暴力校验位)。

工具速查

# FindCrypt / signsrch 常量表
python -c "import unicorn"        # 模拟调用
# 逐字节暴力模板(校验函数可独立调用时)

转向

  • 算法本体是标准密码学 → Crypto;约束复杂上 Z3 → Crypto-Z3

评论