簡體   English   中英

如何使用公共密鑰(x509證書)取回已簽名的字符串(例如md5哈希)

[英]How to get back a signed string (e.g. md5 hash) using a public-key (x509 certificate)

我對密碼技術還很陌生,並且在此問題上呆了2天,希望您能為我提供幫助。

我嘗試用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位)進行編程。

親切的問候,法爾科

從技術上講,您不應“解密”簽名。 如果您真的想解密它,請執行以下操作:

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

但是,我想這不會給您期望。

如果要提取使用上述代碼簽名的消息摘要,則必須對解密的中的ASN.1序列進行decrypted 您當然可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM