2011-05-09 107 views
6

使用PyCrypto我能夠生成公共和私人PEM系列化的RSA密鑰,但在PyCrypto的DSA類沒有exportKey()方法。如何生成PEM序列化的公共RSA/DSA密鑰

Trying PyOpenSSL我能夠爲RSA和DSA密鑰生成私有PEM序列化,但是在PyOpenSSL中沒有crypto.dump_publickey方法。

我找的如何生成RSA和DSA密鑰的PEM系列化建議。

非常感謝!

PS:同時我已經改變了PyOpenSSL代碼也導出dump_privatekey方法加密API。 PyOpenSSL漏洞和補丁可以在這裏找到:https://bugs.launchpad.net/pyopenssl/+bug/780089


我已經使用Twisted.conch所以我通過手動生成使用PyCrypto一個DSA/RSA密鑰,然後初始化twisted.conch.ssh.key解決了這個問題。使用此鍵的鍵。 Conch的Key類爲字符串序列化提供了一個toString方法。

回答

2

目前尚不清楚你在做這個東西,但是如果你想要的是一個OpenSSL兼容DSA私鑰,你應該遵循的OpenSSL dsa(1) manual page

用私鑰的DER選項使用 ASN DER編碼形式的ASN.1 作爲ASN.1 INTEGER的分別由 版本(當前爲零),p,q,g, 公鑰和私鑰組件 的值組成的SEQUENCE。

這是如何導出格式的OpenSSL /進口DSA私鑰的例子:

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一起使用。我正在關注_public key_部分。對於公鑰,我想我需要的** ** SubjectPublicKeyInfo進行,因爲這是我從男人頁面讀取'當它使用的SubjectPublicKeyInfo結構的公共密鑰使用:這是一個錯誤,如果關鍵是不要DSA。 '再次感謝! – 2011-05-11 10:58:22

+0

我發現在扭曲代碼公共密鑰格式:http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/conch/ssh/keys.py#L93 – 2011-05-11 11:12:39

+0

在這種情況下可能是你應該檢查與[paramiko](http://www.lag.net/paramiko/)來源。 – abbot 2011-05-11 11:33:07