You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XOR一次性密码本解密十六进制文本时特殊字符解码失败求助

问题分析与解决方法

你的核心问题是错误地在Unicode字符层面进行XOR操作,而一次性密码本(OTP)的XOR必须是字节级操作。UTF-8编码的特殊字符(比如é对应\xc3\xa9两个字节、–对应\xe2\x80\x93三个字节)被拆成单个Unicode字符处理后,原始字节结构被破坏,导致解密后无法正确还原为目标字符。

错误代码的核心问题

  1. 你将密文和密钥经unicode_escape解码后得到Unicode字符串,再用ord(letter)获取字符的Unicode码点——这不是OTP需要的原始密文字节,而是字符的编码值,多字节UTF-8字符会被拆成多个独立码点处理。
  2. 最后额外的unicode_escape转码操作进一步混淆了字节与字符的边界,加剧了乱码问题。

修正后的完整代码

itemsList = []

while True:
    try:
        line = input()
    except EOFError:
        break
    itemsList.append(line)

cryptogram = itemsList[0]
key = itemsList[1]

# 将带\x转义的字符串转换为原始字节序列
# unicode_escape解码转义序列,再用latin1编码还原单字节映射
code_bytes = bytes(cryptogram, "utf-8").decode("unicode_escape").encode("latin1")
key_bytes = bytes(key, "utf-8").decode("unicode_escape").encode("latin1")

# 逐字节执行XOR操作
result_bytes = bytes([c ^ k for c, k in zip(code_bytes, key_bytes)])

# 将XOR后的字节解码为UTF-8字符串
final_result = result_bytes.decode("utf-8")

print(final_result)

关键步骤说明

  1. 字节序列还原:unicode_escape解码把\xXX转义序列转为对应Unicode字符,再用latin1编码(单字节严格映射)还原出OTP需要操作的原始密文字节。
  2. 字节级XOR:直接对两个字节序列的每一位进行异或,完整保留UTF-8字符的多字节结构。
  3. UTF-8解码:将异或后的字节序列直接解码为UTF-8字符串,即可正确显示é、–这类特殊字符。

效果验证

比如针对密文转义字符串\xc3\xa9tage,密钥匹配时XOR后会得到\xc3\xa9字节,解码后直接显示étage;对于\xe2\x80\x93转义序列,解码后会正确显示破折号–。

内容的提问来源于stack exchange,提问作者r.b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:54:57