如何生成PEM序列化的公共RSA/DSA密钥

问题描述:

使用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方法。

目前尚不清楚你在做这个东西,但是如果你想要的是一个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