一、RC4算法原理
1、概念
rc4是一种基于密钥流的加密算法,它的密钥长度可变,密钥长度在1-256字节范围,主要是因为这个算法的非线性度良好,因为加解密使用的是相同的密钥,所以也是对称加密算法。
2、原理
最关键的点就是明文x和密钥经过动态的s盒生成的密钥流进行了一一异或加密,得到了密文,这里rc4是对明文进行一个个加密的,密钥流的长度和要加密的明文长度一致。
3、代码
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 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脚本实现加解密:
1 2 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]的值,这样就变成了简单的异或加密算法。