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

Adi*_*ban 6 python openssl pyopenssl pycrypto

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

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

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

非常感谢!

PS:同时我已经更改了PyOpenSSL代码,也为crypto API导出了dump_privatekey方法.PyOpenSSL错误和补丁可以在以下网址找到:https://bugs.launchpad.net/pyopenssl/+bug/780089


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

abb*_*bot 3

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

带有私钥的 DER 选项使用 ASN1 DER 编码形式的 ASN .1 SEQUENCE,其中包含版本(当前为零)、p、q、g、公钥和私钥组件的值,分别作为 ASN .1 INTEGER。

这是如何以 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
Run Code Online (Sandbox Code Playgroud)