使用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
相关产品推荐
相关产品推荐

