解密文件后出现损坏问题求助,附Python加密解密代码
问题排查与修复建议
你的代码在加密和解密过程中存在字符丢失的问题,这是导致文件损坏的核心原因,另外还有一些逻辑细节需要调整,具体如下:
核心问题:丢失最后一个字符
加密函数的问题
在encrypt函数中,循环使用了range(len(red) - 1),这会导致原文件的最后一个字符完全被忽略,没有加入到加密后的内容里:
for x in range(len(red) - 1): # 这里少处理了索引为len(red)-1的最后一个字符 if red[x] == '0': final.append('#!#') else: final.append(red[x])
记事本打开看起来正常是因为文本文件的末尾字符可能不影响显示,但二进制文件(如png、docx)丢失任意一个字节都会破坏文件结构,导致损坏。
解密函数的问题
同样,decrypt函数的循环也用了range(len(dat) - 1),导致加密文件的最后一个字符没被处理,解密后的内容再次丢失字符:
for x in range(len(dat) - 1): # 同样少处理了最后一个字符 # ... 处理逻辑
其他需要修复的问题
- 扩展名提取逻辑缺陷:解密时通过遇到
Q来停止扩展名收集,如果原文件扩展名本身包含Q(比如qt),会导致扩展名提取错误,进而生成错误的文件格式。可以改用特殊分隔符(比如|||Q)来标记扩展名结束,避免冲突。 - 冗余的文件操作:加密时先执行
file = open(filename,'a'); file.close()完全没必要,直接用open(filename,'w',encoding="Latin-1")写入即可。 - 删除文件的方式不够安全:使用
os.system('del '+filename)依赖系统命令,且没有处理文件不存在的情况,建议改用os.remove()并添加异常捕获。
修复后的代码示例
import os def encrypt(filename, extension): # 用二进制模式读取再转Latin-1,避免编码异常 with open(f"{filename}.{extension}", 'rb') as f: red = f.read().decode('Latin-1') final = [f"{extension}Q"] # 遍历所有字符,不丢弃最后一个 for char in red: if char == '0': final.append('#!#') else: final.append(char) fin = ''.join(final) # 写入加密文件 with open(filename, 'w', encoding="Latin-1") as f: f.write(fin) # 删除原文件,捕获不存在的异常 try: os.remove(f"{filename}.{extension}") except FileNotFoundError: pass def decrypt(filename): with open(filename, 'r', encoding="Latin-1") as f: dat = f.read() final = [] exten = '' is_done = False x = 0 # 用while循环遍历所有字符,避免索引越界 while x < len(dat): if not is_done: if dat[x] == 'Q': is_done = True x += 1 continue exten += dat[x] x += 1 else: # 检查是否是#!#标记 if x + 2 < len(dat) and dat[x] == '#' and dat[x+1] == '!' and dat[x+2] == '#': final.append('0') x += 3 else: final.append(dat[x]) x += 1 fin = ''.join(final) # 写入解密文件 with open(f"{filename}.{exten}", 'w', encoding="Latin-1") as f: f.write(fin) # 删除加密文件 try: os.remove(filename) except FileNotFoundError: pass # 使用示例 # encrypt('eee','png') # decrypt('eee')
额外说明
对于二进制文件,更推荐用二进制模式(rb/wb)直接读写字节,彻底避免编码转换可能带来的潜在问题。比如可以把加密逻辑改为直接操作字节串,兼容性会更好。
内容的提问来源于stack exchange,提问作者Mommy
相关产品推荐
相关产品推荐

