Projet C Ripper
Projet en C. Professeur : M. Cousi
Description
Le projet ripper est un programme permettant de :
- Générer des condensats (mode GENERATE) à partir d'un fichier texte
- Rechercher parmi une liste de condensats dans une table de correspondance
Les fonctionnalités du programme :
- Générer une liste de condensats (Md5) à partir d'un fichier texte en clair. Le programme génèrera les résultats dans un fichier nommé "output.txt". Il n'est pas possible pour le moment de choisir le nom de ce fichier.
- Retrouver une liste de clair à partir d'un fichier en entrée. Le programme effectuera la recherche à partir du fichier généré précedemment (output.txt)
- Libération totale de la mémoire après utilisation du programme (outil utilisé : valgrind)
Algorithme utilisé pour le mode de recherche (lookup) :
Lors de la recherche, chaque élément (condensat:clair) est enregistré en mémoire dans une structure. Une structue est ensuite destiné à être stocké dans un tableau de pointeurs. Afin de répartir correctement les éléments dans le tableau, leur index est généré à l'aide de l'algorithme de Jenkins (https://en.wikipedia.org/wiki/Jenkins_hash_function). Lors d'une collision (deux elements possèdant le même index), nous stokons les éléments les uns à la suite des autres grâce à une liste chaînée.
Pour plus de détails : https://en.wikipedia.org/wiki/Hash_table
Installation
- Importer le dépôt avec la commande git clone
- Construire une image Docker à partir du Dockerfile dans le répertoire courant (notre image s'appelera "anguyen_projet_c") :
sudo docker build -t anguyen_projet_c .
- Lancer notre image et y accéder en ouvrant un terminal :
sudo docker run -i -t anguyen_projet_c bash
- Compiler ripper.c :
gcc ripper.c -o ripper -lssl -lcrypto
- Notre binaire est prêt. Voir partie Usage ci-dessous.
Usage
Pour le mode GENERATE :
- La commande est
./ripper -g [fichier_source]
(ne pas de mettre de guillemets) où[fichier_source]
est le fichier dont on souhaite générer les condendats. Ces derniers seront disponibles dans un fichier "output".txt - Un échantillon de mots en clair est placé dans le répertoire du projet (rockyou.txt)
-
Exemple :
./ripper -g rockyou.txt
Pour le mode LOOKUP :
-
La commande est :
./ripper -l [fichier_source]
(ne pas de mettre de guillemets) où[fichier_source]
est le fichier composé de condensats dont on souhaite retrouver le(s) clair(s). -
Un échantillon "file_input_demo.txt" est placé dans le répertoire du projet. Cependant, il peut avoir différent nom, il suffira ainsi de mettre le bon nom en argument
-
Le fichier sur lequel s'effectuera sera automatiquement le fichier "output.txt" généré précedemment
-
Il faut respecter le format du fichier en entrée : un condensat par ligne
-
Exemple :
./ripper -l file_input_demo.txt
Performances
Fichier utilisé : rockyou.txt (environ 14 millions de lignes)
- Mode Generate : Moins de 30 secondes
- Mode Lookup : Moins de 10 secondes (libération mémoire inclus, environ 2 secondes)
- Libération totale de la mémoire après utilisation du programme (
valgrind ./ripper -l file_input_demo.txt
)