Skip to content

Commit 8a4e204

Browse files
committed
fix des problemes
1 parent 688003d commit 8a4e204

5 files changed

Lines changed: 77 additions & 51 deletions

File tree

main.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from src.detecteur_crypto import DetecteurCryptoOrchestrateur, ResultatAnalyse
44
from src.analyzers.blowfish_analyzer import Blowfish_Analyzer
55
from src.analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
6+
from src.analyzers.chacha20_analyzer import ChaCha20_Analyzer
7+
68
from src.interface_console import consoleInterface
79
import os
810
from rich.progress import track
@@ -18,4 +20,10 @@
1820

1921
consoleInterface()
2022
# print(DetecteurCryptoOrchestrateur().mission_complete_automatique('data/', 'keys/wordlist.txt'))
21-
23+
# try:
24+
# resultat_dechiffrement: bytes = ChaCha20_Analyzer().dechiffrer("data/mission2.enc", os.urandom(32))
25+
# print(f"Résultat du déchiffrement : {resultat_dechiffrement}")
26+
# except ValueError as ve:
27+
# print(ve)
28+
# except FileNotFoundError:
29+
# print("Erreur: Le fichier 'mission2.enc' est introuvable.")

rapport_mission.txt

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

scripts/test_dechiffrement_missions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_dechiffrement_missions() -> None:
8888
continue
8989

9090
try:
91-
texte = res.decode('utf-8', errors='ignore')
91+
texte = res.decode('utf-8')
9292
except Exception:
9393
texte = ''
9494

