6

PyCryptoを使用して、RSAキーのパブリックおよびプライベートPEMシリアル化を生成できましたが、PyCryptoではDSAクラスにexportKey()メソッドがありません。

PyOpenSSLを試してみると、RSAおよびDSAキーのプライベートPEMシリアル化を生成できましたが、PyOpenSSLにはcrypto.dump_publickeyメソッドがありません。

RSAおよびDSAキーのPEMシリアル化を生成する方法の提案を探しています。

どうもありがとう!

PS:その間、暗号化APIのdump_privatekeyメソッドもエクスポートするようにPyOpenSSLコードを変更しました。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オプションは、バージョン(現在はゼロ)、p、q、g、それぞれ公開鍵コンポーネントと秘密鍵コンポーネントの値で構成されるASN.1SEQUENCEのASN1DERエンコード形式をASN.1INTEGERとして使用します。

これは、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 に答える