Le chiffrement symétrique consiste à utiliser une clé pour chiffrer un message et la même clé pour le déchiffrer.
Un exemple de chiffrement symétrique : le code de César.
Pour utiliser ce chiffrement, on va utiliser le module PyCrypto.
On commence par choisir un algorithme de chiffrement. Il en existe plusieurs. Nous allons utiliser l'algorithme standard AES (Advanced Encryption Standard), qui est rapide et robuste.
AES est un algorithme de chiffrement par blocs. Il traite des blocs de données de 128 bits, c’est à dire de 16 caractères. Le nombre de caractères dans notre message devra donc être un multiple de 16 !
On va combiner cet algorithme avec un mode pour traiter les données. Il en existe aussi plusieurs. Nous allons utiliser le plus courant, le mode CBC (Cipher Block Chaining).
Ce mode va crypter chaque bloc de données en fonction du bloc précédent. Nous allons donc devoir décider d'un IV (vecteur d'initialisation) pour crypter le premier bloc ! En changeant ce vecteur à chaque chiffrement, un même message ne sera pas chiffré de la même manière, ce qui permet de renforcer notre code !
Il faut ensuite choisir une clé pour chiffrer le message.
On va choisir une clé de 128 bits, soit 16 caractères.
16 caractères = 16 octets et 1 octet = 8 bits, on a donc 16*8 = 128 bits
Une fois que l'on a tous ces éléments, on peut programmer le chiffrement de notre message :
Avant d'utiliser le module, il faut l'installer ! Pour cela, télécharge ce fichier, puis ouvre un terminal dans le dossier Téléchargements (pour rappel : Shift clic droit > "ouvrir un invité de commande ici"), et tape la commande suivante :
pip install pycrypto-2.6.1-cp35-none-win32.whl
On commence par importer le module !
On peut ensuite déclarer les paramètres que l'on a vu plus haut : la clé, le mode et le vecteur d'initialisation.
On peut maintenant crypter un message !
Si on affiche notre texte chiffré, on obtient :
Attention, si notre message n'est pas un multiple de 16, on obtient cette erreur :
Et pour déchiffrer, il nous suffit de réutiliser les paramètres que l'on a défini :
Ce chiffrement implique donc que les personnes qui communiquent aient toutes les deux la même clé et le même vecteur d'initialisation.
Si un espion intercepte un message, il pourra difficilement le déchiffrer. Mais cette méthode implique qu'on échange la clé et le vecteur d'initialisation avec la personne avec qui on communique. Si un espion récupère la clé et le vecteur d'initialisation à ce moment, il n'aura aucun problème pour déchiffrer le message.
Le chiffrement asymétrique est un chiffrement plus robuste car il repose sur deux clés : une clé publique et une clé privée.
Le fonctionnement est différent du chiffrement symétrique. Cette fois-ci, n'importe quelle personne avec la clé publique peut crypter un message mais seule la personne avec la clé privée peut le décrypter.
Alice et Bob ont chacun deux clés, une privée et une publique.
Pour pouvoir communiquer, ils n'ont qu'à échanger leur clé publique qui sert à crypter un message. Si un espion intercepte l'échange de clés, il pourra seulement crypter des messages !
Pour envoyer un message à Bob, Alice crypte son message avec la clé publique de Bob. Bob pourra le décrypter avec sa clé privée ! Et inversement.
Pour utiliser ce chiffrement, on va commencer par choisir un algorithme de chiffrement asymétrique. Il en existe plusieurs. Nous allons utiliser un des plus utilisés : le chiffrement RSA.
On commence par importer le module RSA :
Si le module n'est pas installé, on peut l'installer simplement avec : pip install RSA
Il nous faut maintenant deux clés : une publique et une privée.
On va les générer avec notre module !
On va pouvoir choisir la taille de nos clés (le nombre de bits) qui détermine la taille maximum de notre message mais aussi la force de notre chiffrement.
Attention : Générer des clés prend du temps. Plus la taille de la clé sera grande, plus la génération de clés prendra du temps.
On peut générer des clés de 128, 256, 384, 512, 1024, 2048, 3072 ou 4096 bits. (Générer des clés de plus de 512 bits peut prendre plus d'une minute !)
Rappel : 1 caractère = 1 octet = 8 bits -> 512 bits = 64 caractères max
Une fois que l'on a choisi le nombre de bits de nos clés, on va les générer avec le module :
On peut maintenant s'échanger les clés publiques.
Le module nous permet de sauvegarder et importer une clé facilement. On va sauvegarder la clé au format PEM qui est utilisé pour stocker des données en cryptographie.
On sauvegarde notre clé publique pour l'envoyer avec rsa.PublicKey.save_pkcs1 :
Notre partenaire récupère la clé avec rsa.PublicKey.load_pkcs1 :
On va maintenant pouvoir crypter et décrypter des messages !
On commence par programmer notre message en UTF-8. Le module RSA n'agit que sur des bytes et non des strings, cette étape est donc importante !
Ce qui nous donne :
Le format byte commence toujours pas un 'b'. On ne peut pas le manipuler comme une string. Ici, si on essaye d'afficher le premier élément du message, on obtient un nombre entier (qui correspond à la table ASCII).
On crypte le message avec la clé publique de notre partenaire :
Pour décrypter les messages de notre partenaire, on va utiliser notre clé privée :
Pour finir, on transforme notre message en string :
Ce chiffrement est plus sécurisé mais il est assez long. En pratique on l'utilisera pour transmettre la clé d'un chiffrement symétrique !