简介
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