从CTF逆向题到实战手把手教你用Python复现RC4加密解密附完整脚本在CTF逆向题目中RC4加密算法频繁出现但很多选手仅仅停留在解题层面缺乏将其转化为实用工具的能力。本文将带你从零开始用Python实现一个完整的RC4加密解密工具不仅能应对CTF比赛还能应用于实际安全分析场景。1. RC4算法原理解析RC4Rivest Cipher 4是一种流加密算法由Ron Rivest在1987年设计。它的核心在于密钥调度算法KSA和伪随机生成算法PRGA两部分。1.1 密钥调度算法KSAKSA负责初始化一个256字节的S盒S-box并通过密钥对其进行打乱def KSA(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注意密钥长度通常建议在40-256位之间过短的密钥会降低安全性。1.2 伪随机生成算法PRGAPRGA利用打乱后的S盒生成伪随机密钥流def PRGA(S): i 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 K2. Python实现完整RC4加密解密将KSA和PRGA组合起来我们可以构建完整的RC4加密/解密函数def RC4(key, data): # 加密和解密使用相同流程 S KSA(key.encode(latin-1)) keystream PRGA(S) res [] for byte in data: if isinstance(byte, str): byte ord(byte) res.append(byte ^ next(keystream)) return bytes(res)关键点说明RC4是流加密加密和解密过程完全相同密钥和明文都需要转换为字节形式异或操作(^)是核心加密步骤3. 处理不同输入输出格式实际应用中我们需要处理各种格式的输入输出3.1 文件加密/解密def process_file(key, input_file, output_file, modeencrypt): with open(input_file, rb) as f: data f.read() result RC4(key, data) with open(output_file, wb) as f: f.write(result)3.2 十六进制字符串处理def hex_rc4(key, hex_str): data bytes.fromhex(hex_str) result RC4(key, data) return result.hex()4. 封装为命令行工具将上述功能整合为一个实用的命令行工具import argparse def main(): parser argparse.ArgumentParser(descriptionRC4加密/解密工具) parser.add_argument(-k, --key, requiredTrue, help加密密钥) parser.add_argument(-i, --input, help输入文件) parser.add_argument(-o, --output, help输出文件) parser.add_argument(-s, --string, help字符串输入) parser.add_argument(-x, --hex, actionstore_true, help十六进制模式) args parser.parse_args() if args.input and args.output: process_file(args.key, args.input, args.output) elif args.string: if args.hex: print(hex_rc4(args.key, args.string)) else: result RC4(args.key, args.string.encode()) print(result.decode(latin-1, errorsreplace)) else: print(请指定输入源(-i/-s)) if __name__ __main__: main()使用示例# 加密文件 python rc4_tool.py -k secret -i plain.txt -o encrypted.bin # 解密十六进制字符串 python rc4_tool.py -k secret -s A3F5C8 -x5. 实战应用与安全注意事项在CTF比赛中RC4常以以下形式出现密钥隐藏在二进制中需要逆向分析找到密钥多次加密如屏幕裂开了题目中的99999次KSA自定义S盒初始化非标准的0-255初始化安全建议避免重复使用相同密钥考虑使用HMAC进行完整性验证现代应用中建议使用AES等更安全的算法以下是一个CTF中常见的多次KSA处理代码def multiple_KSA(key, rounds): S list(range(256)) for _ in range(rounds): 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通过这个完整的RC4实现你不仅能解决CTF中的逆向题目还能将其应用于实际的数据加密需求。我在分析Android应用时曾遇到一个变种RC4其S盒初始化方式特殊通过修改KSA函数最终成功解密了通信数据。