密码学 May 08, 2020

RC4校验算法研究

Words count 8.3k Reading time 8 mins. Read count 0

一、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;//顺序填充S盒
Temp[i] = key[i%key_len];//生成临时变量T
}
int j = 0;
for (i = 0; i < 256; i++)//打乱S盒
{
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盒动态变化的原因就是不断进行了打乱
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
# -*- coding: utf-8 -*-
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)

#RC4
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]的值,这样就变成了简单的异或加密算法。

0%