Python Language Génération de signatures RSA à l'aide de pycrypto


Exemple

RSA peut être utilisé pour créer une signature de message. Une signature valide ne peut être générée qu'avec un accès à la clé RSA privée, mais la validation est possible avec simplement la clé publique correspondante. Aussi longtemps que l’autre partie connaît votre clé publique, elle peut vérifier le message à signer par vous et inchangé - une approche utilisée par exemple pour le courrier électronique. Actuellement, un module tiers tel que pycrypto est requis pour cette fonctionnalité.

import errno

from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5

message = b'This message is from me, I promise.'

try:
    with open('privkey.pem', 'r') as f:
        key = RSA.importKey(f.read())
except IOError as e:
    if e.errno != errno.ENOENT:
        raise
    # No private key, generate a new one. This can take a few seconds.
    key = RSA.generate(4096)
    with open('privkey.pem', 'wb') as f:
        f.write(key.exportKey('PEM'))
    with open('pubkey.pem', 'wb') as f:
        f.write(key.publickey().exportKey('PEM'))

hasher = SHA256.new(message)
signer = PKCS1_v1_5.new(key)
signature = signer.sign(hasher)

La vérification de la signature fonctionne de la même manière mais utilise la clé publique plutôt que la clé privée:

with open('pubkey.pem', 'rb') as f:
    key = RSA.importKey(f.read())
hasher = SHA256.new(message)
verifier = PKCS1_v1_5.new(key)
if verifier.verify(hasher, signature):
    print('Nice, the signature is valid!')
else:
    print('No, the message was signed with the wrong private key or modified')

Remarque : Les exemples ci-dessus utilisent l'algorithme de signature PKCS # 1 v1.5, qui est très courant. pycrypto implémente également le nouvel algorithme PSS PKCS # 1, en remplaçant PKCS1_v1_5 par PKCS1_PSS dans les exemples qui devraient fonctionner si vous souhaitez utiliser celui-ci. Actuellement, il semble y avoir peu de raisons de l'utiliser .