Skip to content

Commit dffe168

Browse files
Feature/detecteur crypto orchestrateur (#20)
* Intégration de AesCbcAnalyzer dans DetecteurCryptoOrchestrateur. * Debut de l'implementation du code dans la classe principale avec le menu * Suite de l'implementation du code dans la classe principale avec le menu * Update de l'option quitter * Revu des fonctions pour une meilleure optimisation * Ajout du guide d'utilisation --------- Co-authored-by: Eunock-web <izumishinishi7@gmail.com>
1 parent 0c76cf2 commit dffe168

3 files changed

Lines changed: 395 additions & 13 deletions

File tree

guideUtilisation.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## **Algorithmes déployés lors des mission**
2+
**AES-256** :
3+
###### 1. **Hello Word** : Ceci est un exemple veuillez suivre ce format pour la documentation de vos algorithmes
4+
5+
**Chacha20** :
6+
###### 1. **Hello Word** : Ceci est un exemple veuillez suivre ce format pour la documentation de vos algorithmes
7+
8+
**Blowfish** :
9+
###### 1. **Hello Word** : Ceci est un exemple veuillez suivre ce format pour la documentation de vos algorithmes
10+
11+
**AES-GCM** :
12+
###### 1. **Hello Word** : Ceci est un exemple veuillez suivre ce format pour la documentation de vos algorithmes
13+
14+
**Fernet** :
15+
###### 1. **Hello Word** : Ceci est un exemple veuillez suivre ce format pour la documentation de vos algorithmes

src/detecteur_crypto.py

Lines changed: 247 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,251 @@
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+
1021
class 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("\nANALYSE SÉQUENTIELLE DES FICHIERS")
126+
127+
for i, fichier in enumerate(fichiers_enc, 1):
128+
print(f"\nFICHIER {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"\nTENTATIVE 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

Comments
 (0)