如何生成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
感谢您的宝贵例子。我只想从Python生成密钥对,以便它们可以与OpenSSH一起使用。我正在关注_public key_部分。对于公钥,我想我需要的** ** SubjectPublicKeyInfo进行,因为这是我从男人页面读取'当它使用的SubjectPublicKeyInfo结构的公共密钥使用:这是一个错误,如果关键是不要DSA。 '再次感谢! – 2011-05-11 10:58:22
我发现在扭曲代码公共密钥格式:http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/conch/ssh/keys.py#L93 – 2011-05-11 11:12:39
在这种情况下可能是你应该检查与[paramiko](http://www.lag.net/paramiko/)来源。 – abbot 2011-05-11 11:33:07