Как создать сериализацию PEM для открытого ключа RSA / DSA - PullRequest
6 голосов
/ 09 мая 2011

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

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

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

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

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


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

1 Ответ

3 голосов
/ 11 мая 2011

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

Используется опция DER с закрытым ключом ASN1 DER-кодированная форма ASN .1 ПОСЛЕДОВАТЕЛЬНОСТЬ, состоящая из значений версия (в настоящее время ноль), р, д, г, компоненты открытого и закрытого ключей соответственно как ASN .1 INTEGERs.

Это пример того, как экспортировать / импортировать закрытые ключи 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...