原理

RC4是一种流加密算法,密钥长度可变,可变范围是1-256字节,属于对称加密算法

yuanli

生成S-box

KSA算法初始化长度为256的S盒,用种子密钥(就是我们的秘钥)循环填充另一个256字节的K表,用K表对S表进行初始置换

1
2
3
4
5
6
7
8
9
def KSA(key):
key_length = len(key)
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + key[i % key_length]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]
return S

生成密钥流

PGRA算法根据S盒生成与明文长度相同的密钥流

1
2
3
4
5
6
7
8
9
10
def PRGA(S):
i = 0
j = 0
while True:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]
K = S[(S[i] + S[j]) % 256]
yield K

异或加密

明文字节与密钥流异或

1
2
3
4
5
def RC4(key, data):
S = KSA(key)
keystream = PRGA(S)
return bytes([c ^ next(keystream) for c in data])

例题

[Litctf 2024]ezrc4

这道题主要是用TLS回调函数修改了key,导致一直没做出来

对key按X可以发现它在另一个函数也有调用,进入X_X

hanshu

1
2
3
4
key='fenkey?'
key1=[0xA,0xC,0x1A,0x8,0x11,0x1F,0x1E]
for i in range(len(key)):
print(chr(ord(key[i])^key1[i]),end='')

得到真的key

在写密文的时候要注意大小端序

还有一些题是RC4的变形