2011-05-09 7 views
6

Utilisation de PyCrypto J'ai pu générer la sérialisation PEM publique et privée pour une clé RSA, mais dans PyCrypto la classe DSA n'a pas de méthode exportKey().Comment générer la sérialisation PEM pour la clé publique RSA/DSA

Essayer PyOpenSSL J'ai été capable de générer la sérialisation PEM privée pour les clés RSA et DSA, car il n'y a pas de méthode crypto.dump_publickey dans PyOpenSSL.

Je suis à la recherche de suggestions sur la façon de générer la sérialisation PEM pour les clés RSA et DSA.

Merci beaucoup! PS: pendant ce temps, j'ai changé le code PyOpenSSL pour exporter également une méthode dump_privatekey pour l'API cryptographique. bug pyopenssl et le patch sont disponibles à: https://bugs.launchpad.net/pyopenssl/+bug/780089


J'utilisais déjà Twisted.conch donc je résolu ce problème en générant manuellement une clé DSA/RSA en utilisant PyCrypto et initialiser un twisted.conch.ssh.key .Key en utilisant cette clé. La classe Key de Conch fournit une méthode toString pour la sérialisation de chaîne.

Répondre

2

On ne sait pas ce que vous faites cela pour, mais si tout ce que vous voulez est une clé privée DSA OpenSSL compatible, vous devez simplement suivre OpenSSL dsa(1) manual page:

L'option DER avec une clé privée utilise une forme codée ASN1 DER d'une ASN .1 SEQUENCE constituée des valeurs de version (actuellement zéro), p, q, g, les composants de clé publique et privée respectivement ASN .1 INTEGERs.

Voici un exemple comment exporter/importer les clés privées DSA au format 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

Merci pour votre exemple précieux. Je veux juste générer les paires de clés à partir de Python afin qu'elles puissent être utilisées avec OpenSSH. Je m'occupais de la partie clé publique. Pour la clé publique, je pense que j'ai besoin de ** SubjectPublicKeyInfo ** car c'est ce que j'ai lu dans la page de manuel 'Lorsqu'elle est utilisée avec une clé publique, elle utilise une structure SubjectPublicKeyInfo: c'est une erreur si la clé n'est pas DSA. Merci encore! –

+0

J'ai trouvé le format de clé publique dans le code Twisted: http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/conch/ssh/keys.py#L93 –

+0

Dans ce cas, peut vous devriez vérifier avec [paramiko] (http://www.lag.net/paramiko/) les sources. – abbot

Questions connexes