首页 > 解决方案 > 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。将密钥存储在文件中或一般情况下,我可以做些什么不同的事情?密钥需要以某种方式保存到文件中以供以后使用。在此先感谢您的任何建议。

标签: pythonencryptioncryptography

解决方案


您正在调用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())

推荐阅读