【CTF笔记】RC4加密

一、原理

在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。
RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。

1、初始化算

假设S-box的长度为256,密钥长度为Len,在初始化的过程中,密钥的主要功能是将S-box搅乱。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
int i=0,j=0;
unsigned char tmp=0;
for(i=0;i<256;i++) {
s[i]=i;
k[i]=key[i%Len];
}
for(i=0;i<256;i++) {
j=(j+s[i]+k[i])%256;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}

2、加解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
int i=0,j=0,t=0;
unsigned long k=0;
unsigned char tmp;
for(k=0;k<Len;k++)
{
i=(i+1)%256;
j=(j+s[i])%256;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
t=(s[i]+s[j])%256;
Data[k]^=s[t];
}
}

i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

二、代码

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <string.h>

void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) {
int i = 0, j = 0;
unsigned char k[256] = {0};
unsigned char tmp = 0;

for (i = 0; i < 256; i++) {
s[i] = i;
k[i] = key[i % Len];
}

for (i = 0; i < 256; i++) {
j = (j + s[i] + k[i]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}

void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) {
int i = 0, j = 0, t = 0;
unsigned long k = 0;
unsigned char tmp;

for (k = 0; k < Len; k++) {
i = (i + 1) % 256;
j = (j + s[i]) % 256;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
t = (s[i] + s[j]) % 256;
Data[k] ^= s[t];
}
}

void print_hex(unsigned char *data, unsigned long len) {
for (unsigned long i = 0; i < len; i++) {
printf("%02X ", data[i]); // 打印为十六进制
}
printf("\n");
}

int main() {
unsigned char s[256] = {0};
unsigned char key[] = "This is key";
unsigned char Data[] = "This is plaintext or ciphertext";

// 初始化 RC4 状态
rc4_init(s, key, strlen((const char*)key));

// 对数据进行加密或解密
rc4_crypt(s, Data, strlen((const char*)Data));

// 输出加密或解密后的结果
printf("Encrypted/Decrypted data (in hex):\n");
print_hex(Data, strlen((const char*)Data));

return 0;
}

【CTF笔记】RC4加密
https://hel1um17.github.io/2025/05/04/2025-05-04/
作者
Hel1um17
发布于
2025年5月4日
许可协议