Partage de mon projet de chiffrement, déchiffrement AES en Python

a marqué ce sujet comme résolu.

Bonjour,

Je viens de déposer mon premier projet sur github, il s’agit simplement d’un programme en python pour chiffrer et déchiffrer des fichiers avec le chiffrement AES. J’ai programmé le chiffrement AES et j’ai aussi programmé une interface utilisateur avec tkinter.

Voici le lien

J’espère qu’il pourra aider des gens qui souhaitent programmer eux même le chiffrement AES mais qui sont bloqués sur une étape ou simplement des gens qui souhaitent chiffrer des fichiers avec :) .

Je serai heureux de savoir ce que vous pensez de mon travail ainsi que toutes les choses que je pourrais améliorer :)

+2 -0

Salut !

C’est un projet intéressant ;)

J’ai deux remarques/questions :

  • est-ce que tu vas implémenter d’autres modes que ECB ? Un contrôle d’intégrité aussi ?
  • ton padding (ajouter des 0) n’est pas valide : tu ne peux pas en toute généralité savoir si le 0 appartient au fichier original ou au padding (sauf si j’ai raté la partie où tu encodes la longueur originale ^^).
  • dans la partie déchiffrement il y a une partie où le ciphertext n’a pas une taille nulle modulo 16, je ne comprends pas pourquoi tu ajoutes des 0 (je soupçonne un reste de copier-coller)

Bon courage en tout cas, c’est toujours ardu les implémentations de crypto ;)

Bonjour,

Fonctionnel et l’interface simple/efficace. Je n’ai pas regardé le code code (à peine survolé) - j’ai plutôt testé.

Quelques axes d’améliorations :

  • Ajouter dans le README qu’il faut penser à installer python3 et python3-tk avant de l’utiliser.
  • Un bouton explicite "Chiffrer" (et "Déchiffrer" à l’inverse) ne serait pas du luxe.
  • Une vérification des paramètres d’entrées ça serait beaucoup mieux qu’indiquer : Please be careful not to add more than one space between each byte of the key. There should be no space before the first byte or after the last byte.. De même qu’il est plus accessible d’avoir une version hexa condensé de la clé qu’une suite numérique.
  • Même chose à la compression, obtenir un condensé en hexa. L’extension CSV me paraît un peu foireuse étant donné que le but n’est pas de l’ouvrir dans un excel ou d’afficher un tableau de données avec.
  • A noter que l’export est réalisé dans le répertoire dans lequel on se trouve. Ce serait bien de pouvoir changer d’emplacement en cours de route.
  • Améliorer le franglais :p

Cool en tout cas, bonne continuation !

Salut !

C’est un projet intéressant ;)

J’ai deux remarques/questions :

  • est-ce que tu vas implémenter d’autres modes que ECB ? Un contrôle d’intégrité aussi ?
  • ton padding (ajouter des 0) n’est pas valide : tu ne peux pas en toute généralité savoir si le 0 appartient au fichier original ou au padding (sauf si j’ai raté la partie où tu encodes la longueur originale ^^).
  • dans la partie déchiffrement il y a une partie où le ciphertext n’a pas une taille nulle modulo 16, je ne comprends pas pourquoi tu ajoutes des 0 (je soupçonne un reste de copier-coller)

Bon courage en tout cas, c’est toujours ardu les implémentations de crypto ;)

Fantasio

Salut :)

Je ne l’avais pas prévu au début mais peut être qu’un jour je rajouterai un mode CBC en plus du EBC. Merci pour la remarque concernant le padding, je suis en train de corriger le problème, j’ai rajouté une variable qui compte le nombre de 0 que j’ai rajouté à la fin du fichier et je les supprime avant de retourner la liste.

Du coup effectivement dans la partie déchiffrement, la partie qui rajoutait des 0 était due à un reste de copier coller mais comme j’ai modifié ma fonction de chiffrement pour retourner un fichier sans 0 rajouté à la fin, je l’ai finalement gardé car maintenant je peux avoir le cas d’une liste qui n’a pas une taille non nulle modulo 16 ^^

Merci beaucoup d’avoir pris le temps de regarder mon code, je vais prendre en compte tes conseils afin d’améliorer mon projet :)

Bonjour,

Fonctionnel et l’interface simple/efficace. Je n’ai pas regardé le code code (à peine survolé) - j’ai plutôt testé.

Quelques axes d’améliorations :

  • Ajouter dans le README qu’il faut penser à installer python3 et python3-tk avant de l’utiliser.
  • Un bouton explicite "Chiffrer" (et "Déchiffrer" à l’inverse) ne serait pas du luxe.
  • Une vérification des paramètres d’entrées ça serait beaucoup mieux qu’indiquer : Please be careful not to add more than one space between each byte of the key. There should be no space before the first byte or after the last byte.. De même qu’il est plus accessible d’avoir une version hexa condensé de la clé qu’une suite numérique.
  • Même chose à la compression, obtenir un condensé en hexa. L’extension CSV me paraît un peu foireuse étant donné que le but n’est pas de l’ouvrir dans un excel ou d’afficher un tableau de données avec.
  • A noter que l’export est réalisé dans le répertoire dans lequel on se trouve. Ce serait bien de pouvoir changer d’emplacement en cours de route.
  • Améliorer le franglais :p

Cool en tout cas, bonne continuation !

Yarflam

Bonjour,

Merci pour ton retour, je vais préciser dans mon fichier readme de penser à installer python3 et python3-tk, je vais aussi rajouter les boutons chiffrer et déchiffrer dans l’interface utilisateur.

Je vais aussi retravailler la lecture du fichier clé, pour l’instant mon programme ouvre simplement une fenêtre indiquant que la taille de la clé n’est pas bonne, je vais essayer d’améliorer ça et de pouvoir lire des clés en héxa qui sont condensés.

Je vais aussi essayer de chiffrer dans un fichier condensé en hexa, j’avais opté pour le format csv parceque c’était plus facile de travailler avec des chiffres dans ce format ^^

Désolé pour le franglais ^^ , j’ai corrigé quelques fautes d’ortographe dans le readme et je vais essayer de trouver du temps pour passer les commentaires en anglais aussi.

Encore une fois, merci beaucoup à tous les deux pour vos retours je vais appliquer tous les conseils que vous m’avez fourni afin d’améliorer mon travail, je posterai un petit message ici lorsque ce sera fait :)

+1 -0

Bonjour,

J’ai mis à jour mon projet selon vos recommandations:

J’ai ajouté

-Un padding PKCS#7
-La suppression du padding dans le fichier déchiffrement
-Un bouton chiffrer et un bouton déchiffrer
-Une sécurité de la taille de la clé, l'entrée dans le fichier d'une clé trop grande n’entraîne pas de crash du programme car le programme lit seulement les 32 premiers octets
-Une clé condensé en hexa a rentrer dans le fichier au lieu d'une clé en décimal et dont les octets étaient séparés par des espaces
-Le chiffrement dans un fichier binaire au lieu d'un fichier csv
-Le choix du dossier d'enregistrement du fichier chiffré 

Dans le futur j’ajouterai de nouveaux chiffrement par blocs en plus du chiffrement ecb et un contrôle d’intégrité

Je n’ai pas non plus encore ajouté qu’il faut penser à installer python3 et python3-tk dans le readme, je vais le rajouter en dessous de la version de python et de numpy que j’ai utilisé. Pour rappel voici le lien de mon projet

Merci encore pour vos conseils, j’espère que ce projet pourra être utile à quelqu’un :)

+1 -0

Salut,

C’est bien de s’attarder à faire des algos de crypto, c’est sympa. :) J’ai lu ton code et j’ai quelques remarques (pas sur la partie affichage, ça ne m’intéresse pas).

  • Il n’y a pas vraiment de cohérence dans les nommages, il faut harmoniser ! Soit tout en minuscule, snake case, soit autre chose. Le nommage des fonctions aussi n’est pas vraiment cohérent,
  • Je ne comprends pas pourquoi ton algo prend des types différents, string, liste de int ou bytes. Il devrait prendre un tableau/liste de bytes, pas autre chose et la conversion vers ce type devrait être faite dans la fonction appelante,
  • Le padding devrait être sorti dans une fonction qui prend en paramètre le type de padding, ça te permettra de pouvoir faire évoluer cette partie là facilement et de de rendre ton code plus clair, (accessoirement le choix du padding n’est pas top, tu peux faire du padding oracle attack)
  • Pourquoi se limiter à des clés de 128bits ? tu as la base, étendre à 192bits est très simple, 256bits demande juste de modifier ta fonction de key expansion (et le nombre de tours dans les 2 cas),
  • Ta fonction CF_Mult2 peut être simplifiée : (((operation « 1) & 0xff) ^ 0x1B)
  • Tu pourrais rajouter des fonctions CF_Mult4 et CF_Mult8 pour éviter de faire du copier coller dans les autres CF_Multx,
  • Je ne comprends pas pourquoi tu transformes les Matrices en tableaux à 2 dimensions, tu peux simplement garder le tableau tel quel. D’ailleurs, pourquoi utiliser np pour créer les tableau ? Les tableau sont statiques et de taille fixe, ça n’apporte pas grand chose (rien ?),
  • Dans ta key expansion, tu pourrais rajouter les 2 fonctions définies dans le standard pour rendre ton implémentation plus claire : RotWord et SubWord. Le nommage des variables est à revoir (key2 ? kesako ?),
  • Je ne suis pas expert python, mais à quoi sert le tuple dans MixColumn ? Je pense que tu veux juste faire une copie de ton state. Le nommage de la variable a est à revoir,
  • Les commentaires sont inutiles. Un commentaire est utile si il apporte quelque chose, commenter le nom de la fonction n’a aucun intérêt.
  • Mixer français et anglais, c’est moche,

Je vais m’arrêter là, c’est déjà pas mal. ^^

Je pense que tu te perds dans les types que tu utilises, ça fait des acrobaties partout (string, int, byte, bytearray, etc.). Il faut que tu harmonises ça absolument.

Pourquoi ne pas créer un objet directement ? Tu pourrais gérer la clé, le chiffrement et le déchiffrement plus facilement.

Je ne sais pas si tu l’avais ou si tu as pris des tutos ou je ne sais quoi sur internet, mais la base c’est ça : https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf

Pour valider ton implémentation il existe ce qu’on appelle des «test vectors». Le NIST en fourni pour l’AES avec différentes clés et différentes payloads (google: aes test vectors)

Désolé, beaucoup de texte. :) Bravo et bon courage pour continuer !

Salut, Je suis désolé pour le temps que j’ai mis à te répondre mais je n’avais pas vu ton message. Tout d’abord, merci beaucoup d’avoir pris le temps de lire mon code et pour tout tes conseils, je vais modifier mon code en conséquence. Merci aussi pour les conseils pour valider mon implémentation :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte