2011-05-16 43 views
1

我对密码学非常陌生,并且在这个问题上停留了2天,希望您能帮助我。如何使用公钥(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)?

我正在使用M2Cyrpto-0.21.1和OpenSSL 1.0.0d,并在Windows7上使用Python27,32位编程。

亲切的问候, Falko

+0

从技术上讲,你不应该“解密”签名。你想做什么?如果您想验证签名,则以其他方式完成。 – abbot 2011-05-16 20:10:28

回答

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 
+0

感谢您的快速响应。 – 2011-05-17 08:14:41

+0

我尝试编写一个基于文档处理签名URL的Webserver-App。在这个文档中他们总是说'签名'的URL,但同时我认为他们的意思是加密URL。所以第一个解决方案对我来说工作得很好谢谢... – 2011-05-17 08:24:34