python - Python Cryptography,值错误:使用 EC 密钥时无法反序列化密钥数据
问题描述
我试图用这段代码实现的目标是生成椭圆曲线键并将它们存储在文件中以供稍后加载。
我按照文档中椭圆曲线部分的序列化和密钥加载部分中的说明进行操作。唯一的区别是将 private_bytes
函数生成的字节写入文件并稍后从同一文件再次加载字节的附加步骤。
我什至将从文件加载的字节与最初创建的字节进行比较,它们显示为相等。
from cryptography.hazmat.primitives.asymmetric import padding, ec
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
if __name__ == '__main__':
private_key = ec.generate_private_key(
ec.SECP384R1(), default_backend()
)
private_key_pem = private_key.private_bytes(encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
print("Loading private key from bytes")
private_key = serialization.load_pem_private_key(private_key_pem, password=None, backend=default_backend())
print("Successfully loaded key from bytes")
with open("ec_private_key", "wb") as sk:
sk.write(private_key_pem)
with open("ec_private_key", "rb") as sk:
print(sk.read() == private_key_pem)
private_key = serialization.load_pem_private_key(sk.read(), password=None, backend=default_backend())
这是我在运行上述脚本时收到的输出:
Loading private key from bytes
Successfully loaded key from bytes
True
Traceback (most recent call last):
File "/home/michaelgraf/Desktop/train-user-client/backend/test.py", line 25, in <module>
private_key = serialization.load_pem_private_key(sk.read(), password=None, backend=default_backend())
File "/home/michaelgraf/Desktop/train-user-client/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 16, in load_pem_private_key
return backend.load_pem_private_key(data, password)
File "/home/michaelgraf/Desktop/train-user-client/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1089, in load_pem_private_key
password,
File "/home/michaelgraf/Desktop/train-user-client/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1315, in _load_key
self._handle_key_loading_error()
File "/home/michaelgraf/Desktop/train-user-client/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1373, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
我正在使用 python 3.7 和密码学 2.8。将密钥存储在文件中或一般情况下,我可以做些什么不同的事情?密钥需要以某种方式保存到文件中以供以后使用。在此先感谢您的任何建议。
解决方案
您正在调用read
该文件两次。第一次按预期工作,但是当您read
在下一行中第二次调用时,由于您已到达文件末尾,它返回一个空字符串。显然,空字符串不是有效的键。
您需要确保只调用read
一次。例如,您可以将结果存储在一个变量中并使用它:
with open("ec_private_key", "rb") as sk:
data = sk.read()
print(data == private_key_pem)
private_key = serialization.load_pem_private_key(data, password=None, backend=default_backend())
推荐阅读
- python - Django request.POST 返回一个空字典
- javascript - 节点 ejs 在单击时执行脚本
- ios - >= 400 错误代码与 apple-app-site-association json 文件
- android - 使用辅助功能服务检测模拟触摸与正常触摸之间的差异
- reactjs - 如何从 react-fetching-library 模拟 useQuery?
- python - aws api:假设角色访问被拒绝
- vba - 如何捕获我对会议邀请的回复?
- javascript - 将元素的值推送到对象数组
- javascript - 模块中定义的调用函数不在 onload 范围内
- mysql - 在 sequelize 中设置一对一关联