引言:CTF 逆向中的加密算法识别,从'看脸'到'看骨'
在 CTF 逆向比赛中,面对反汇编代码,如果认不出加密算法,解题思路往往会卡死。大多数经典加密算法都有独特的'骨骼特征'和'行为习惯'。比如 RC4 有 256 字节的 S 盒;TEA 离不开魔法数字 0x9e3779b9;Base64 则直接使用编码表。
但 CTF 出题人很少直接用标准算法,常进行'魔改'——改常量、换 S 盒、加可逆变换。这需要透过现象看本质,识别出内核未变的老算法。本文结合实战经验,深入剖析 RC4、TEA 和 Base64 这三种最常出现的加密算法,重点讲解它们常见的'魔改'套路及还原方法。
RC4 算法:流加密中的'变色龙',特征与魔改全解析
RC4 属于流加密,一个字节一个字节处理,加解密用同一个密钥,通过密钥生成伪随机密钥流与明文异或。
2.1 标准 RC4 的'骨骼特征':抓住那 256 次循环
标准 RC4 分两大步:初始化算法(KSA) 和 伪随机生成算法(PRGA)。
初始化算法的核心代码如下:
void rc4_init(unsigned char *s, unsigned char *key, unsigned long key_len) {
int i = 0, j = 0;
unsigned char k[256] = {0};
unsigned char tmp = 0;
// 特征 1:S 盒线性初始化
for (i = 0; i < 256; i++) {
s[i] = i; // 这就是 S 盒,按顺序填满 0-255
k[i] = key[i % key_len]; // 用密钥循环填充临时数组 K
}
// 特征 2:基于密钥的 S 盒乱序操作
for (i = 0; i < 256; i++) {
j = (j + s[i] + k[i]) % 256; // 计算交换位置
tmp = s[i];
s[i] = s[j]; // 交换 s[i] 和 s[j]
s[j] = tmp;
}
}
加密(或解密)过程如下:
void {
i = , j = , t = ;
k = ;
tmp;
(k = ; k < data_len; k++) {
i = (i + ) % ;
j = (j + s[i]) % ;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
t = (s[i] + s[j]) % ;
data[k] ^= s[t];
}
}

