Skip to content

Commit 147af0d

Browse files
seathiel-12e-mandymouwaficbdr
authored
Feature/progress bar (#58)
* Documentation de la fonction d'entropie * Essai de fusion (1/2) * Implementation de la fonction de validation du texte déchiffrer * Récupération du main (1/2) * Mise en place des tests unitaires (1/4) * Revert "Mise en place des tests unitaires (1/4)" This reverts commit e965801. * Mise en place des tests unitaires (1/4) * Définition de la classe de gestion des rapports de ission et implémentatioon de la fonction de génération des rapport de synthèse * Implémentation de la fonction de recherche d'anciens rapports * Mise en place des tests liés à l'analyzer aes cbc * Corrections de typage et de logique * Correction du comportement à la levée de l'exception * Correction de la lgoque de test de test_exception_déchiffrer * Corection de la logique de test_verification_texte_dechiffre * fix: Utilisation de pathlib pour une gestion portable des chemins. * merge réussi * Validation des tests et corrections du rapport mission * chekpoint: Blowfish _Analyzer.identifier_algo() * add: Intiialisation de Blowfish_Analyzer et implémentation de Blowfish_Analyzer.identifier_algo() * Implémentation de Blowfish_Analyzer.filtrer_dictionnaire_par_indice() * Correction de bug * Implementer de Blowfish déchiffrer * Integration de blowfish dans le detecteur crypto * Gestion des bugs de chemin et d'import * Update gitignore * add: Fichier run_tests.py qui run tous les tests et donne le feedback * fix: Standardisation uniforme de tous les imports pour uniformité * tests aes_gcm * fix: Correction de la validation de la taille de clé dans Blowfish_Analyzer pour respecter l'intervalle de 4 à 56 bytes. * fix: Amélioration et uniformisation de la gestion des erreurs pour les différents cas. * fix: Correction des erreurs de logique * merged * test de l'analyzer Fernet * Correction de l'orchestrateur et ajustements correspondants * Lancement du système de stepping pour la progress bar * fix: Corrections mineures * Integration de la progress bar et correction correspondantes * fix des problemes * Correction du menu 1 --------- Co-authored-by: e-mandy <andymfrd02@gmail.com> Co-authored-by: Let Me Cook <badaroumouwafic@gmail.com>
1 parent 937ed47 commit 147af0d

File tree

3 files changed

+139
-11
lines changed

3 files changed

+139
-11
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Test de déchiffrement pour chaque mission avec l'analyzer correspondant.
4+
- Utilise keys/wordlist.txt pour générer les clés candidates
5+
- Tente le déchiffrement et valide le texte avec utils.verifier_texte_dechiffre
6+
- Affiche un récapitulatif des succès/échecs
7+
"""
8+
9+
import sys
10+
from pathlib import Path
11+
from typing import Dict, Tuple, Type
12+
13+
# Assurer l'import du projet
14+
sys.path.append('.')
15+
16+
from src.analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
17+
from src.analyzers.chacha20_analyzer import ChaCha20_Analyzer
18+
from src.analyzers.blowfish_analyzer import Blowfish_Analyzer
19+
from src.analyzers.aes_gcm_analyzer import Aes_Gcm_Analyzer
20+
from src.analyzers.fernet_analyzer import FernetAnalyzer
21+
from src.utils import verifier_texte_dechiffre
22+
23+
# Mapping missions -> (fichier, analyzer class)
24+
MISSIONS: Dict[str, Tuple[str, Type]] = {
25+
'AES-CBC': ('data/mission1.enc', Aes_Cbc_Analyzer),
26+
'ChaCha20': ('data/mission2.enc', ChaCha20_Analyzer),
27+
'Blowfish': ('data/mission3.enc', Blowfish_Analyzer),
28+
'AES-GCM': ('data/mission4.enc', Aes_Gcm_Analyzer),
29+
'Fernet': ('data/mission5.enc', FernetAnalyzer),
30+
}
31+
32+
WORDLIST = 'keys/wordlist.txt'
33+
34+
35+
def test_dechiffrement_missions() -> None:
36+
print('=' * 70)
37+
print('TEST DE DECHIFFREMENT PAR MISSION')
38+
print('=' * 70)
39+
40+
global_success = 0
41+
total = 0
42+
43+
# Vérification préliminaire
44+
if not Path(WORDLIST).exists():
45+
print(f"❌ Wordlist manquante: {WORDLIST}")
46+
return
47+
48+
for algo, (mission_path, AnalyzerCls) in MISSIONS.items():
49+
total += 1
50+
print(f"\n🎯 Mission: {mission_path} | Analyzer attendu: {algo}")
51+
if not Path(mission_path).exists():
52+
print(f" ❌ Fichier introuvable: {mission_path}")
53+
continue
54+
55+
analyzer = AnalyzerCls()
56+
57+
# Génération des clés
58+
try:
59+
cles = analyzer.generer_cles_candidates(WORDLIST)
60+
print(f" 🔑 Clés candidates générées: {len(cles)}")
61+
except Exception as e:
62+
print(f" 💥 Erreur génération clés: {e}")
63+
cles = []
64+
65+
if not cles:
66+
print(" ⚠️ Aucune clé candidate (le test peut échouer)")
67+
68+
# Essais de déchiffrement
69+
trouve = False
70+
meilleure_stat = 0.0
71+
meilleure_cle = None
72+
meilleur_texte = b''
73+
74+
for idx, cle in enumerate(cles):
75+
try:
76+
res = analyzer.dechiffrer(mission_path, cle)
77+
except ValueError as ve:
78+
# clés de taille invalide pour l'algo
79+
continue
80+
except FileNotFoundError:
81+
print(f" 💥 Fichier introuvable pendant le test: {mission_path}")
82+
break
83+
except Exception:
84+
# Toute autre erreur: considérer comme tentative échouée
85+
continue
86+
87+
if not res:
88+
continue
89+
90+
try:
91+
texte = res.decode('utf-8')
92+
except Exception:
93+
texte = ''
94+
95+
stats = verifier_texte_dechiffre(texte)
96+
taux = float(stats.get('taux_succes', 0.0))
97+
if taux > meilleure_stat:
98+
meilleure_stat = taux
99+
meilleure_cle = cle
100+
meilleur_texte = res
101+
102+
# Seuil de succès raisonnable
103+
if taux >= 60.0:
104+
trouve = True
105+
break
106+
107+
if trouve:
108+
global_success += 1
109+
print(f" ✅ Déchiffrement RÉUSSI | Taux succès: {meilleure_stat:.2f}%")
110+
else:
111+
# Note: AES-GCM n'a pas d'implémentation de déchiffrement -> probablement échec
112+
hint = ''
113+
if algo == 'AES-GCM':
114+
hint = " (implémentation dechiffrer() absente)"
115+
print(f" ❌ Déchiffrement ÉCHEC{hint} | Meilleur taux: {meilleure_stat:.2f}%")
116+
117+
print('\n' + '=' * 70)
118+
print(f"RÉSUMÉ: {global_success}/{total} missions déchiffrées")
119+
if global_success == total:
120+
print('🎉 Tous les déchiffrements ont réussi !')
121+
else:
122+
print('⚠️ Certains déchiffrements ont échoué. Voir détails ci-dessus.')
123+
124+
125+
if __name__ == '__main__':
126+
test_dechiffrement_missions()

src/detecteur_crypto.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,4 +418,4 @@ def attaque_dictionnaire(self,chemin_fichier_chiffrer: str, algo : str, chemin_d
418418
return "Aucune clé trouvé"
419419

420420

421-
#print(DetecteurCryptoOrchestrateur().attaque_dictionnaire("mission1.enc","AES-CBC-256"))#
421+
#print(DetecteurCryptoOrchestrateur().attaque_dictionnaire("mission1.enc","AES-CBC-256"))#

src/interface_console.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,18 @@ def menu_1(self):
9292
task=progress.add_task(f"Analyse du {fichier}", total=100)
9393
error = False
9494
data = DetecteurCryptoOrchestrateur().analyser_fichier_specifique(fichier, progress, task, error, 1)
95-
if data.algo :
96-
print(f"\n[bold]Algorithme détecté[/bold] : [yellow]{data.algo}[/yellow]")
97-
print(f"[bold]Score de probabilité[/bold] : [green]{data.score_probabilite}[/green]")
98-
message = "[bold green] Analyse terminée. ✅[/bold green]" if not error else "[bold red] Mission terminée: Analyse non concluante. ❌ [/bold red]\n"
99-
self.console.print(message)
100-
else :
101-
self.console.print("[bold yellow] Analyse terminée: Aucun algorithme détecté. ⚠️[/bold yellow]")
102-
progress.remove_task(task)
103-
104-
print(f"[bold]Temps d'éxécution[/bold] : [green]{round(data.temps_execution,4)}[/green] s")
95+
for item in data :
96+
if item.algo :
97+
print(f"\n[bold]Algorithme potencielle détecté[/bold] : [yellow]{item.algo}[/yellow]")
98+
print(f"[bold]Score de probabilité[/bold] : [green]{item.score_probabilite}[/green]")
99+
else :
100+
continue
101+
102+
progress.update(task, description="Analyse terminé et affichage des résultats✅", advance=100)
103+
time.sleep(2)
104+
105+
print(f"[bold]Temps d'éxécution[/bold] : [green]{round(data[0].temps_execution,4)}[/green] s\n")
106+
105107
esc=input("Veuillez appuyer sur la touche entrer pour retourner au menu principal")
106108
if esc=="":
107109
self.default_menu()

0 commit comments

Comments
 (0)