1- from analyzers .aes_cbc_analyzer import Aes_Cbc_Analyzer
2- from crypto_analyzer import identifier_algo
3-
4- """
5- Classe principale qui centralise tout:
6- -Lance l’analyse des fichiers et identifie l'algorithme probable,
7- -Lance les attaquespar dictionnaire,
8- -Lance et coordonnes le processus de dechiffrement
9- """
1+ # Import des modules
2+ import os
3+ import time
4+ from typing import List
5+
6+ # Import des modules d'analyse
7+ from .analyzers .aes_cbc_analyzer import Aes_Cbc_Analyzer
8+
9+ class ResultatAnalyse :
10+ """
11+ Classe représentant un résultat d'analyse.
12+ """
13+ def __init__ (self , algo : str , cle : bytes , score_probabilite : float , texte_dechiffre : bytes , temps_execution : float = 0.0 , nb_tentatives : int = 0 ):
14+ self .algo = algo
15+ self .cle = cle
16+ self .score_probabilite = score_probabilite
17+ self .texte_dechiffre = texte_dechiffre
18+ self .temps_execution = temps_execution
19+ self .nb_tentatives = nb_tentatives
20+
1021class DetecteurCryptoOrchestrateur :
1122 """
12- Initialisation de l'analyseur AES-CBC
23+ Classe principale qui centralise tout:
24+ -Lance l'analyse des fichiers et identifie l'algorithme probable,
25+ -Lance les attaques par dictionnaire,
26+ -Lance et coordonnes le processus de dechiffrement
1327 """
28+
1429 def __init__ (self ):
15- self .aes_cbc_analyzer = Aes_Cbc_Analyzer ()
30+ """
31+ Initialisation de tous les modules d'analyse disponibles (AES-CBC) pour le moment
32+ """
33+ self .analyzers = {
34+ "AES-CBC" : Aes_Cbc_Analyzer (),
35+ }
36+ self .missions_completees = []
37+ self .statistiques_globales = {
38+ "total_fichiers" : 0 ,
39+ "fichiers_dechiffres" : 0 ,
40+ "temps_total" : 0.0 ,
41+ "tentatives_total" : 0
42+ }
43+
44+ def analyser_fichier_specifique (self , chemin_fichier_chiffre : str ) -> ResultatAnalyse :
45+ """
46+ ANALYSE D'UN FICHIER SPÉCIFIQUE
47+ - Sélection du fichier à analyser
48+ - Identification automatique de l'algorithme
49+ - Affichage des scores de probabilité
50+
51+ Args:
52+ chemin_fichier_chiffre(str): chemin du fichier chiffré à analyser
53+
54+ Returns:
55+ ResultatAnalyse: résultat de l'analyse
56+ """
57+ debut_analyse = time .time ()
58+
59+ try :
60+ # Vérification de l'existence du fichier
61+ if not os .path .exists (chemin_fichier_chiffre ):
62+ print ("Erreur: Fichier non trouvé" )
63+ return ResultatAnalyse ("" , b"" , 0.0 , b"" , 0.0 , 0 )
64+
65+ # Initialisation des variables
66+ algorithme_detecte = ""
67+ cle = b""
68+ score_probabilite = 0.0
69+ texte_dechiffre = b""
70+ nb_tentatives = 0
71+
72+ # Parcours des algorithmes disponibles
73+ scores_algorithmes = {}
74+ for nom_algo , analyzer in self .analyzers .items ():
75+ score = analyzer .identifier_algo (chemin_fichier_chiffre )
76+ scores_algorithmes [nom_algo ] = score
77+ print (f"{ nom_algo } : score { score :.2f} " )
78+
79+ if score > 0.5 : # Seuil de confiance
80+ algorithme_detecte = nom_algo
81+ score_probabilite = score
82+ print (f"Algorithme détecté: { algorithme_detecte } (score: { score :.2f} )" )
83+ break
84+
85+ if not algorithme_detecte :
86+ print ("Aucun algorithme coréctement détecté " )
87+ temps_execution = time .time () - debut_analyse
88+ return ResultatAnalyse ("" , b"" , 0.0 , b"" , temps_execution , nb_tentatives )
89+
90+ temps_execution = time .time () - debut_analyse
91+
92+ return ResultatAnalyse (algorithme_detecte , cle , score_probabilite , texte_dechiffre , temps_execution , nb_tentatives )
93+
94+ except Exception as e :
95+ print (f"Erreur lors de l'analyse: { str (e )} " )
96+ temps_execution = time .time () - debut_analyse
97+ return ResultatAnalyse ("" , b"" , 0.0 , b"" , temps_execution , 0 )
98+
99+ def mission_complete_automatique (self , dossier_chiffres : str ) -> List [ResultatAnalyse ]:
100+ """
101+ MISSION COMPLÈTE AUTOMATIQUE
102+ - Analyse des 5 fichiers séquentiellement
103+ - Tentatives de déchiffrement avec retour visuel
104+ - Rapport de synthèse final
105+
106+ Args:
107+ dossier_chiffres(str): dossier contenant les fichiers chiffrés
108+
109+ Returns:
110+ list[ResultatAnalyse]: liste des résultats d'analyse
111+ """
112+
113+ debut_mission = time .time ()
114+ resultats = []
115+
116+ try :
117+ # Récupération des fichiers .enc
118+ fichiers_enc = [f for f in os .listdir (dossier_chiffres ) if f .endswith (".enc" )]
119+
120+ if not fichiers_enc :
121+ print ("Aucun fichier .enc trouvé dans le dossier" )
122+ return []
123+
124+ print (f"{ len (fichiers_enc )} fichiers .enc détectés" )
125+ print ("\n ANALYSE SÉQUENTIELLE DES FICHIERS" )
126+
127+ for i , fichier in enumerate (fichiers_enc , 1 ):
128+ print (f"\n FICHIER { i } /{ len (fichiers_enc )} : { fichier } " )
129+
130+ chemin_fichier = os .path .join (dossier_chiffres , fichier )
131+
132+ # Analyse du fichier
133+ resultat = self .analyser_fichier_specifique (chemin_fichier )
134+
135+ # Tentative de déchiffrement si algorithme détecté
136+ if resultat .algo :
137+ print (f"\n TENTATIVE DE DÉCHIFFREMENT" )
138+
139+ analyzer = self .analyzers [resultat .algo ]
140+ cles_candidates = analyzer .generer_cles_candidates ("dicoEn" )
141+
142+ if cles_candidates :
143+ print (f"Test de { len (cles_candidates )} clés candidates..." )
144+
145+ for j , cle in enumerate (cles_candidates ):
146+ resultat .nb_tentatives += 1
147+
148+ if j % 100 == 0 : # retour visuel tous les 100 essais
149+ print (f" Tentative { j + 1 } /{ len (cles_candidates )} ..." )
150+
151+ texte_dechiffre = analyzer .dechiffrer (chemin_fichier , cle )
152+ if texte_dechiffre and len (texte_dechiffre ) > 0 :
153+ resultat .cle = cle
154+ resultat .texte_dechiffre = texte_dechiffre
155+ print (f" Clé trouvée après { j + 1 } tentatives!" )
156+ break
157+ else :
158+ print (" Aucune clé valide trouvée" )
159+ else :
160+ print (" Aucune clé candidate générée" )
161+
162+ resultats .append (resultat )
163+
164+ # retour visuel
165+ if resultat .algo :
166+ print (f"{ fichier } : { resultat .algo } (score: { resultat .score_probabilite :.2f} )" )
167+ else :
168+ print (f"{ fichier } : Aucun algorithme détecté" )
169+
170+ # Rapport de synthèse final
171+ self .generer_rapport_synthese (resultats , time .time () - debut_mission )
172+
173+ # Mise à jour des statistiques globales
174+ self .missions_completees .append ({
175+ "dossier" : dossier_chiffres ,
176+ "resultats" : resultats ,
177+ "temps_total" : time .time () - debut_mission
178+ })
179+
180+ return resultats
181+
182+ except Exception as e :
183+ print (f"Erreur lors de la mission complète: { str (e )} " )
184+ return []
185+
186+ def attaque_dictionnaire_manuelle (self , chemin_fichier : str , algorithme_choisi : str ) -> ResultatAnalyse :
187+ """
188+ ATTAQUE PAR DICTIONNAIRE MANUELLE
189+ - Choix du fichier et de l'algorithme
190+ - Suivi en temps réel des tentatives
191+ - Affichage des résultats intermédiaires
192+
193+ Args:
194+ chemin_fichier(str): chemin du fichier à attaquer
195+ algorithme_choisi(str): algorithme à utiliser
196+
197+ Returns:
198+ ResultatAnalyse: résultat de l'attaque
199+ """
200+
201+
202+ debut_attaque = time .time ()
203+
204+ try :
205+ if algorithme_choisi not in self .analyzers :
206+ print (f"Algorithme { algorithme_choisi } non disponible" )
207+ return ResultatAnalyse ("" , b"" , 0.0 , b"" , 0.0 , 0 )
208+
209+ analyzer = self .analyzers [algorithme_choisi ]
210+
211+ # Vérification de l'algorithme
212+ score = analyzer .identifier_algo (chemin_fichier )
213+ print (f"Score de confirmation: { score :.2f} " )
214+
215+ if score < 0.3 :
216+ print ("Score de confiance faible pour cet algorithme" )
217+
218+ # Génération des clés candidates
219+ print (f"Génération des clés candidates" )
220+ cles_candidates = analyzer .generer_cles_candidates ("dicoEn" )
221+ print (f"{ len (cles_candidates )} clés candidates générées" )
222+
223+ # Attaque par dictionnaire
224+
225+ cle_trouvee = b""
226+ texte_dechiffre = b""
227+ nb_tentatives = 0
228+
229+ for i , cle in enumerate (cles_candidates ):
230+ nb_tentatives += 1
231+
232+ # retour visuel en temps réel
233+ if i % 50 == 0 :
234+ print (f"Tentative { i + 1 } /{ len (cles_candidates )} ... ({ (i + 1 )/ len (cles_candidates )* 100 :.1f} %)" )
235+ texte_dechiffre = analyzer .dechiffrer (chemin_fichier , cle )
236+ if texte_dechiffre and len (texte_dechiffre ) > 0 :
237+ cle_trouvee = cle
238+ break
239+ else :
240+ print (f"Aucune clé valide trouvée après { len (cles_candidates )} tentatives" )
241+
242+ temps_execution = time .time () - debut_attaque
243+ print (f"Temps d'exécution: { temps_execution :.2f} secondes" )
244+
245+ return ResultatAnalyse (algorithme_choisi , cle_trouvee , score , texte_dechiffre , temps_execution , nb_tentatives )
246+
247+ except Exception as e :
248+ print (f"Erreur lors de l'attaque: { str (e )} " )
249+ temps_execution = time .time () - debut_attaque
250+ return ResultatAnalyse ("" , b"" , 0.0 , b"" , temps_execution , 0 )
251+
0 commit comments