如何用公钥(x509证书)获取签名字符串(如md5哈希)

1 投票
1 回答
2749 浏览
提问于 2025-04-16 17:45

我对加密技术非常陌生,这两天一直被这个问题困扰,希望你们能帮我一下。

我尝试用一个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)呢?

我使用的是M2Crypto-0.21.1和OpenSSL 1.0.0d,编程环境是Windows7上的Python27,32位。

祝好,
Falko

1 个回答

0

从技术上讲,你不应该去“解密”这个签名。如果你真的想解密,可以这样做:

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

不过,我想这不会给你想要的结果。

如果你想提取出用上面代码签名的消息摘要,你需要解码在decrypted中的ASN.1序列。当然,你可以用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

撰写回答