Le chiffrement XOR est simple, réversible et bien adapté pour introduire la programmation orientée objet sur un cas concret de traitement binaire.
Réaliser une classe CrypteurXOR héritant de Crypteur pour chiffrer et déchiffrer des fichiers avec l'opération XOR.
- classes abstraites ;
- héritage et polymorphisme ;
- redéfinition de méthodes ;
- flux binaires fichiers.
- TP n°7 ;
- TP n°9 ;
- le chiffrement XOR.
On désire créer une classe CrypteurXOR déclarée dans le fichier xor.h et implémentée dans le fichier xor.cxx. Cette classe héritera de la classe abstraite Crypteur (fichiers crypteur.h et crypteur.cxx). Le diagramme de classes UML est le suivant (fstream est une classe déclarée dans <fstream> et permet de gérer les fichiers de données) :
La fonction membre chiffrer doit répondre au prototype suivant :
void chiffrer(const string fichierEntree, const string fichierSortie);
Donner en pseudolangage l'algorithme de la fonction chiffrer. Justifier le type des variables choisies.
Implémenter en C++ les classes Crypteur et CrypteurXOR.
Valider la classe en chiffrant le fichier texte.txt. Le fichier destination sera nommé texte.$$$. Éditer le fichier chiffré à l'aide d'un éditeur hexadécimal et vérifier son intégrité par rapport à l'algorithme XOR. Vérifier la fonction inverse en déchiffrant texte.$$$ en texte.ok.
Vérifier explicitement que texte.ok est identique à texte.txt.
- Compilateur GNU C++ ;
- Système d'exploitation Linux, Mac OS X ou Ms-Windows ;
- Standard recommandé : C++11 ou supérieur.
Exemple :
- entrée :
texte.txt+ clépassword; - sortie chiffrée :
texte.$$$; - sortie déchiffrée :
texte.ok.
Résultat attendu : texte.ok identique à texte.txt.
g++ -std=c++11 -Wall -Wextra -o test_xor test_xor.cxx xor.cxx crypteur.cxxcrypteur.h,crypteur.cxx;xor.h,xor.cxx;test_xor.cxx;README.md(compilation, protocole de test, preuve de réversibilité).
- Ajouter un second algorithme à l'aide d'une nouvelle classe dérivée.
- Ajouter des tests automatiques sur fichiers vides et tailles de clé variées.
- Qualité et organisation des documents rendus (codes sources, README, etc.) ;
- Exactitude chiffrement/déchiffrement ;
- Qualité de la conception objet ;
- Robustesse E/S et qualité des tests ;
- Autonomie.
