加解密模式分析 - RC4 加密算法
RC4 算法是一种基于伪随机密钥流生成的对称流密码算法,它由 Ronald Rivest 于 1987 年设计,凭借极致简洁的结构和高效的运行性能,曾广泛应用于 TLS、WEP、SSL 等众多经典安全协议中。
在本章中,我们将深入剖析 RC4 算法的核心原理与实现细节。我们将从流密码的基础特性出发,逐步拆解其密钥调度算法(KSA)与伪随机生成算法(PRGA)的核心流程,但是由于内部设计缺陷,RC4 算法实际上已经在现代安全场景中已被认定为完全不安全,必须禁用。
RC4 加密过程 😁
RC4 加密算法的加密过程可以分为两个主要阶段:密钥调度算法(KSA)和伪随机生成算法(PRGA)。
密钥调度算法(KSA)
首先,RC4 用密钥把 0~255 打乱成一个乱序表,我们把这个乱序表叫做 S 盒(Substitution Box),S 盒的初始状态是 $S = [0, 1, 2, \ldots, 255]$,然后通过密钥对 S 盒进行打乱,相当于把短密钥变成均匀混乱的状态。
具体来说,KSA 的过程如下:
- 初始化 S 盒:$S[i] = i$,对于 $i = 0, 1, \ldots, 255$。
- 初始化一个长度为 256 的临时数组 $K$,将密钥重复填充到 $K$ 中,直到 $K$ 的长度为 256。
- 使用密钥对 S 盒进行打乱:对于 $i = 0$ 到 $255$,执行以下操作:
- 计算 $j = (j + S[i] + K[i]) \mod 256$。
- 交换 $S[i]$ 和 $S[j]$ 的值。
Key = [k1, k2, ..., kn] # 密钥,长度为 n
K[i] = Key[i mod len(Key)]
j = 0
for i in range(256):
j = (j + S[i] + K[i]) % 256
# 计算交换索引j
swap(S[i], S[j])
# 交换S[i]和S[j]
通过上述步骤,S 盒被密钥打乱,形成一个新的状态,为后续的伪随机生成算法(PRGA)提供基础。
伪随机生成算法(PRGA)
在 KSA 之后,RC4 进入 PRGA 阶段,生成一个伪随机密钥流。PRGA 的过程如下:
- 初始化两个索引 $i$ 和 $j$,初始值为 0。
- 在每次生成一个字节的密钥流时,执行以下操作:
- $i = (i + 1) \mod 256$。
- $j = (j + S[i]) \mod 256$。
- 交换 $S[i]$ 和 $S[j]$ 的值。
- 输出密钥流字节:$K = S[(S[i] + S[j]) \mod 256]$。
然后将生成的密钥流字节与明文进行逐字节异或(XOR)操作,得到密文。由于异或操作的可逆性,解密过程与加密过程完全相同。
i = 0
j = 0
ciphertext = []
# 为每个明文字节生成对应的密钥流字节,并做异或
for byte in plaintext:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
# 生成密钥流字节
k = S[(S[i] + S[j]) % 256]
# 明文与密钥流异或得到密文(RC4 加密/解密核心:异或可逆)
ciphertext.append(byte ^ k)
通过上述步骤,RC4 生成了一个伪随机密钥流,并将其与明文进行异或操作,完成了加密过程。解密过程则是相同的,只需将密文与相同的密钥流进行异或即可恢复出原始明文。
RC4 加密算法实现 🥰
下面是一个简单的 RC4 加密算法的 Python 实现示例:
def rc4(key: bytes, data: bytes) -> bytes:
# 1. KSA:初始化S盒
S = list(range(256))
j = 0
key_len = len(key)
# 填充K数组并打乱S盒
for i in range(256):
j = (j + S[i] + key[i % key_len]) % 256
S[i], S[j] = S[j], S[i]
# 2. PRGA:生成密钥流并异或
i = j = 0
result = []
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
keystream_byte = S[t]
# 异或得到结果
result.append(byte ^ keystream_byte)
return bytes(result)
#测试:加密和解密
key = b"secret_key_123" # 密钥( bytes类型)
plaintext = b"Hello, RC4!" # 明文
ciphertext = rc4(key, plaintext)
decrypted_text = rc4(key, ciphertext)
print("密文(十六进制):", ciphertext.hex()) # 输出密文(十六进制格式)
print("解密后明文:", decrypted_text.decode("utf-8")) # 输出:Hello, RC4!
上一章:加解密模式分析 - OTP 与 PRNG 👈
下一章:加解密模式分析 - Salsa20 加密算法 👈
回到开始:关于我 👈
相关链接:






