RC4

简介

RC4是一种比较简单的流加密算法,流加密的特点是逐字节加密,相邻字节间相互独立
RC4的密钥不能超过256个字节,这点从初始化密钥流的部分也能看出,因为初始化密钥流使用了swap,整个操作失去线性,所以可以保证密钥流一定的随机性
RC4大部分的操作都是在初始化密钥盒,最后只是进行了异或,可以说拿到了密钥盒就是破解了RC4

特征

虽然说本文的重点不在特征,但还是指出RC4的一些比较明显的特征,一个是置换盒初始化算法,一个就是最后密钥流对输入的异或

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
int main()
{
uint8_t initBox[256];
for (int i = 0; i < 256; i++)
initBox[i] = i; // 初始化向量
int j = 0;
char key[] = "Eleven";
for (int i = 0; i < 256; i++)
{
j = (j + initBox[i] + key[i % strlen(key)]) % 256; // 初始化密钥流向量
swap(initBox[i], initBox[j]);
}
char rawInput[] = "thisIsASecretMessage";
int len = strlen(rawInput);
int i = 0;
j = 0;
for (int k = 0; k < len; k++)
{
i = (i + 1) % 256;
j = (j + initBox[i]) % 256;
swap(initBox[i], initBox[j]);
int t = (initBox[i] + initBox[j]) % 256;
int K = initBox[t]; // 密钥流
rawInput[k] = rawInput[k] ^ K; // 将密钥与输入异或
}
return 0;
}

破解

逐字节异或,一般逆向中其实怎么都能破解,可以动调获取box,或者直接把密文输进去,或者在RC4入口点把输入的内容patch成密文,根据异或的性质RC4的加密算法就是解密算法,跑两遍等于没跑,一般题目会在key上做文章,或者在每轮异或后额外异或一个常数之类的,防止直接拿到key后一把梭
继续观察源码注意到这个t其实还能加入偏移,K也能加入常数或偏移,初始化向量也可能事先打乱而不是0,1,2,3…,甚至向量的位数也可以魔改,实战中要具体观察实现

reference

wikipedia

Author

SGSG

Posted on

2025-04-07

Updated on

2025-04-18

Licensed under