2010-02-10 18 views
2

Nous devons choisir entre deux régimes de signature:Comment vérifier la signature ECDSA/SHA2 S-MIME avec python?

  • RSA/SHA2 signatures S-MIME
  • ECDSA/SHA2 signatures S-MIME

Pour que notre logiciel de python a besoin pour soutenir l'un des ce régime. Actuellement, pour certaines raisons politiques, la solution ECDSA est préférée.

La solution ECDSA est-elle supportée par l'un des modules de cryptage python (M2Crypto, ...) et avez-vous un exemple pour cela?

Le support ECDSA semble très jeune, même pour openssl.

Merci à l'avance

Répondre

1

ECDSA is supported dans M2Crypto, mais il peut être désactivé facultativement. Par exemple, les systèmes basés sur Fedora sont livrés avec ECDSA désactivé dans OpenSSL et M2Crypto. M2Crypto a aussi quelques SMIME support, mais comme je ne l'ai pas beaucoup utilisé, je ne suis pas sûr que ce serait utile dans ce cas. Voir les numéros M2Crypto SMIME doc et SMIME unit tests, ainsi que ecunittests.

+1

merci beaucoup Heikki, nous allons essayer cela. Merci également pour la maintenance du paquet M2Crypto. garder le bon travail – zoobert

+0

Heikki comment changer le digest algo dans SMIME dans M2Crypto. Nous aimerions utiliser SHA256 et je n'ai pas trouvé comment le faire. Merci – zoobert

0

écliptique Curve Cryptography (ECDSA), ainsi que la RSA plus commune est prise en charge par la bibliothèque OpenSSL. Je recommande d'utiliser le pont pyOpenSSL.

+0

Merci Michael. J'ai essayé ce scénario ECDSA/SHA256 en python, j'ai vu beaucoup de problèmes dans la liste de diffusion openssl. – zoobert

0

Vous pouvez essayer d'utiliser le package ecdsa python, en utilisant python3:

pip3 install ecdsa 

Utilisation:

from ecdsa import SigningKey 
sk = SigningKey.generate() # uses NIST192p 
vk = sk.get_verifying_key() 
sig = sk.sign(b"message") 
vk.verify(sig, b"message") # True 

Pour vérifier une signature existante avec une clé publique:

from ecdsa import VerifyingKey 

message = b"message" 
public_key = '7bc9c7867cffb07d3443754ecd3d0beb6c4a2f5b0a06ea96542a1601b87892371485fda33fe28ed1c1669828a4bb2514' 
sig = '8eb2c6bcd5baf7121facfe6b733a7835d01cef3d430a05a4bcc6c5fbae37d64fb7a6f815bb96ea4f7ed8ea0ab7fd5bc9' 

vk = VerifyingKey.from_string(bytes.fromhex(public_key)) 
vk.verify(bytes.fromhex(sig), message) # True 

Le package est également compatible avec Python 2