如何实现mod 32规则下fake-RC4加密并通过异或生成密文
Fake-RC4 加密实现方案
原有代码问题
原fake_rc4函数存在两个核心问题:
- 每次调用都会重置i、j变量,无法保存流密码生成过程的状态,无法生成连续的密钥流
- 仅返回了密钥流索引t,没有取出S盒中对应位置的有效密钥字节,无法直接用于异或运算
完整实现代码
def get_prg(plaintext_size, k): j = 0 S = list(range(32)) for i in range(32): j = (j + S[i] + ord(k[i % len(k)])) % 32 S[i], S[j] = S[j], S[i] return S def prg_generator(S): # 维护PRG运行状态,连续生成密钥流字节 i = 0 j = 0 while True: i = (i + 1) % 32 j = (j + S[i]) % 32 S[i], S[j] = S[j], S[i] t = (S[i] + S[j]) % 32 yield S[t] def encrypt(plaintext, k): # 1. 生成初始S盒 S = get_prg(len(plaintext), k) # 2. 初始化密钥流生成器 ks_gen = prg_generator(S) cipher = [] for c in plaintext: # 3. 逐字符异或加密,结果按要求mod32 ks_byte = next(ks_gen) cipher_byte = (ord(c) ^ ks_byte) % 32 cipher.append(chr(cipher_byte)) return ''.join(cipher)
逻辑说明
符合题目要求的mod32运算规则,实现步骤和题目要求完全对齐:
- 密钥调度(KSA):通过
get_prg完成S盒的初始置换,所有运算对32取模 - 密钥流生成(PRGA):通过生成器保存i、j的运行状态,每次按规则生成一个有效密钥流字节
- 逐位加密:遍历明文所有字符,和对应密钥流字节做异或运算,结果对32取模后转为字符,拼接得到最终密文
内容的提问来源于stack exchange,提问作者Amit Hadad
相关产品推荐
相关产品推荐

