2012-06-27 2 views
2

M2Crypto et OpenSSL CLI ne semblent pas créer la même signature numérique. Voici le code que j'utilise en Python:M2Crypto RSA.sign vs OpenSSL rsautl -sign

import M2Crypto 
rsa = M2Crypto.RSA.load_key("privkey.pem") 
open("sig_m2crypto", "w").write(rsa.sign("md5-digest", "md5")) 

Voici la ligne de commande avec OpenSSL:

echo "md5-digest" | openssl rsautl -sign -inkey privkey.pem > sig_openssl 

Avec la même entrée, le résultat de sig_m2crypto et sig_openssl sont toujours différents. L'importance serait que je ne puisse pas vérifier les signatures générées en utilisant M2Crypto avec OpenSSL et vice versa.

Y at-il quelque chose qui manque dans mon code qui les rend incompatibles?

Informations complémentaires: J'utilise M2Crypto 0.21.1 et OpenSSL sous Windows 7. 1.0.0

Répondre

5

essayez ceci:

echo -n "test" | openssl md5 -sign privkey.pem > sig_openssel 

(le -n est important pour qu'aucune nouvelle ligne supplémentaire est ajouté après la chaîne) *

et sur le côté de python:

import M2Crypto 
import hashlib 
rsa = M2Crypto.RSA.load_key("privkey.pem") 
digest = hashlib.new('md5', 'test').digest() 
open("sig_m2crypto", "w").write(rsa.sign(digest, "md5")) 

Maintenant, vous devez être identiques.

Pour voir ce qui est acutally dans le fichier de signature, vous pouvez utiliser:

openssl rsautl -inkey privkey.pem -verify -in sig_m2crypto -asn1parse 

et

openssl rsautl -inkey privkey.pem -verify -in sig_m2crypto -raw -hexdump 

La signature correcte contient des informations sur le résumé utilisé, qui ne figure pas si vous venez * edit: au moins sur linux, comme vous êtes sur windows je ne sais pas vraiment si vous en avez besoin.

+0

Cela fonctionne! Je dois aussi me rappeler d'utiliser '' wb ''quand j'ouvre un fichier dans Windows car il différencie le mode texte et le mode binaire. Bon appel sur le «-n», presque oublié. J'utilise MinGW sous Windows. – ak37