11# Import des modules
22import os
33import time
4- from typing import List
4+ from typing import List , Union
55
66# Import des modules d'analyse
77from .analyzers .aes_cbc_analyzer import Aes_Cbc_Analyzer
8+ from .crypto_analyzer import CryptoAnalyzer
9+
10+ # Import de la classe abstraite
11+ from .analyzers .chacha20_analyzer import ChaCha20_Analyzer
12+
13+ # Import des modules utilitaries
14+ from .utils import est_dechiffre
815
916class ResultatAnalyse :
1017 """
@@ -28,13 +35,14 @@ class DetecteurCryptoOrchestrateur:
2835
2936 def __init__ (self ):
3037 """
31- Initialisation de tous les modules d'analyse disponibles (AES-CBC) pour le moment
38+ Initialisation de tous les modules d'analyse disponibles (AES-CBC pour le moment)
3239 """
33- self .analyzers = {
40+ self .analyzers : dict [ str , CryptoAnalyzer ] = {
3441 "AES-CBC" : Aes_Cbc_Analyzer (),
42+ "ChaCha20" : ChaCha20_Analyzer (),
3543 }
36- self .missions_completees = []
37- self .statistiques_globales = {
44+ self .missions_completees : list [ dict [ str , Union [ str , list [ ResultatAnalyse ], float ]]] = []
45+ self .statistiques_globales : dict [ str , Union [ int , float ]] = {
3846 "total_fichiers" : 0 ,
3947 "fichiers_dechiffres" : 0 ,
4048 "temps_total" : 0.0 ,
@@ -83,7 +91,7 @@ def analyser_fichier_specifique(self, chemin_fichier_chiffre: str) -> ResultatAn
8391 break
8492
8593 if not algorithme_detecte :
86- print ("Aucun algorithme coréctement détecté " )
94+ print ("Aucun algorithme correctement détecté " )
8795 temps_execution = time .time () - debut_analyse
8896 return ResultatAnalyse ("" , b"" , 0.0 , b"" , temps_execution , nb_tentatives )
8997
@@ -95,8 +103,24 @@ def analyser_fichier_specifique(self, chemin_fichier_chiffre: str) -> ResultatAn
95103 print (f"Erreur lors de l'analyse: { str (e )} " )
96104 temps_execution = time .time () - debut_analyse
97105 return ResultatAnalyse ("" , b"" , 0.0 , b"" , temps_execution , 0 )
106+
107+ def __tenter_dechiffrement_avec_dictionnaire (self , chemin_fichier : str , cles_candidates : list [bytes ], analyzer : CryptoAnalyzer , resultat : ResultatAnalyse ):
108+ for j , cle in enumerate (cles_candidates ):
109+ resultat .nb_tentatives += 1
110+
111+ if j % 100 == 0 : # retour visuel tous les 100 essais
112+ print (f" Tentative { j + 1 } /{ len (cles_candidates )} ..." )
113+
114+ texte_dechiffre = analyzer .dechiffrer (chemin_fichier , cle )
115+ if texte_dechiffre and est_dechiffre (texte_dechiffre .decode ('utf-8' )) and len (texte_dechiffre ) > 0 :
116+ resultat .cle = cle
117+ resultat .texte_dechiffre = texte_dechiffre
118+ print (f" Clé trouvée après { j + 1 } tentatives!" )
119+ break
120+ else :
121+ print (" Aucune clé valide trouvée" )
98122
99- def mission_complete_automatique (self , dossier_chiffres : str ) -> List [ResultatAnalyse ]:
123+ def mission_complete_automatique (self , dossier_chiffres : str , chemin_dictionnaire : str ) -> List [ResultatAnalyse ]:
100124 """
101125 MISSION COMPLÈTE AUTOMATIQUE
102126 - Analyse des 5 fichiers séquentiellement
@@ -111,7 +135,7 @@ def mission_complete_automatique(self, dossier_chiffres: str) -> List[ResultatAn
111135 """
112136
113137 debut_mission = time .time ()
114- resultats = []
138+ resultats : list [ ResultatAnalyse ] = []
115139
116140 try :
117141 # Récupération des fichiers .enc
@@ -137,25 +161,12 @@ def mission_complete_automatique(self, dossier_chiffres: str) -> List[ResultatAn
137161 print (f"\n TENTATIVE DE DÉCHIFFREMENT" )
138162
139163 analyzer = self .analyzers [resultat .algo ]
140- cles_candidates = analyzer .generer_cles_candidates ("dicoEn" )
164+ cles_candidates = analyzer .generer_cles_candidates (chemin_dictionnaire )
141165
142166 if cles_candidates :
143167 print (f"Test de { len (cles_candidates )} clés candidates..." )
144168
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" )
169+ self .__tenter_dechiffrement_avec_dictionnaire (chemin_fichier , cles_candidates , analyzer , resultat )
159170 else :
160171 print (" Aucune clé candidate générée" )
161172
@@ -183,7 +194,7 @@ def mission_complete_automatique(self, dossier_chiffres: str) -> List[ResultatAn
183194 print (f"Erreur lors de la mission complète: { str (e )} " )
184195 return []
185196
186- def attaque_dictionnaire_manuelle (self , chemin_fichier : str , algorithme_choisi : str ) -> ResultatAnalyse :
197+ def attaque_dictionnaire_manuelle (self , chemin_fichier : str , algorithme_choisi : str , chemin_dictionnaire : str ) -> ResultatAnalyse :
187198 """
188199 ATTAQUE PAR DICTIONNAIRE MANUELLE
189200 - Choix du fichier et de l'algorithme
@@ -200,49 +211,39 @@ def attaque_dictionnaire_manuelle(self, chemin_fichier: str, algorithme_choisi:
200211
201212
202213 debut_attaque = time .time ()
214+ resultat = ResultatAnalyse ("" , b"" , 0.0 , b"" , 0.0 , 0 )
203215
204216 try :
205217 if algorithme_choisi not in self .analyzers :
206218 print (f"Algorithme { algorithme_choisi } non disponible" )
207- return ResultatAnalyse ( "" , b"" , 0.0 , b"" , 0.0 , 0 )
219+ return resultat
208220
209221 analyzer = self .analyzers [algorithme_choisi ]
210222
211223 # Vérification de l'algorithme
212224 score = analyzer .identifier_algo (chemin_fichier )
225+ resultat .score_probabilite = score
226+ resultat .algo = algorithme_choisi
213227 print (f"Score de confirmation: { score :.2f} " )
214228
215229 if score < 0.3 :
216230 print ("Score de confiance faible pour cet algorithme" )
217231
218232 # Génération des clés candidates
219233 print (f"Génération des clés candidates" )
220- cles_candidates = analyzer .generer_cles_candidates ("dicoEn" )
234+ cles_candidates = analyzer .generer_cles_candidates (chemin_dictionnaire )
221235 print (f"{ len (cles_candidates )} clés candidates générées" )
222236
223237 # Attaque par dictionnaire
224238
225- cle_trouvee = b""
226- texte_dechiffre = b""
227- nb_tentatives = 0
239+ self .__tenter_dechiffrement_avec_dictionnaire (chemin_fichier , cles_candidates , analyzer , resultat )
228240
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" )
241241
242242 temps_execution = time .time () - debut_attaque
243+ resultat .temps_execution = temps_execution
243244 print (f"Temps d'exécution: { temps_execution :.2f} secondes" )
244245
245- return ResultatAnalyse ( algorithme_choisi , cle_trouvee , score , texte_dechiffre , temps_execution , nb_tentatives )
246+ return resultat
246247
247248 except Exception as e :
248249 print (f"Erreur lors de l'attaque: { str (e )} " )
0 commit comments