Python使用Fernet加密报list无encrypt属性错误及扩展名咨询
报错原因与修复方案
运行抛出AttributeError: 'list' object has no attribute 'encrypt'是代码里三个逻辑错误叠加导致的:
- 调用
g.readlines()会把文件内容按行拆成列表返回,不是可直接加密的字符串/字节串,列表类型本身不存在encrypt方法。 - 加密方法是
Fernet实例(也就是你代码里的fernet对象)的方法,需要把待加密内容作为参数传入fernet.encrypt(),不是对着读取到的内容调用encrypt()。 - Fernet加密仅接受字节(bytes)类型入参,同时加密后输出的也是字节内容,读写这类内容必须用二进制文件模式打开,否则会触发类型错误;你当前直接把生成的key转成字符串写入文件,后续解密读取key时会出现格式不匹配问题。
修正后的可运行代码如下:
from cryptography.fernet import Fernet # 以二进制模式读取待加密文件,直接获取完整字节内容 with open("ygr.data", "rb") as g: message = g.read() key = Fernet.generate_key() fernet = Fernet(key) # 以二进制模式写入密钥文件,不要转字符串 with open("key.keysbois", "wb") as h: h.write(key) # 调用fernet实例的encrypt方法传入待加密字节内容完成加密 encMessage = fernet.encrypt(message) # 以二进制模式写入加密后的文件 with open("totallysecrettext.rushe", "wb") as f: f.write(encMessage)
自定义文件扩展名可行性说明
使用.rushe、.data、.key这类自定义文件扩展名完全可行:
- 文件扩展名本质是文件名的后缀标记,Python读写文件时不会校验后缀合法性,只要文件路径正确、打开模式匹配,不管后缀是什么都能正常读写。
- 唯一需要额外处理的场景是:如果你希望双击自定义后缀的文件时自动用指定程序打开,需要手动在操作系统层面配置文件关联,不配置的话完全不影响Python代码对文件的操作。
- 你用到的
.data、.key本身也是行业内很常用的通用自定义后缀,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者Riley Martin
相关产品推荐
相关产品推荐

