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