6

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

4

1 回答 1

3

目前尚不清楚您这样做是为了什么,但如果您只想要一个与 openssl 兼容的 DSA 私钥,您应该按照 openssl dsa(1) 手册页进行操作:

带有私钥的 DER 选项使用 ASN .1 序列的 ASN1 DER 编码形式,由版本(当前为零)、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
于 2011-05-11T05:59:17.090 回答