纯 Python 实现的 XXTEA 解密核心算法
·
import os
import sys
import struct
# 配置游戏对应的密钥和签名
KEY = b"你的秘钥"
SIGN = b"4meJnPyl"
SIGN_LEN = len(SIGN)
def _long2str(v, w):
n = (len(v) - 1) << 2
if w:
m = v[-1]
if (m < n - 3) or (m > n): return None
n = m
s = struct.pack('<%dL' % len(v), *v)
return s[0:n] if w else s
def _str2long(s, w):
n = len(s)
m = (4 - (n & 3)) & 3
s += b'\0' * m
v = list(struct.unpack('<%dL' % (len(s) >> 2), s))
if w: v.append(n)
return v
def xxtea_decrypt(data, key):
"""纯 Python 实现的 XXTEA 解密核心算法"""
if not data: return data
v = _str2long(data, False)
k = _str2long(key.ljust(16, b'\0')[:16], False)
n = len(v) - 1
z = v[n]
y = v[0]
delta = 0x9E3779B9
q = 6 + 52 // (n + 1)
sum_val = (q * delta) & 0xFFFFFFFF
while sum_val != 0:
e = (sum_val >> 2) & 3
for p in range(n, 0, -1):
z = v[p - 1]
v[p] = (v[p] - (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum_val ^ y) + (k[p & 3 ^ e] ^ z)))) & 0xFFFFFFFF
y = v[p]
z = v[n]
v[0] = (v[0] - (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum_val ^ y) + (k[0 & 3 ^ e] ^ z)))) & 0xFFFFFFFF
y = v[0]
sum_val = (sum_val - delta) & 0xFFFFFFFF
return _long2str(v, True)
def decrypt_file(file_path):
if not os.path.exists(file_path):
print(f"[错误] 文件不存在: {file_path}")
return
print(f"[处理] 正在读取文件: {file_path}")
try:
with open(file_path, 'rb') as f:
encrypted_data = f.read()
# 检测并自动剔除文件头的签名
if encrypted_data.startswith(SIGN):
print(f"[检测] 发现文件头签名 '{SIGN.decode()}',已自动裁剪前 {SIGN_LEN} 字节。")
encrypted_data = encrypted_data[SIGN_LEN:]
else:
print("[提示] 未发现已知文件头签名,尝试直接整包解密。")
# 执行纯 Python 版 XXTEA 解密
decrypted_data = xxtea_decrypt(encrypted_data, KEY)
if not decrypted_data:
print("[失败] 解密结果为空(可能 Key 错误,或该文件并非 XXTEA 加密)。")
return
# 生成输出文件(保持原后缀方便直接预览)
dir_name, file_name = os.path.split(file_path)
base_name, ext = os.path.splitext(file_name)
output_name = f"{base_name}_decrypted{ext}" if ext else f"{base_name}_decrypted"
output_path = os.path.join(dir_name, output_name)
with open(output_path, 'wb') as f:
f.write(decrypted_data)
print(f"[成功] 解密完成!已生成文件: {output_path}")
except Exception as e:
print(f"[报错] 解密过程中出现异常: {e}")
if __name__ == "__main__":
if len(sys.argv) > 1:
for path in sys.argv[1:]:
decrypt_file(path)
else:
print("提示: 你可以直接把文件拖到此工具上运行。")
path = input("或者请输入要解密的文件路径: ").strip('"')
if path:
decrypt_file(path)
input("\n处理完毕,按下回车键退出...")
更多推荐



所有评论(0)