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

解密文件后出现损坏问题求助,附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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:40:49