2011-05-09 11 views
6

Utilizzo di PyCrypto Sono stato in grado di generare la serializzazione PEM pubblica e privata per una chiave RSA, ma in PyCrypto la classe DSA non ha alcun metodo exportKey().Come generare la serializzazione PEM per la chiave pubblica RSA/DSA

Provare PyOpenSSL Sono stato in grado di generare la serializzazione PEM privata per chiavi RSA e DSA, ma non c'è alcun metodo crypto.dump_publickey in PyOpenSSL.

Sto cercando un suggerimento su come generare la serializzazione PEM per chiavi RSA e DSA.

Grazie mille!

PS: nel frattempo ho modificato il codice PyOpenSSL per esportare anche un metodo dump_privatekey per API crypto. PyOpenSSL insetto e la patch sono disponibili all'indirizzo: https://bugs.launchpad.net/pyopenssl/+bug/780089


ero già usando Twisted.conch quindi risolto questo problema generando manualmente una chiave DSA/RSA utilizzando pycrypto e poi inizializzazione di un twisted.conch.ssh.key .Key utilizzando questa chiave. La classe Key di Conch fornisce un metodo toString per la serializzazione delle stringhe.

risposta

2

Non è chiaro che cosa si sta facendo questo per, ma se quello che cercate è una chiave privata openssl-compatibile DSA, si deve solo seguire l'openssl dsa(1) manual page:

L'opzione DER con una chiave privata utilizza un modulo codificato ASN1 DER di un ASN .1 SEQUENCE costituito dai valori della versione (attualmente zero), p, q, g, i componenti della chiave pubblica e privata rispettivamente come INTEGER ASN .1.

Questo è un esempio di come esportare/importare DSA chiavi private in formato 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

Grazie per il vostro prezioso esempio. Voglio solo generare le coppie di chiavi da Python in modo che possano essere utilizzate con OpenSSH. Mi occupavo della parte _public key_. Per la chiave pubblica, penso che ho bisogno del ** SubjectPublicKeyInfo ** in quanto è ciò che ho letto dalla pagina man. 'Quando viene utilizzato con una chiave pubblica utilizza una struttura SubjectPublicKeyInfo: si tratta di un errore se la chiave non è DSA. 'Grazie ancora! –

+0

Ho trovato il formato della chiave pubblica nel codice Twisted: http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/conch/ssh/keys.py#L93 –

+0

In questo caso dovresti controllare con le fonti [paramiko] (http://www.lag.net/paramiko/). – abbot