Cómo recuperar una cadena firmada (por ejemplo, hash md5) usando una clave pública (certificado x509)

Soy muy nuevo con la criptografía y me he quedado atascado durante 2 días con este problema, espero que puedan ayudarme.

Intento firmar una cadena de resumen md5 con la clave privada de un certificado X509. Por lo que puedo ver, esto funciona bien. Ahora trato de recuperar esa cadena usando la clave pública de ese certificado x509, pero no tengo idea de cómo hacerlo.

Primero creé un certificado x509 y un archivo de claves privado usando OpenSSL:

openssl req -newkey rsa: 1024 -nodes -x509 -days 365 -out signer.pem

Aquí está el código de ejemplo que probé:

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

Obtengo la clave pública con esto, pero no sé cómo usarla en ese momento.

objX509 = M2Crypto.X509.load_cert ('signer.pem') PubKey = objX509.get_pubkey ()

Solo encontré cómo verificar la cadena firmada, pero eso no es lo que necesito. ¿Existe un método para recuperar el origen md5 digest (md) utilizando signer.pem (la clave pública)?

Estoy usando M2Cyrpto-0.21.1 y OpenSSL 1.0.0d, y estoy programando con Python27, 32bit en Windows7.

saludos cordiales, Falko

preguntado el 16 de mayo de 11 a las 17:05

Técnicamente, no se supone que "descifre" la firma. ¿Que estás tratando de hacer? Si desea verificar la firma, se hace de otra forma. -

1 Respuestas

Técnicamente, no se supone que "descifre" la firma. Si realmente desea descifrarlo, haga algo como esto:

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

pero esto no te dará lo que esperas, supongo.

Si desea extraer el resumen del mensaje que se firmó con el código anterior, tendría que decodificar la secuencia ASN.1 en el decrypted. Puede hacer esto con PyCrypto, por supuesto, pero ¿para qué?

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

contestado el 17 de mayo de 11 a las 00:05

Gracias por la rápida respuesta. - Falko Schneider

Intento escribir una aplicación de servidor web que se ocupe de las URL firmadas según la documentación. En esta documentación siempre hablan de 'firmar' la URL, pero mientras tanto creo que se refieren a cifrar la URL. Entonces, la primera solución funciona bien para mí. Gracias... - Falko Schneider

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.