1

私は暗号化に非常に慣れていないので、この問題で2日間立ち往生しています。あなたが私を助けてくれることを願っています。

X509証明書の秘密鍵を使用してmd5ダイジェスト文字列に署名しようとしています。私が見る限り、これは問題なく機能します。ここで、そのx509証明書の公開鍵を使用してその文字列を取り戻そうとしますが、これを行う方法がわかりません。

最初に、OpenSSLを使用してx509証明書とプライベートキーファイルを作成しました。

openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out signer.pem

これが私が試したサンプルコードです:

import M2Crypto
import hashlib

def empty_callback ():
 return

# md5 hash of params
params = "0045KIABCDEFG"

m = hashlib.md5()
m.update(params)
md = m.digest()
print m.hexdigest()

M2Crypto.Rand.rand_seed (os.urandom (1024))

# sign md5 hash with private key
SignEVP = M2Crypto.EVP.load_key ('privkey.pem')
#Begin signing
SignEVP.sign_init ()
#Tell it to sign our string
SignEVP.sign_update (md)
#Get the final result
StringSignature = SignEVP.sign_final ()
#print the final result
print StringSignature.encode ('base64')

これで公開鍵を取得しますが、その使用方法がわかりません。

objX509 = M2Crypto.X509.load_cert('signer.pem')PubKey = objX509.get_pubkey()

署名された文字列を確認する方法を見つけただけですが、それは私が必要としていることではありません。signer.pem(公開鍵)を使用して元のmd5ダイジェスト(md)を取り戻す方法はありますか?

M2Cyrpto-0.21.1とOpenSSL1.0.0dを使用しており、Windows7で32ビットのPython27を使用してプログラミングしています。

よろしく、ファルコ

4

1 に答える 1

0

技術的には、署名を「復号化」することは想定されていません。本当に復号化したい場合は、次のようにします。

cert = X509.load_cert("signer.pem")
decrypted = cert.get_pubkey().get_rsa().public_decrypt(StringSignature, 1)

しかし、これはあなたが期待しているものをあなたに与えないでしょう、私は推測します。

上記のコードを使用して署名されたメッセージダイジェストを引き出す場合は、のASN.1シーケンスをデコードする必要がありますdecrypted。もちろん、これはPyCryptoで行うことができますが、何のためにあるのでしょうか。

from Crypto.Util import asn1
seq = asn1.DerSequence()
seq.decode(decrypted)
obj = asn1.DerObject()
obj.decode(seq[1])
# now this is the original message digest that was signed
original_message_md = obj.payload
于 2011-05-16T20:21:25.750 に答える