RC4¶
CRYPTO · 知识域。RC4 流密码及其统计弱点。标签:密钥泄露。
触发特征¶
- 题面提到 RC4/WEP/SSL 旧版;密钥重复使用加密多条消息。
- 密文前缀偏移(第二字节偏向 0x00)。
密钥泄露¶
- 密钥重复 = 密钥流重复:两条密文 XOR 消去密钥流得
P1⊕P2, crib-dragging 恢复(同 流密码 OTP 套路)。 - WEP 类 IV 弱点:IV 与固定密钥拼接 →
FMS/KoreK攻击恢复密钥(aircrack-ng 直接支持)。 - 密钥可预测:密钥来自时间戳/用户名 → 枚举种子重放 KSA(时间种子思路同 MT19937)。
- KSA 状态泄露:题目暴露 S 盒初态或部分交换记录 → 逆推密钥。
统计偏差攻击¶
- 第二字节偏差:RC4 输出第二字节偏向 0x00(概率 1/128 vs 1/256);约 2048 条样本即可区分 RC4 与随机(Hackover CTF 2015)。
- 更多样本偏差:前 N 字节联合偏差构造区分器/明文恢复(现代 TLS RC4 弃用的原因,CTF 中作为"判断是否 RC4"的依据)。
- 逐字节恢复:大量同密钥密文下,第 i 字节频率分布固定 → 每个位置取最常见值。
实现细节坑¶
- KSA/PRGA 的 256 取模;密钥长度任意(CTF 常见 5-16 字节)。
- drop-N(丢弃前 N 字节)变体:验证时同样跳过;某些库默认 drop(如
arc4与RC4-drop512混淆)。 - 与"伪 RC4"区分:出题人常魔改 KSA(如步长 2),逆向确认 → Reverse-加密与解密。
工具速查¶
def rc4(key, data):
S = list(range(256)); j = 0
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
out = bytearray(); i = j = 0
for c in data:
i = (i + 1) % 256; j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
out.append(c ^ S[(S[i] + S[j]) % 256])
return bytes(out)