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

Используя 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 для сериализации строк.


person Adi Roiban    schedule 09.05.2011    source источник


Ответы (1)


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

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

Это пример того, как экспортировать/импортировать закрытые ключи 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
person abbot    schedule 11.05.2011
comment
Спасибо за ваш ценный пример. Я просто хочу сгенерировать пары ключей из Python, чтобы их можно было использовать с OpenSSH. Я искал часть открытого ключа. Я думаю, что для открытого ключа мне нужна SubjectPublicKeyInfo, так как это то, что я прочитал на странице руководства When used with a public key it uses a SubjectPublicKeyInfo structure: it is an error if the key is not DSA. Еще раз спасибо! - person Adi Roiban; 11.05.2011
comment
Я нашел формат открытого ключа в коде Twisted: twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/ - person Adi Roiban; 11.05.2011
comment
В этом случае, возможно, вам следует свериться с источниками paramiko. - person abbot; 11.05.2011
comment
На данный момент Twisted.conch.ssh.key решил мою проблему. Ваш ответ не решил мою проблему напрямую, но дал мне хорошее начало и мотивацию для поиска документации :) - person Adi Roiban; 11.05.2011
comment
keyczar содержит более подробные процедуры преобразования в keyczar.util - person Hans-Christoph Steiner; 01.12.2011
comment
Для RSA используйте seq[:] = [ 0, key.n, key.e ] - person themadmax; 27.08.2018