首页 > 解决方案 > 在python中将EC私钥从PEM转换为DER

问题描述

我正在尝试编写一个 Python 脚本来使用 Python 中的密码学将 EC 私钥从 PKCS8 PEM 转换为 DER 。

我以前可以像这样使用 openssl 做到这一点:

openssl pkcs8 -nocrypt -in pem_key.p8 -out der_key.der -outform der

我通过执行以下操作验证使用 OpenSSL 生成的 DER 文件是否正确:

from ecdsa import SigningKey
file = open('der_key.der', 'rb')

SigningKey.from_der(file.read())

>>> <ecdsa.keys.SigningKey at 0x112bd3630>

现在我尝试使用 Python 做同样的事情

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

pem_key_bytes = str.encode(pem_key)

key = serialization.load_pem_private_key(
    pem_key_bytes, password=None, backend=default_backend()
)

pri_der = key.private_bytes(
    encoding=serialization.Encoding.DER,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption(),
)

但是,当使用上面相同的方法在 DER 编码中测试此密钥时,我得到:

UnexpectedDER:在 DER privkey 开始时预期为“1”,得到 0

我错过了什么?

标签: pythoncryptographypublic-keyecdsa

解决方案


尝试使用不同的格式,例如TraditionalOpenSSL. 这对我来说是这样的。

pri_der = key.private_bytes(
    encoding=serialization.Encoding.DER,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption(),
)

推荐阅读