Skip to content

Commit 63a81ff

Browse files
authored
Add/integration cha cha20 dans detecteur crypto (#22)
* fix: Robustesse de la vérification de déchiffrement & création de la méthode privée tenter_dechiffrment_par_dictionnaire pour éviter la répétition de la logique de code (DRY) * fix: correction des appels à dicoEn, remplacement par paramètre chemin_dictionnaire dans les méthodes concernées * fix: typage manquant dans l'orchestrateur * add: Intégration de ChaCha20Analyzer dans DetecteurCryptoOrchestrateur.
1 parent dffe168 commit 63a81ff

1 file changed

Lines changed: 43 additions & 42 deletions

File tree

src/detecteur_crypto.py

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
# Import des modules
22
import os
33
import time
4-
from typing import List
4+
from typing import List, Union
55

66
# Import des modules d'analyse
77
from .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

916
class 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"\nTENTATIVE 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

Comments
 (0)