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

PNG等非文本文件加解密失败问题求助

问题解答

核心结论

不能把PNG、EXE、PDF这类二进制文件当作文本加密,强行按文本处理会损坏原始字节数据,解密后无法恢复成正常可用的文件。

错误原因分析

  1. 用"r"模式打开文件时,Python会默认按系统编码(比如Windows的charmap)把文件内容解码成字符串,但二进制文件包含大量非文本编码的字节,自然会触发UnicodeDecodeError。
  2. 改用"rb"模式读取是正确的,但后续调用.decode('utf-8')是多余且错误的——PNG等二进制文件本身不是UTF-8编码的文本,强行解码必然失败。

正确处理方案

所有文件(文本、二进制统一对待)都以二进制模式读写,直接对字节串进行加解密操作,全程不做任何文本编码/解码转换。

示例代码(以简单异或加密为例)

加密流程
# 读取原始文件(二进制模式)
with open("example.png", "rb") as input_file:
    raw_bytes = input_file.read()

# 自定义加密逻辑(这里用异或,实际可替换为AES等专业算法)
encryption_key = b"your_secure_key_here"
encrypted_bytes = bytes([byte ^ encryption_key[i % len(encryption_key)] for i, byte in enumerate(raw_bytes)])

# 写入加密后的文件(二进制模式)
with open("example_encrypted.png", "wb") as output_file:
    output_file.write(encrypted_bytes)
解密流程
# 读取加密后的文件(二进制模式)
with open("example_encrypted.png", "rb") as input_file:
    encrypted_bytes = input_file.read()

# 解密逻辑(和加密对应)
encryption_key = b"your_secure_key_here"
decrypted_bytes = bytes([byte ^ encryption_key[i % len(encryption_key)] for i, byte in enumerate(encrypted_bytes)])

# 写入解密后的文件(二进制模式)
with open("example_decrypted.png", "wb") as output_file:
    output_file.write(decrypted_bytes)

通用规则

  • 不管处理什么类型的文件,都用rb(读二进制)和wb(写二进制)模式操作,直接处理bytes类型数据。
  • 选择支持字节流的加密算法(比如AES、DES等),避免使用仅针对文本设计的加密方式,确保加密解密后字节数据完全一致,文件可正常使用。

内容的提问来源于stack exchange,提问作者AriesNinja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:36:29