2011-05-16 46 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