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

Python 如何使用公钥(x509证书)获取签名字符串(例如md5哈希),python,m2crypto,Python,M2crypto,我是一个密码新手,这个问题困扰了我两天,希望你能帮我解决 我尝试使用X509证书的私钥对md5摘要字符串进行签名。据我所知,这很好用。 现在,我尝试使用x509证书的公钥返回该字符串,但我不知道如何执行此操作 首先,我使用OpenSSL创建了一个x509证书和一个私钥文件: openssl请求-新密钥rsa:1024-节点-x509-365天-out signer.pem 下面是我尝试的示例代码: import M2Crypto import hashlib def empty_callbac

我是一个密码新手,这个问题困扰了我两天,希望你能帮我解决

我尝试使用X509证书的私钥对md5摘要字符串进行签名。据我所知,这很好用。 现在,我尝试使用x509证书的公钥返回该字符串,但我不知道如何执行此操作

首先,我使用OpenSSL创建了一个x509证书和一个私钥文件:

openssl请求-新密钥rsa:1024-节点-x509-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和OpenSSL 1.0.0d,并在Windows7上使用32位的Python27编程

亲切问候,,
法尔科

从技术上讲,你不应该“解密”签名。如果确实要解密,请执行以下操作:

cert = X509.load_cert("signer.pem")
decrypted = cert.get_pubkey().get_rsa().public_decrypt(StringSignature, 1)
但我想这不会给你你所期待的

如果要提取使用上述代码签名的消息摘要,则必须解码
解密的
中的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

从技术上讲,您不应该“解密”签名。你想干什么?如果您想验证签名,可以通过其他方式进行验证。感谢您的快速响应。我尝试编写一个Web服务器应用程序,根据文档处理签名的URL。在本文档中,他们总是提到对URL进行“签名”,但同时我认为他们的意思是对URL进行加密。所以第一个解决方案对我来说很好。谢谢