如何用公钥(x509证书)获取签名字符串(如md5哈希)
我对加密技术非常陌生,这两天一直被这个问题困扰,希望你们能帮我一下。
我尝试用一个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