import base64
def rc4_decrypt(cipher_data, key_bytes):
"""
RC4 解密函数(严格匹配反汇编逻辑)
:param cipher_data: 密文(bytes类型)
:param key_bytes: 原始16字节密钥(bytes类型)
:return: 明文(bytes类型)
""" # === 1. RC4 KSA 阶段(对应 sub_1400015D0) === S = list(range(256)) # 对应 byte_140013140(S盒)
j = 0
key_len = len(key_bytes) # 固定为16
# 模拟反汇编中"循环填充密钥+S盒置换"逻辑
for i in range(256):
# 反汇编:byte_140013040[n256] = Str[n256 % 16]
key_byte = key_bytes[i % key_len]
# 反汇编:v2 = (unsigned __int8)(v2 + v4 + *v3++)
j = (j + S[i] + key_byte) % 256
# 交换 S[i] 和 S[j] S[i], S[j] = S[j], S[i]
# === 2. RC4 PRGA 阶段(对应 sub_140001670) === i = 0
j = 0
plain_bytes = []
for byte in cipher_data:
i = (i + 1) % 256
v7 = S[i]
j = (j + v7) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + v7) % 256
keystream_byte = S[t]
# 异或解密(核心操作)
plain_byte = byte ^ keystream_byte
plain_bytes.append(plain_byte)
return bytes(plain_bytes)
def parse_cipher_input(input_str, input_type):
“““解析密文输入为bytes(兼容多格式)”””
try:
if input_type == 1:
# 十六进制字符串(支持0x前缀/空格)
input_str = input_str.strip().replace(“0x”, “”).replace(" “, “”)
return bytes.fromhex(input_str)
elif input_type == 2:
# Base64编码
return base64.b64decode(input_str)
elif input_type == 3:
# UTF-8字符串
return input_str.encode(“utf-8”)
elif input_type == 4:
# GBK字符串(兼容中文)
return input_str.encode(“gbk”)
else:
raise ValueError(“无效的输入类型”)
except Exception as e:
raise RuntimeError(f"密文解析失败:{str(e)}”)
if name == “main”:
# ===================== 核心:原始16字节密钥 ===================== # 对应反汇编中的 string2 原始密钥:26 26 E8 48 54 46 18 97 43 A9 46 9A 37 D0 0F 13
RC4_KEY_BYTES = bytes.fromhex(“26 26 E8 48 54 46 18 97 43 A9 46 9A 37 D0 0F 13”)
print("=== RC4 解密工具(精准匹配反汇编密钥) ===")
print("密文输入类型:")
print("1 - 十六进制字符串(例:9a0f8e14b93b87081e89)")
print("2 - Base64 编码字符串(例:maq+FLk7hwh6iQ==)")
print("3 - 原始字符串(UTF-8 编码)")
print("4 - 原始字符串(GBK 编码)")
# 获取输入类型(防错)
while True:
try:
input_type = int(input("\n请选择密文类型(1-4):"))
if input_type not in [1, 2, 3, 4]:
print("请输入1-4之间的数字!")
continue
break except ValueError:
print("请输入有效数字!")
# 获取密文内容
cipher_input = input("请输入密文内容:").strip()
# 执行解密
try:
cipher_data = parse_cipher_input(cipher_input, input_type)
plain_data = rc4_decrypt(cipher_data, RC4_KEY_BYTES)
# 多编码输出明文(避免乱码)
print("\n=== 解密结果 ===")
print(f"明文(原始bytes):{plain_data}")
# 尝试常见编码解码
for encoding in ["utf-8", "gbk", "latin-1", "ascii"]:
try:
print(f"明文({encoding} 解码):{plain_data.decode(encoding)}")
except (UnicodeDecodeError, LookupError):
continue
print(f"明文(十六进制):{plain_data.hex()}")
except Exception as e:
print(f"\n解密失败:{str(e)}")
评论