python - 在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
我错过了什么?
解决方案
尝试使用不同的格式,例如TraditionalOpenSSL
. 这对我来说是这样的。
pri_der = key.private_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption(),
)
推荐阅读
- python - 显示信息上方的所有日志,但保存到调试上方的所有日志文件
- c# - 如何使用通用 where 子句检查也具有通用类型的类类型
- php - 在 Laravel 集合中使用重复方法
- linux - 从 64 位 arch linux 为 raspberry pi `armv7-unknown-linux-gnueabihf` 编译 Rust 程序
- javascript - 有没有办法将 PaperJS 语法高亮添加到 VSCode?
- jquery - 关于 Ajax 语法和从 SQL 数据库调用数据的问题
- c++ - 从第二个值(int)获取映射中的第一个值(字符串)
- java - 如何更改与@NotNull 注解对应的响应 JSON 返回
- mrtk - 如何在 MRTK v2 中实现空间处理?
- python-3.x - 使用 DeOldify 时遇到“Torch 未启用 CUDA”