Я искал по всему inte rnet модули, которые позволили бы мне кодировать / декодировать в формат DER, но все, что я видел, это то, что вам нужны существующие байты в кодировке DER, затем вы загружаете его и работаете с ним и т.д. c. То, что я ищу, - это создание структуры в кодировке DER из python.
Вот классы, которые я использую для сертификата:
import asn1crypto.core as asn
class metadata(asn.Sequence):
_fields = [
("version", asn.UTF8String),
("date_created", asn.UTF8String),
("signed", asn.Boolean)
]
class subjectKey(asn.Sequence):
_fields = [
("key_type", asn.OctetString),
("key_data", asn.OctetString),
("signiture_alg", asn.OctetString),
("signiture", asn.OctetString)
]
class public_certificate(asn.Sequence):
_fields = [
("metadata", metadata),
("subject_key", subjectKey)
]
И пример генерации ключа:
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
ecPrv = ec.generate_private_key(ec.SECP521R1, default_backend())
ecPub = ecPrv.public_key()
ecPrvBytes = ecPrv.private_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
ecPubBytes = ecPub.public_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo,
)
Что я хочу сделать, это загрузить ecPubKeyBytes
и несколько других значений, таких как версия, в структуру DER. При загрузке public_certificate
я должен предоставить данные, закодированные с помощью DER, но это проблема. У меня его нет, я хочу его создать.