Le chiffrement RSA est un chiffrement asymétrique.
Oumar voudrait pouvoir correspondre secrètement avec Aminata , sans que Sarah ne puisse lire les messages que Aminata lui envoie. Oumar génère un jeu de deux clés de chiffrement:
- une clé publique , qu'il envoie à Aminata, et qui permettra à Aminata de chiffrer les messages qu'elle enverra à Oumar
- une clé privée, qu'il conserve précieusement pour lui, et qui lui permettra de déchiffrer les messages chiffrés par Aminata avec sa clé publique.
Oumar peut distribuer la clé publique à autant de personne qu'il le souhaite, cette clé ne sert qu'à chiffrer les messages ! Si Oumar veut pouvoir chiffrer les messages qu'il envoie à Aminata, il faut que Aminata génère un autre jeu de clés, et qu'elle lui donne sa clé publique.
sudo apt-get install python-crypto
Ou , si vous êtes sous Python 3:
sudo apt-get install python3-crypto
pip install crypto
Ou :
pip3 install crypto
Nous avons besoin que de la classe RSA du module PublicKey
from Crypto.PublicKey import RSA
key = RSA.generate(1024)
Key est un objet de la classe RSA:
>>> key
<_RSAobj @0x108b6a9e8 n(1024),e,d,p,q,u,private>
Il contient la clé privée.
La clé publique est contenue dans l'objet key.publickey()
>>> key.publickey()
<_RSAobj @0x108b385f8 n(1024),e>
Il est possible d'afficher le contenu d'un clé:
k = key.exportKey('PEM')
p = key.publickey().exportKey('PEM')
>>> k
b'-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCo0uSjLaBXkFtA3qOcrxCvSvQayM2AirDNY6JvTWEHGbn7qRey\nNL+XOY1jH9UjTORzdcIIHRtjNGBs6DKOldON8wSM1YhikGX6lqEq6S0nOy7oAFYF\nYV4xCtcMEascmXcThtMp/iHLYtE8UWYcKOG68pLLqwRJuCqKMWEiJ/P0/QIDAQAB\nAoGAczL1MSQBNb8bhbhmjJQpHnRW/a/oCr6Yxo4mWSzD+MRlVISd1syHr/llsS4X\nkm71tJO2QzMZbShgY/BOD13NbQNO5MJ/nB6P1lPXIGoxc9xthYhyXpCNqUmKp7JU\nSAHb7IVkHZpoHb/wxJiZgxPw2MG091ERAqAeAwQCjFCZ+AECQQDGWf8KhzY9JU59\n8ngnYTOEfhH0c9vLmAcwTZ1bwNQXDmrUg8GQARf1RVywVsAgheQi6V4CdskwpjYa\n2gh2yO8dAkEA2ePvmvw8Ll04k+NuVIQ/GyjPglvBs+3zIcXgTVcJF652IVDyprLt\nRJz5reTLPXWv3rIrZxu5N+txej1d6QDXYQJAH/2f3sjT/KSptjKHIoLQ1kunBbAy\nAPIyJp4+BPBixJ00qbXeYCVtAcgAHQjAz/4IP4E4Alm6NTh5fXcw6keaGQJBAKID\nI/QfvTfURO9h2nWpZ6rwK2uIgn0hXvkrwt5+6tna9SdMo0BkJpwwBE7SonRuf3id\nDjy6lnwH6vazjpJj98ECQQDDYJbZW1lQTA1VgNv5vUzg+mbFsDABgKsXVsxXWI45\nzoZSQ2w7CVapgzN72z6wZ+ICw5ITDg5PSsoKd+SBUnaF\n-----END RSA PRIVATE KEY-----'
>>>
>>>
>>> p
b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo0uSjLaBXkFtA3qOcrxCvSvQa\nyM2AirDNY6JvTWEHGbn7qReyNL+XOY1jH9UjTORzdcIIHRtjNGBs6DKOldON8wSM\n1YhikGX6lqEq6S0nOy7oAFYFYV4xCtcMEascmXcThtMp/iHLYtE8UWYcKOG68pLL\nqwRJuCqKMWEiJ/P0/QIDAQAB\n-----END PUBLIC KEY-----'
with open('private.pem','w') as kf:
kf.write(k.decode())
kf.close()
with open('public.pem','w') as pf:
pf.write(p.decode())
pf.close()
with open('private.pem','w') as kf:
kf.write(k)
kf.close()
with open('public.pem','w') as pf:
pf.write(p)
pf.close()
with open('private.pem','r') as fk:
priv = fk.read()
fk.close()
with open('public.pem','r') as fp:
pub = fp.read()
fp.close()
privat = RSA.importKey(priv)
public = RSA.importKey(pub)
On peut vérifier que les clés importées sont bien indentiques aux originales:
>>> privat == key
True
>>> public == key.publickey()
True
public_key = key.publickey()
enc_data = public_key.encrypt(b"""bonjour c'est un message secret""", 32)
On appelle enc_data dans le Shell :
>>> enc_data
(b'\x0bL\x1e\xf6\xac?\xb2\x8c>//\xc5\xbe\xe4k\x9d\x99b\x9e\xbc_\xfb\n\x9fJ\'\xe8\x8e|\x88\xb4\x9a\xcf\xb1K\xdb\x04HE\'\xe5Q\x86p\xe3E\xcbG\x98R"b\xad\x18A\x99\x1e;y\xc0\xee\xc8\xeaZ\x02s\xe3\xacM3\xd3\x02g\xd8\x11\xc2\xe9\xed\xf7[pQa\xbd\xdd\x0bb\x131\xf8\xde\xb5\xea\xa8\x08\t\xf87\xa9\xefX\xf0\xf7\x077\xad<\x13\xaa\xf9\xdb\x11*b\xbd\xfa#\x83\x8a@\xc0\x98\xf0\x9d\x16\xdb\xdbL',)
x = key.decrypt(enc_data)
x = x.decode('utf-8')
On appelle x dans le Shell:
>>> x
"bonjour c'est un message secret"
from Crypto.PublicKey import RSA
#creation d´un couple de clés
key = RSA.generate(1024)
#chiffrage
public_key = key.publickey()
enc_data = public_key.encrypt(b"""bonjour c'est un message secret""", 32)
#dechiffrage
x = key.decrypt(enc_data)
x = x.decode('utf-8')
#afficher ses clés:
k = key.exportKey('PEM')
p = key.publickey().exportKey('PEM')
#sauvegarder ses clés dans des fichiers:
with open('private.pem','w') as kf:
kf.write(k.decode())
kf.close()
with open('public.pem','w') as pf:
pf.write(p.decode())
pf.close()
#importer des clés à partir d'un fichier
with open('private.pem','r') as fk:
priv = fk.read()
fk.close()
with open('public.pem','r') as fp:
pub = fp.read()
fp.close()
privat = RSA.importKey(priv)
public = RSA.importKey(pub)
Merci pour votre article. J'essaye votre code, j'ai installé crypto avec pip, je n'arrive pas à importer RSA. Même en espectant la minuscule de crypto, ça donne ça : donne ça : No module named 'crypto.PublicKey'. J'ai essayé avec une minuscule à publicKey, mais non. J'ai aussi essayé d'importer tout, mais pas de RSA.