2011-05-09 7 views
6

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

Trying PyOpenSSL Мне удалось создать приватную сериализацию PEM для RSA и DSA-ключей, bu не существует метода crypto.dump_publickey в PyOpenSSL.

Я ищу предложение о том, как сгенерировать сериализацию 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 из Conch предоставляет метод toString для сериализации строк.

ответ

2

Это не ясно, что вы делаете это, но если все, что вы хотите, это OpenSSL-совместимый DSA закрытый ключ, вы должны просто следовать OpenSSL dsa(1) manual page:

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

Благодарит за Ваш ценный пример. Я просто хочу сгенерировать пары ключей из Python, чтобы их можно было использовать с OpenSSH. Я заботился о ключевой части. Для открытого ключа я думаю, что мне нужен ** SubjectPublicKeyInfo **, так как это то, что я читаю с man-страницы. Когда используется с открытым ключом, он использует структуру SubjectPublicKeyInfo: это ошибка, если ключ не является DSA. 'Еще раз спасибо! –

+0

Я нашел формат открытого ключа в файле Twisted: http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/conch/ssh/keys.py#L93 –

+0

В этом случае может вам следует ознакомиться с источниками [paramiko] (http://www.lag.net/paramiko/). – abbot

Смежные вопросы