src/detecteur_crypto.py

Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def maj_progress_bar(self, sleep_avant: float, progress: Progress, task: TaskID,
6565
progress.update(task_id=task, description=message, advance=avance)
6666
time.sleep(sleep_apres)
6767

68-
def analyser_fichier_specifique(self, chemin_fichier_chiffre: str, progress : Progress, task, error:bool, nbr_opr_mission: int) -> ResultatAnalyse:
68+
def analyser_fichier_specifique(self, chemin_fichier_chiffre: str, progress : Progress, task, error:bool, nbr_opr_mission: int) -> List[ResultatAnalyse] :
6969
"""
7070
ANALYSE D'UN FICHIER SPÉCIFIQUE
7171
- Sélection du fichier à analyser
@@ -80,6 +80,7 @@ def analyser_fichier_specifique(self, chemin_fichier_chiffre: str, progress : Pr
8080
ResultatAnalyse: résultat de l'analyse
8181
"""
8282
debut_analyse = time.time()
83+
algorithme_potenciel = []
8384
try:
8485
# Vérification de l'existence du fichier
8586
avance = (100/(self._NBR_OPERATION_ANALYSE * nbr_opr_mission))
@@ -92,15 +93,13 @@ def analyser_fichier_specifique(self, chemin_fichier_chiffre: str, progress : Pr
9293
self.maj_progress_bar(0.3, progress, task, "Fichier non trouvé ❌ (Aborting...)", ((avance * self._NBR_OPERATION_ANALYSE) - avance * 0.3), 1)
9394

9495
error = True
95-
return ResultatAnalyse("", b"", 0.0, b"", 0.0, 0)
96+
return [ResultatAnalyse("", b"", 0.0, b"", 0.0, 0)]
9697

9798
# Initialisation des variables
9899
# TODO : Mise à jour de la progress bar -> step : Initialisation des utilitaires pour l'identification (Done)
99100
self.maj_progress_bar(0.5, progress, task, "Initialisation des utilitaires pour l'identification", avance*0.2, 1)
100101

101-
algorithme_detecte = ""
102102
cle = b""
103-
score_probabilite = 0.0
104103
texte_dechiffre = b""
105104
nb_tentatives = 0
106105

@@ -125,32 +124,39 @@ def analyser_fichier_specifique(self, chemin_fichier_chiffre: str, progress : Pr
125124
cumul_progress_avance += 2 * avance_algo
126125

127126
if score >= 0.6 : # Seuil de confiance
127+
128+
algorithme_potenciel.append({
129+
'algo': nom_algo,
130+
'score': score
131+
})
132+
128133
# TODO : Mise à jour de la progress bar -> step : Détection réussie pour {algorithme} et préparation du rapport d'analyse (Done)
129-
self.maj_progress_bar(1, progress, task, f"Détection réussie pour {nom_algo} et préparation du rapport d'analyse", ((100/nbr_opr_mission) - cumul_progress_avance), 1)
134+
self.maj_progress_bar(1, progress, task, f"Elligibilité détectée pour {nom_algo}", avance_algo, 1)
130135

131-
algorithme_detecte = nom_algo
132-
score_probabilite = score
133-
break
134136
else :
135137
# TODO : Intégrer la progress bar -> step : Echec d'identification pour {algorithme} (Done)
136138
self.maj_progress_bar(1, progress, task, f"Echec d'identification pour {nom_algo}", avance_algo, 1)
137139

138140
cumul_progress_avance += avance_algo
139141

140-
if not algorithme_detecte:
142+
if not algorithme_potenciel:
141143
print("Aucun algorithme correctement détecté ")
142144
temps_execution = time.time() - debut_analyse
143-
return ResultatAnalyse("", b"", 0.0, b"", temps_execution, nb_tentatives, chemin_fichier_chiffre, 0)
145+
return [ResultatAnalyse("", b"", 0.0, b"", temps_execution, nb_tentatives, chemin_fichier_chiffre, 0)]
144146

145147
temps_execution = time.time() - debut_analyse
146148

147-
return ResultatAnalyse(algorithme_detecte, cle, score_probabilite, texte_dechiffre, temps_execution, nb_tentatives, chemin_fichier_chiffre, 0)
149+
resultat : List[ResultatAnalyse]= []
150+
for item in algorithme_potenciel:
151+
resultat.append(ResultatAnalyse(item['algo'], cle, item['score'], texte_dechiffre, temps_execution, nb_tentatives, chemin_fichier_chiffre, 0))
148152

153+
return resultat
154+
149155
except Exception as e:
150156
print(f"Erreur lors de l'analyse: {str(e)}")
151157
temps_execution = time.time() - debut_analyse
152158
error = True
153-
return ResultatAnalyse("", b"", 0.0, b"", temps_execution, 0, chemin_fichier_chiffre)
159+
return [ResultatAnalyse("", b"", 0.0, b"", temps_execution, 0, chemin_fichier_chiffre)]
154160

155161
def __tenter_dechiffrement_avec_dictionnaire(self, chemin_fichier: str, cles_candidates: list[bytes], analyzer: CryptoAnalyzer, resultat: ResultatAnalyse):
156162
"""
@@ -222,42 +228,55 @@ def mission_complete_automatique(self, dossier_chiffres: str, chemin_dictionnair
222228

223229
# Analyse du fichier
224230
error = False
225-
resultat = self.analyser_fichier_specifique(fichier, progress, task, error, self._NBR_OPERATION_MISSION)
226-
227-
# Tentative de déchiffrement si algorithme détecté
228-
if resultat.algo:
229-
# TODO: MAJ de la progress bar -> step: Amorçage de la phase de déchiffrement (Done)
230-
self.maj_progress_bar(0, progress, task, "Amorçage de la phase de déchiffrement...", (100/self._NBR_OPERATION_MISSION) * 0.5, 1)
231-
232-
analyzer = self.analyzers[resultat.algo]
233-
234-
# TODO: MAJ de la progress bar -> step: Récupération des clés candidates (Done)
235-
self.maj_progress_bar(0, progress, task, "Récupération des clés candidates...", (100/self._NBR_OPERATION_MISSION)*0.5, 1)
231+
resultats_analyse = self.analyser_fichier_specifique(fichier, progress, task, error, self._NBR_OPERATION_MISSION)
232+
cumul_avance : float = 0
236233

237-
cles_candidates = analyzer.generer_cles_candidates(chemin_dictionnaire)
238-
239-
if cles_candidates:
240-
print(f"Test de {len(cles_candidates)} clés candidates...")
241-
# TODO: MAJ de la progress bar -> step: Test de déchiffrement (Done)
242-
self.maj_progress_bar(0, progress, task, "Test de déchiffrement", (100/self._NBR_OPERATION_MISSION), 3)
243-
244-
error = self.__tenter_dechiffrement_avec_dictionnaire(chemin_fichier, cles_candidates, analyzer, resultat)
234+
print('analyzed')
235+
# Tentative de déchiffrement si algorithme détecté
236+
for resultat in resultats_analyse :
237+
if resultat.algo:
238+
avancement = (100/(self._NBR_OPERATION_MISSION * len(resultats_analyse)))
239+
# TODO: MAJ de la progress bar -> step: Amorçage de la phase de déchiffrement (Done)
240+
self.maj_progress_bar(0, progress, task, f"Amorçage de la phase de déchiffrement avec {resultat.algo}...", avancement * 0.5, 1)
241+
242+
analyzer = self.analyzers[resultat.algo]
245243

246-
else:
247-
# TODO: MAJ de la progress bar -> step: Abort et récupération des résultats d'analyse (Done)
248-
self.maj_progress_bar(0, progress, task, "Aucune clé candidate générée ❌ (Aborting ...)", (100/self._NBR_OPERATION_MISSION), 3)
249-
250-
error = True
244+
# TODO: MAJ de la progress bar -> step: Récupération des clés candidates (Done)
245+
self.maj_progress_bar(0, progress, task, f"Récupération des clés candidates pour {resultat.algo}...", avancement*0.5, 1)
251246

247+
cles_candidates = analyzer.generer_cles_candidates(chemin_dictionnaire)
248+
cumul_avance += avancement
249+
250+
if cles_candidates:
251+
print(f"Test de {len(cles_candidates)} clés candidates...")
252+
253+
# TODO: MAJ de la progress bar -> step: Test de déchiffrement (Done)
254+
self.maj_progress_bar(0, progress, task, f"Test de déchiffrement pour {resultat.algo}...", avancement * 0.5, 3)
255+
256+
error = self.__tenter_dechiffrement_avec_dictionnaire(chemin_fichier, cles_candidates, analyzer, resultat)
257+
258+
#Cas de déchiffrement réussi
259+
if not error :
260+
# TODO: MAJ de la progress bar -> step: Déchiffrement réussi pour {algorithme}
261+
self.maj_progress_bar(0.5, progress, task, f"Déchiffrement réussi pour {resultat.algo}", (100/self._NBR_OPERATION_MISSION) - cumul_avance , 2)
262+
263+
resultat_final : ResultatAnalyse = resultat
264+
break
265+
else :
266+
self.maj_progress_bar(0.5, progress, task, f"Echec de déchiffrement pour {resultat.algo} ❌", avancement * 0.5, 2)
267+
else :
268+
# TODO: MAJ de la progress bar -> step: Abort et récupération des résultats d'analyse (Done)
269+
self.maj_progress_bar(0, progress, task, "Aucune clé candidate générée ❌ (Aborting ...)", avancement, 3)
270+
error = True
252271

253-
resultats.append(resultat)
272+
resultats.append(resultat_final)
254273

255274
# retour visuel
256-
if resultat.algo:
275+
if resultat_final.algo:
257276
# TODO: MAJ de la progress bar -> step: Finalsation et retour de résultats (Done)
258-
self.maj_progress_bar(0, progress, task, "Finalisation et retour des résultats", (100/self._NBR_OPERATION_MISSION), 3)
277+
self.maj_progress_bar(0, progress, task, "Finalisation et retour des résultats", 100, 3)
259278

260-
print(f"{fichier}: {resultat.algo} (score: {resultat.score_probabilite:.2f})")
279+
print(f"{fichier}: {resultat_final.algo} (score: {resultat_final.score_probabilite:.2f})")
261280

262281
message = "[bold green] Mission terminée. ✅[/bold green]\n\n" if not error else "[bold red] Mission terminée: Déchiffrement non concluant. ❌ [/bold red]\n\n"
263282
Console().print(message)

src/utils.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import math, re, string, time
1+
import math, re, string, time, os
22
from pathlib import Path
33
from typing import Any, Dict, List, TypedDict
44
from rich.console import Console
@@ -53,7 +53,6 @@ def verifier_texte_dechiffre(texte: str) -> Dict[str, Any]:
5353
"""
5454

5555
#Statistiques sur le texte
56-
5756
stats: dict[str, Any] = {
5857
'imprimable':0,
5958
'nombre_mots':0,
@@ -70,16 +69,15 @@ def verifier_texte_dechiffre(texte: str) -> Dict[str, Any]:
7069
stats['imprimable'] = int(sum(1 for char in texte if char.isprintable()) / len(texte) * 100)
7170

7271
# Traitement du texte brut pour obtenir une séquence distincte de pseudo-mot à cette étape séparé par des espaces
73-
74-
tab='./:!\\}{_%*$£&#;,~"()[]=§|`^@?'
72+
73+
tab='.\\/:!}{_%*$£&#;,~"()[]=§|`^@?'
7574
copy=texte
7675
for lettre in tab:
7776
copy=copy.replace(lettre, ' ')
7877

7978
# Diviser par espaces et filtrer les mots vides
8079
mots = [mot.strip() for mot in copy.split(' ') if mot.strip()]
8180
stats['nombre_mots']=len(mots)
82-
8381
# Verifier que le chaque mot du texte est un mot anglais/francais
8482

8583
try:
@@ -88,11 +86,12 @@ def verifier_texte_dechiffre(texte: str) -> Dict[str, Any]:
8886
trouve=False
8987
if not mot: continue
9088

91-
first_char = mot[0].lower()
92-
89+
first_char = mot[0].lower()
90+
9391
for syl in ['Fr', 'En']:
9492

95-
chemin = Path(f"dico{syl}")/f"{first_char}.txt"
93+
chemin = Path(f"dico{syl}")/f"{first_char}.txt"
94+
if not os.path.isfile(chemin) : continue
9695
try:
9796
with open(chemin, 'r', encoding='latin-1') as f:
9897
for ligne in f:

0 commit comments

Comments
 (0)