一、RC4算法原理
1、概念
rc4是一种基于密钥流的加密算法,它的密钥长度可变,密钥长度在1-256字节范围,主要是因为这个算法的非线性度良好,因为加解密使用的是相同的密钥,所以也是对称加密算法。
2、原理
最关键的点就是明文x和密钥经过动态的s盒生成的密钥流进行了一一异或加密,得到了密文,这里rc4是对明文进行一个个加密的,密钥流的长度和要加密的明文长度一致。
3、代码
| 12
 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
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 | #include <string.h>
 static void rc4_init(unsigned char* s_box, unsigned char* key, unsigned int key_len)
 {
 unsigned char Temp[256];
 int i;
 for (i = 0; i < 256; i++)
 {
 s_box[i] = i;
 Temp[i] = key[i%key_len];
 }
 int j = 0;
 for (i = 0; i < 256; i++)
 {
 j = (j + s_box[i] + Temp[i]) % 256;
 unsigned char tmp = s_box[i];
 s_box[i] = s_box[j];
 s_box[j] = tmp;
 }
 }
 
 void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len)
 {
 unsigned char s_box[256];
 rc4_init(s_box, key, key_len);
 unsigned int i = 0, j = 0, t = 0;
 unsigned int Temp;
 for (Temp = 0; Temp < data_len; Temp++)
 {
 i = (i + 1) % 256;
 j = (j + s_box[i]) % 256;
 unsigned char tmp = s_box[i];
 s_box[i] = s_box[j];
 s_box[j] = tmp;
 t = (s_box[i] + s_box[j]) % 256;
 data[Temp] ^= s_box[t];
 }
 }
 
 | 
识别点:存在 3 个循环,前两次循环的次数为 256 次,最后一次循环的次数以某个变量的值为限,实质是需要加密(解密)的内容长度,每次循环的最后有一个异或的操作代表加密该内容。
python脚本实现加解密:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | from Crypto.Cipher import ARC4, AES, DES
 from Crypto.Util.Padding import unpad
 from binascii import *
 
 rc4_key = b"De1CTF"
 
 def rc4_decrypt(cipher, key=rc4_key):
 rc4 = ARC4.new(key)
 return rc4.decrypt(cipher)
 def rc4_encrypt(cipher, key=rc4_key):
 rc4 = ARC4.new(key)
 return rc4.encrypt(cipher)
 
 
 minwen = b"flag{1234567!99}"
 cipher = b"\x38\x7d\xa0\xf9\x89\x1b\x2e\x1a\x8e\x78\x6b\x39\xde\x6f\xd9\x84"
 print rc4_decrypt(cipher)
 
 | 
其实有逆向思维的话,可以很快做手撕这种题目,因为,最后的加密时是异或操作,所以可以通过动态调试得到s_box[t]的值,这样就变成了简单的异或加密算法。