Trouvé sur pypi.python.org, le Python Package Index.
Ce module calcule de grand nombres premiers, en vue d'un chiffrement/déchiffrement, d'une signature et d'une vérification par méthode RSA. Il permet aussi la génération de clé publiques et privées.
On rappelle la méthode : soit $p,q$ deux grands nombres premiers, de produit $N=pq$, et d,e deux entiers tels que $de = k(p-1)(q-1) % N$.
Alors pour tout nombre $x$ (donc tout texte), on a $\left(x^e\right)^d = x % N$.
Avant toutes choses...
>>> import rsa
>>> rsa.gen_keys(50)
>>> (publique,privee)=rsa.gen_pubpriv_keys(64)
{'e': 3926465531L, 'n': 20965207183557945172501062515951419847L}
>>> privee
{'q': 2680421942966712071L, 'p': 7821607056519425857L, 'd': 2906577419456908926296958718178414771L}
A chaque fois, donc, le résultat est un dictionnaire.
Pour chiffrer et déchiffrer :
>>> cryptogramme = rsa.encrypt('toto',publique)
>>> cryptogramme
'eJwFwakRACAQA0BPJSiGS+4hPdAEHkH/it1+n7Vt1CogPAjBUxUuKnOSXknVmobdzvgBdQpI'
>>> rsa.decrypt(cryptogramme,privee)
'toto'
Pour signer un message avec sa clé privée :
>>> signature = rsa.sign('toto',privee)
'eJzTyCkw5PIxNzAzM7E0tjQ0MDezNDMwMDQytbCwNDI3MTU1NzS0MLU0NDEz9eFK1AMA9rwKEQ=='
Et pour vérifier :
>>> rsa.verify(signature,publique) 'toto'
Et si on modifie un poil la signature...
>>> signature = 'f'+signature[1:]
>>> signature
'fJzTyCkw5PIxNzAzM7E0tjQ0MDezNDMwMDQytbCwNDI3MTU1NzS0MLU0NDEz9eFK1AMA9rwKEQ=='
>>> rsa.verify(signature,ee)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/site-packages/PIL/__init__.py", line 440, in verify
File "/usr/lib/python2.5/site-packages/PIL/__init__.py", line 414, in gluechops
File "/usr/lib/python2.5/site-packages/PIL/__init__.py", line 377, in unpicklechops
zlib.error: Error -3 while decompressing data: incorrect header check