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

使用Python的Fernet解密文件返回空字符串的问题求助

解密返回空字符串的原因及解决办法

一、解密后得到空字符串的问题

你的代码解密后返回空字符串,核心原因是密钥读取时包含了多余的空白字符(如换行符),导致Fernet使用了错误的密钥进行解密。

从输出看,密钥打印结果是uKPMID0YwQD0dneykrCkrUEnSwbFTRs-eDvXpF7KSi4=,但实际从key.txt读取的字节数据可能带有换行符(比如保存密钥时不小心按了回车)。Fernet对密钥格式要求严格,哪怕多一个换行符都会导致解密失败,最终返回空字符串。

修正后的代码

修改密钥读取逻辑,去掉多余空白字符:

import os
from cryptography.fernet import Fernet

fileDirectory = input('Please specfy directory to decrypt\n > ')

os.chdir(fileDirectory)

# 读取密钥并去除头尾空白字节(换行、空格等)
with open('key.txt', 'rb') as f:
    red = f.read().strip()
fernet = Fernet(red)

dirContain = os.listdir()
dirContain.remove('key.txt')  # 用remove更简洁直观

for filename in dirContain:
    print(filename)
    with open(filename, 'rb') as f:
        rend = f.read()
        print(rend)
        data = fernet.decrypt(rend)
        print(data)
        # 如需将解密内容写回文件,取消注释以下代码:
        # with open(filename, 'wb') as f_write:
        #     f_write.write(data)

二、文本与二进制读取文件的区别

远不止打印时的b''标识,核心区别有两点:

  • 编码处理:文本模式(r/w)会自动将文件字节按指定编码(默认系统编码)解码为字符串,写入时将字符串编码为字节;二进制模式(rb/wb)直接读写原始字节,不做任何编码转换。
  • 换行符处理:文本模式会自动统一不同系统的换行符(Windows的\r\n转成\n);二进制模式保留文件原始的换行字节,不做修改。

举个实际例子:

  • 若文件存UTF-8编码的中文“测试”,文本模式读取得到字符串'测试',二进制模式读取得到b'\xe6\xb5\x8b\xe8\xaf\x95'。
  • 若文件里是Windows换行符\r\n,文本模式读取后变成\n,二进制模式读取则保留b'\r\n'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:00:57