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

