从CTF逆向题到实战:手把手教你用Python复现RC4加密解密(附完整脚本)
从CTF逆向题到实战:手把手教你用Python复现RC4加密解密(附完整脚本)
在CTF逆向题目中,RC4加密算法频繁出现,但很多选手仅仅停留在解题层面,缺乏将其转化为实用工具的能力。本文将带你从零开始,用Python实现一个完整的RC4加密解密工具,不仅能应对CTF比赛,还能应用于实际安全分析场景。
1. RC4算法原理解析
RC4(Rivest Cipher 4)是一种流加密算法,由Ron Rivest在1987年设计。它的核心在于密钥调度算法(KSA)和伪随机生成算法(PRGA)两部分。
1.1 密钥调度算法(KSA)
KSA负责初始化一个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 伪随机生成算法(PRGA)
PRGA利用打乱后的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, mode='encrypt'): 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(description='RC4加密/解密工具') parser.add_argument('-k', '--key', required=True, help='加密密钥') parser.add_argument('-i', '--input', help='输入文件') parser.add_argument('-o', '--output', help='输出文件') parser.add_argument('-s', '--string', help='字符串输入') parser.add_argument('-x', '--hex', action='store_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', errors='replace')) 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函数最终成功解密了通信数据。
