【逆向】RC4

概念

RC4(Rivest Cipher 4)是一种**流密码(Stream Cipher)**算法,由著名密码学家 Ronald Rivest 在 1987 年为 RSA Security 设计。但由于后来发现的安全漏洞,现代系统中已不推荐使用 RC4

原理

RC4 由两个核心部分组成:

缩写全称功能
KSAKey Scheduling Algorithm密钥调度算法:根据密钥初始化 S-box(状态数组 S)
PRGAPseudo-Random Generation Algorithm伪随机生成算法:用 S-box 生成伪随机密钥流,并与数据异或加解密

RC4 是对称流密码:加密和解密过程完全一样,只是用同样的密钥流异或。

KSA

目标:用密钥 K 初始化一个 256 字节的数组 S,完成后,S 是一个由密钥决定的“打乱”状态。

步骤:

  1. 创建数组 S[0..255],初始为顺序值:

    S = [0, 1, 2, 3, ..., 255]
    
  2. 创建临时数组 T[0..255],根据密钥 K 填充:

    • 假设密钥长度为 keylen 字节
    • T[i] = K[i % keylen]

    例如:密钥是 "Key"(3 字节),则:

    T[0] = 'K', T[1] = 'e', T[2] = 'y', T[3] = 'K', T[4] = 'e', ...
    
  3. 打乱 S 数组:

    j = 0
    for i in range(256):
        j = (j + S[i] + T[i]) % 256
        swap(S[i], S[j])
    

PRGA

目标:从 S 中生成一个无限长的密钥流字节序列。

步骤:

i = 0
j = 0
while True:
    i = (i + 1) % 256
    j = (j + S[i]) % 256
    swap(S[i], S[j])
    K = S[(S[i] + S[j]) % 256]
    output K  # 这个 K 就是下一个密钥流字节

加密与解密

由于 异或(XOR)的可逆性,加密和解密过程完全一样!

加密:
密文 = 明文 XOR 密钥流
解密:
明文 = 密文 XOR 密钥流

下面提供我的RC4加密解密脚本

def rc4_init(key):
    """KSA: 初始化 S 数组"""
    key = [ord(c) for c in key]  # 转为字节
    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]
    return S

def rc4_generate_keystream(S):
    """PRGA: 生成密钥流生成器"""
    i = 0
    j = 0
    while True:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        K = S[(S[i] + S[j]) % 256]
        yield K

def rc4_crypt(data, key):
    """加密或解密字符串"""
    S = rc4_init(key)
    keystream = rc4_generate_keystream(S)
    if isinstance(data, str):
        data = [ord(c) for c in data]
    return bytes([b ^ next(keystream) for b in data])

# === 使用示例 ===
key = "Secret"
plaintext = "Hello, World!"

# 加密
ciphertext = rc4_crypt(plaintext, key)
print("密文(十六进制):", ciphertext.hex())

# 解密
decrypted = rc4_crypt(ciphertext, key)
print("解密结果:", decrypted.decode('ascii'))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值