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

时间:2011-05-09 14:56:31

标签: python openssl pycrypto pyopenssl

使用PyCrypto我能够为RSA密钥生成公共和私有PEM序列化,但在PyCrypto中,DSA类没有exportKey()方法。

尝试使用PyOpenSSL我能够为RSA和DSA密钥生成私有PEM序列化,但PyOpenSSL中没有crypto.dump_publickey方法。

我正在寻找如何为RSA和DSA密钥生成PEM序列化的建议。

非常感谢!

PS:同时我更改了PyOpenSSL代码,也为crypto API导出了dump_privatekey方法。可以在https://bugs.launchpad.net/pyopenssl/+bug/780089

找到PyOpenSSL错误和补丁

我已经在使用Twisted.conch所以我通过使用PyCrypto手动生成DSA / RSA密钥然后使用此密钥初始化twisted.conch.ssh.key.Key来解决此问题。 Conch的Key类提供了一个用于字符串序列化的toString方法。

1 个答案:

答案 0 :(得分:3)

目前尚不清楚你在做什么,但如果你想要的只是一个与openssl兼容的DSA私钥,你应该只关注openssl dsa(1) manual page

  

带私钥的DER选项使用   ASN1编码形式的ASN .1   序列由值组成   版本(目前为零),p,q,g,   公共和私人关键组件   分别为ASN .1 INTEGERs。

这是一个如何以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