Как создать сериализацию PEM для открытого ключа RSA/DSA

используя PyCrypto, я смог создать общедоступную и частную сериализацию PEM для ключа RSA, но в PyCrypto класс DSA не имеет метода exportKey ().

пытаясь PyOpenSSL я смог создать частную сериализацию PEM для ключей RSA и DSA, но нет криптографии.метод dump_publickey в PyOpenSSL.

Я ищу предложение о том, как генерировать сериализацию PEM для ключей RSA и DSA.

большое спасибо!

PS: между тем Я изменил код PyOpenSSL, чтобы также экспортировать метод dump_privatekey для crypto API. PyOpenSSL баг и патч можно найти на: https://bugs.launchpad.net/pyopenssl/+ошибка/780089


Я уже использовал Twisted.поэтому я решил эту проблему, вручную создав ключ DSA/RSA с помощью PyCrypto, а затем инициализируя twisted.раковина.тсс.ключ.Ключ с помощью этого ключа. Класс Key из Conch предоставляет метод toString для сериализации строк.

1 ответов


неясно, для чего вы это делаете, но если все, что вам нужно, это закрытый ключ DSA, совместимый с openssl, вы должны просто следовать openssl ДСА(1) страница руководства:

параметр DER с закрытым ключом использует кодированная форма ASN1 DER ASN .Один Последовательность, состоящая из значений версия (в настоящее время ноль), p, q, g, компоненты открытого и закрытого ключей соответственно как ASN .1 целое число.

Это пример того, как экспорт / импорт закрытых ключей DSA в формате openssl:

from Crypto.PublicKey import DSA
from Crypto.Util import asn1

key = DSA.generate(1024)

# export

seq = asn1.DerSequence()
seq[:] = [ 0, key.p, key.q, key.g, key.y, key.x ]

exported_key = "-----BEGIN DSA PRIVATE KEY-----\n%s-----END DSA PRIVATE KEY-----" % seq.encode().encode("base64")

print exported_key

# import

seq2 = asn1.DerSequence()
data = "\n".join(exported_key.strip().split("\n")[1:-1]).decode("base64")
seq2.decode(data)
p, q, g, y, x = seq2[1:]

key2 = DSA.construct((y, g, p, q, x))

assert key == key2