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

使用Cryptography库解密文件时遭遇TypeError问题求助

解决Fernet解密时TypeError: token must be bytes or str的问题

错误原因分析

  • 传递错误参数给decrypt方法:你直接把文件对象f传给key.decrypt(),但Fernet的decrypt()要求传入加密后的字节数据或字符串,不是文件对象,这是报错的核心原因。
  • 文件路径拼接错误:os.listdir(dir)返回的是目标文件夹内的文件名,直接用open(i, "rb")会在当前脚本目录找文件,而非你指定的Harmless Folder,会导致文件找不到或读取错误。
  • 代码缩进错误:for循环后的with open语句没有缩进,违反Python语法规范。
  • 解密逻辑顺序颠倒:你先调用decrypt再读取文件内容,正确顺序是先读取加密文件的字节内容,再执行解密操作。

修正后的代码

from cryptography.fernet import Fernet
import os

# 读取密钥文件
with open("mykey.key", "rb") as file:
    key0 = file.read()
key = Fernet(key0)

# 目标文件夹路径(加r用原始字符串避免转义问题)
target_dir = r"C:\Users\botta\Desktop\Harmless Folder"

# 遍历目标文件夹内的文件
for filename in os.listdir(target_dir):
    # 拼接完整文件路径
    file_path = os.path.join(target_dir, filename)
    # 只处理文件,跳过子文件夹
    if os.path.isfile(file_path):
        with open(file_path, "rb") as f:
            # 先读取加密的字节内容
            encrypted_data = f.read()
            # 执行解密
            decrypted_data = key.decrypt(encrypted_data)
            # 打印解密后的文本内容(仅适用于文本类加密文件)
            print(decrypted_data.decode())
            # 可选:将解密内容保存为新文件(取消注释即可)
            # with open(os.path.join(target_dir, f"decrypted_{filename}"), "wb") as out_f:
            #     out_f.write(decrypted_data)

额外说明

  • 路径前加r是为了避免\U这类转义字符触发错误。
  • 加入os.path.isfile(file_path)判断,防止遍历到子文件夹时抛出异常。
  • 如果需要保存解密后的文件,可以取消注释最后两行代码,按需调整输出文件名规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:32:45