PNG等非文本文件加解密失败问题求助
问题解答
核心结论
不能把PNG、EXE、PDF这类二进制文件当作文本加密,强行按文本处理会损坏原始字节数据,解密后无法恢复成正常可用的文件。
错误原因分析
- 用
"r"模式打开文件时,Python会默认按系统编码(比如Windows的charmap)把文件内容解码成字符串,但二进制文件包含大量非文本编码的字节,自然会触发UnicodeDecodeError。 - 改用
"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
相关产品推荐
相关产品推荐

