使用PyCrypto,我能够为RSA密钥生成公共和私有PEM序列化,但在PyCrypto中,DSA类没有exportKey()方法。
尝试PyOpenSSL时,我能够为RSA和DSA密钥生成私有PEM序列化,但是PyOpenSSL中没有crypto.dump_publickey方法。
我正在寻找有关如何为 RSA 和 DSA 密钥生成 PEM 序列化的建议。
非常感谢!
PS:同时我更改了 PyOpenSSL 代码,以导出加密 API 的dump_privatekey方法。PyOpenSSL错误和补丁可以在以下位置找到:https://bugs.launchpad.net/pyopenssl/+bug/780089
我已经在使用 Twisted.conch,所以我通过使用 PyCrypto 手动生成 DSA/RSA 密钥,然后使用此密钥初始化 twisted.conch.ssh.key.Key 来解决这个问题。Conch 中的 Key 类为字符串序列化提供了一个 toString 方法。
目前还不清楚你这样做是为了什么,但是如果你想要的只是一个与openssl兼容的DSA私钥,你应该按照openssl dsa(1)手册页进行操作:
带有私钥的 DER 选项使用 ASN1 的 DER 编码形式 .1 由以下值组成的序列 版本(当前为零)、p、q、g、 公钥和私钥组件 分别作为 ASN .1 整数。
以下是如何以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