Как вернуть подписанную строку (например, хэш md5), используя открытый ключ (сертификат x509) - PullRequest
1 голос
/ 16 мая 2011

Я очень плохо знаком с криптографией и застрял на 2 дня с этой проблемой, надеюсь, вы мне поможете.

Я пытаюсь подписать строку дайджеста md5 закрытым ключом сертификата X509. Насколько я вижу, это прекрасно работает. Теперь я пытаюсь вернуть эту строку, используя открытый ключ этого сертификата x509, но я не знаю, как это сделать.

Сначала я создал сертификат x509 и закрытый ключевой файл, используя OpenSSL:

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 ()

Я только нашел, как проверить подписанную строку, но это не то, что мне нужно. Есть ли способ вернуть исходный дайджест md5 (md) с помощью signer.pem (открытый ключ)?

Я использую M2Cyrpto-0.21.1 и OpenSSL 1.0.0d и программирую на Python27, 32 бита на Windows7.

С уважением, Фалько

1 Ответ

0 голосов
/ 17 мая 2011

Технически, вы не должны «расшифровывать» подпись. Если вы действительно хотите расшифровать это, сделайте что-то вроде этого:

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
...