文章目录
- 前言
- [一、RC4 是什么?](#一、RC4 是什么?)
- [二、RC4 的核心思想](#二、RC4 的核心思想)
- [三、RC4 算法流程详解](#三、RC4 算法流程详解)
-
- [1. 状态数组 S 的初始化](#1. 状态数组 S 的初始化)
- [2. KSA:密钥调度算法(Key Scheduling Algorithm)](#2. KSA:密钥调度算法(Key Scheduling Algorithm))
- [3. PRGA:伪随机生成算法](#3. PRGA:伪随机生成算法)
- [四、RC4 加密过程示意](#四、RC4 加密过程示意)
- [五、RC4 实战示例](#五、RC4 实战示例)
-
- [1. RC4 核心实现代码](#1. RC4 核心实现代码)
- [2. 加密与解密示例](#2. 加密与解密示例)
- [六、RC4 的优点与缺点](#六、RC4 的优点与缺点)
-
- [1. 优点](#1. 优点)
- [2. 缺点](#2. 缺点)
前言
RC4 是一种经典的流加密算法,曾广泛应用于 SSL/TLS、WEP、WPA 等安全协议中。由于其实现简单、速度快,在早期网络通信中非常流行。
一、RC4 是什么?
RC4(Rivest Cipher 4)是由 Ron Rivest 于 1987 年设计的一种 对称流加密算法,其核心特点如下:
- 属于 对称加密(加密和解密使用同一密钥)
- 属于 流加密算法(逐字节生成密钥流)
- 实现简单、运行速度快
- 密钥长度可变(1~256 字节)
RC4 的本质是:
生成一个伪随机密钥流,再与明文逐字节进行异或(XOR)操作
二、RC4 的核心思想
RC4 的整体流程可以概括为三步:
- 初始化状态向量 S(0~255)
- 根据密钥打乱 S(KSA:Key Scheduling Algorithm)
- 生成密钥流并加密数据(PRGA:Pseudo-Random Generation Algorithm)
公式层面上非常简单:
密文 = 明文 XOR 密钥流
明文 = 密文 XOR 密钥流
这也是为什么 RC4 的 加密和解密代码完全一致。
三、RC4 算法流程详解
1. 状态数组 S 的初始化
RC4 使用一个长度为 256 的数组 S:
text
S = [0, 1, 2, 3, ..., 255]
同时还会生成一个密钥数组 K,长度同样为 256:
text
K[i] = key[i % key_length]
2. KSA:密钥调度算法(Key Scheduling Algorithm)
KSA 的作用是:
根据密钥对数组 S 进行初步打乱
算法流程:
text
j = 0
for i = 0 to 255:
j = (j + S[i] + K[i]) mod 256
swap(S[i], S[j])
特点:
- 每一个密钥都会影响最终的状态数组
- KSA 的安全性直接影响 RC4 的整体安全性
3. PRGA:伪随机生成算法
PRGA 用于不断生成密钥流字节:
text
i = 0, j = 0
while 需要密钥流:
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap(S[i], S[j])
t = (S[i] + S[j]) mod 256
key_stream = S[t]
生成的 key_stream 会与明文进行 XOR 运算。
四、RC4 加密过程示意
明文: P1 P2 P3 P4
密钥流: K1 K2 K3 K4
↓ ↓ ↓ ↓
密文: C1 C2 C3 C4
Ci = Pi XOR Ki
五、RC4 实战示例
1. RC4 核心实现代码
python
def rc4(key, data):
# KSA
S = list(range(256))
j = 0
key_length = len(key)
for i in range(256):
j = (j + S[i] + key[i % key_length]) % 256
S[i], S[j] = S[j], S[i]
# PRGA
i = j = 0
result = bytearray()
for byte in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256
k = S[t]
result.append(byte ^ k)
return result
2. 加密与解密示例
python
key = b"secret_key"
plaintext = b"Hello RC4"
ciphertext = rc4(key, plaintext)
print("密文:", ciphertext)
decrypted = rc4(key, ciphertext)
print("解密后:", decrypted)
输出结果:
text
密文: b'\x8f\x1d\xab...'
解密后: b'Hello RC4'
可以看到:
同一个函数既可以加密,也可以解密
六、RC4 的优点与缺点
1. 优点
- 算法简单,代码量小
- 加密速度快,适合流式数据
- 对硬件要求低
2. 缺点
RC4 已被证明不安全,主要问题包括:
- 密钥流前若干字节存在严重偏差
- 容易受到统计分析攻击
- 在 WEP、TLS 中被成功破解
- 不具备现代密码学的安全保证
结论:RC4 不再推荐用于任何安全场景