Skip to content

Commit 97432a6

Browse files
committed
Gestion des bugs de chemin et d'import
1 parent b5f9fe1 commit 97432a6

10 files changed

Lines changed: 106 additions & 44 deletions

main.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,16 @@
11
from src.detecteur_crypto import DetecteurCryptoOrchestrateur
2-
print(DetecteurCryptoOrchestrateur().analyser_fichier_specifique('data/mission1.enc'))
2+
from src.analyzers.blowfish_analyzer import Blowfish_Analyzer
3+
from src.analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
4+
from src.interface_console import consoleInterface
5+
import os
6+
# print(DetecteurCryptoOrchestrateur().analyser_fichier_specifique('data/mission1.enc'))
7+
8+
# try:
9+
# resultat_dechiffrement: bytes = Blowfish_Analyzer().dechiffrer("data/mission3.enc", Blowfish_Analyzer().generer_cles_candidates('keys/wordlist.txt')[2])
10+
# print(f"Résultat du déchiffrement : {resultat_dechiffrement.decode('utf-8')}")
11+
# except ValueError as ve:
12+
# print(ve)
13+
# except FileNotFoundError:
14+
# print("Erreur: Le fichier 'mission3.enc' est introuvable.")
15+
16+
consoleInterface()

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cffi==1.17.1
2-
cryptography==45.0.5
2+
cryptography==43.0.0
33
pycparser==2.22
44
pycryptodome==3.23.0
55
rich==14.1.0

resultat.txt

160 Bytes
Binary file not shown.

src/analyzers/aes_gcm_analyzer.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from ..crypto_analyzer import CryptoAnalyzer
1+
from crypto_analyzer import CryptoAnalyzer
22
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
33
from cryptography.hazmat.primitives import hashes
44
import re
@@ -85,4 +85,10 @@ def generer_cles_candidates(self, chemin_dictionnaire: str) -> list[bytes]:
8585
cle_derivee: bytes = kdf.derive(mot_de_passe_en_octets)
8686
clees_candidates.append(cle_derivee)
8787

88-
return clees_candidates
88+
return clees_candidates
89+
90+
def identifier_algo(self, chemin_fichier_chiffre):
91+
return super().identifier_algo(chemin_fichier_chiffre)
92+
93+
def dechiffrer(self, chemin_fichier_chiffre, cle_donnee):
94+
return super().dechiffrer(chemin_fichier_chiffre, cle_donnee)

src/analyzers/blowfish_analyzer.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import base64
2+
import os
13
from ..detecteur_crypto import CryptoAnalyzer
24
from ..utils import calculer_entropie
35
import hashlib
4-
from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
6+
import re
7+
from cryptography.hazmat.primitives.ciphers import Cipher, modes
58
from cryptography.hazmat.primitives.padding import PKCS7
9+
from cryptography.hazmat.decrepit.ciphers.algorithms import Blowfish
610
class Blowfish_Analyzer(CryptoAnalyzer):
711
'''Détermine si l'algo blowfish est utilisé, génère des clés et tente de de déchffrer un fichier chiffré en utilisant les clés générées.
812
@@ -17,7 +21,7 @@ class Blowfish_Analyzer(CryptoAnalyzer):
1721
1822
'''
1923

20-
__BLOWFISH_TAILLE_BLOC = 8
24+
__BLOWFISH_TAILLE_BLOC = 64
2125
__BLOWFISH_TAILLE_IV = 8
2226

2327
def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
@@ -132,6 +136,18 @@ def generer_cles_candidates(self, chemin_dictionnaire: str) -> list[bytes]:
132136

133137
return cles_candidates
134138

139+
def decode_base64(self, encoded_bytes, altchars=b'+/'):
140+
encoded_bytes = re.sub(
141+
rb'[^a-zA-Z0-9%s]+' %
142+
altchars, b'', encoded_bytes)
143+
144+
missing_padding_length = len(encoded_bytes) % 4
145+
146+
if missing_padding_length:
147+
encoded_bytes += b'=' * (4 - missing_padding_length)
148+
149+
return base64.b64decode(encoded_bytes, altchars)
150+
135151
def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
136152
"""
137153
Déchiffre le fichier supposé crypté par l'algorithme blowfish avec la clé donnée en respectant les critères de
@@ -146,19 +162,22 @@ def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
146162
"""
147163

148164
#La taille de clé est dans l'intervalle 32-448bits et est multiple de 8
149-
if len(cle_donnee) not in range(32, 448, 8):
165+
print(cle_donnee)
166+
if len(cle_donnee) not in range(4, 55, 8):
167+
print(len(cle_donnee))
150168
raise ValueError('Taille de clé invalide.')
151169

152170
try:
153-
154-
algorithm_blowfish = algorithms.Blowfish(cle_donnee)
171+
172+
algorithm_blowfish = Blowfish(self.decode_base64(cle_donnee))
155173
texte_chiffre = ''
156174

157-
#Récupération de l'IV et des texte chiffré das le fichier
175+
#Récupération de l'IV et du texte chiffré dans le fichier
158176
with open(chemin_fichier_chiffre, 'rb') as f:
159-
initialization_vector = f.read(self.__BLOWFISH_TAILLE_IV)
160-
texte_chiffre = f.read()
177+
donnees = f.read()
161178
f.close()
179+
initialization_vector = donnees[:self.__BLOWFISH_TAILLE_IV]
180+
texte_chiffre = donnees[self.__BLOWFISH_TAILLE_IV:]
162181

163182
#Initialisation du cipher
164183
cipher = Cipher(algorithm_blowfish, modes.CBC(initialization_vector))
@@ -178,3 +197,11 @@ def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
178197
raise
179198

180199

200+
# if __name__ == "__main__":
201+
# try:
202+
# resultat_dechiffrement: bytes = Blowfish_Analyzer().dechiffrer("CryptoForensic-Python/data/mission3.enc", os.urandom(32))
203+
# print(f"Résultat du déchiffrement : {resultat_dechiffrement.decode('utf-8')}")
204+
# except ValueError as ve:
205+
# print(ve)
206+
# except FileNotFoundError:
207+
# print("Erreur: Le fichier 'mission2.enc' est introuvable.")

src/analyzers/chacha20_analyzer.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from typing import List
99

1010
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
11-
from crypto_analyzer import CryptoAnalyzer
12-
from utils import calculer_entropie
11+
from ..crypto_analyzer import CryptoAnalyzer
12+
from ..utils import calculer_entropie
1313

1414
# Définition de la classe ChaCha20_Analyzer
1515
class ChaCha20_Analyzer(CryptoAnalyzer):
@@ -101,7 +101,10 @@ def filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> List[byt
101101
Returns:
102102
list[bytes]: La liste de tous les mots susceptibles d'être des clés adéquates.
103103
"""
104-
return []
104+
f = open('keys/wordlist.txt', 'rb')
105+
cle = f.readlines()
106+
f.close()
107+
return cle
105108

106109
def generer_cles_candidates(self, chemin_dictionnaire: str) -> List[bytes]:
107110
"""
@@ -118,6 +121,7 @@ def generer_cles_candidates(self, chemin_dictionnaire: str) -> List[bytes]:
118121
cles_candidates: List[bytes] = []
119122
for cle in donnees_fichier_filtre:
120123
cles_candidates.append(hashlib.sha256(cle).digest())
124+
print(cles_candidates)
121125
return cles_candidates
122126

123127
def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
@@ -154,7 +158,7 @@ def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
154158
# L'appel direct a été déplacé dans un bloc if __name__ == "__main__" pour de bonnes pratiques (Mouwafic)
155159
if __name__ == "__main__":
156160
try:
157-
resultat_dechiffrement: bytes = ChaCha20_Analyzer().dechiffrer("mission2.enc", os.urandom(32))
161+
resultat_dechiffrement: bytes = ChaCha20_Analyzer().dechiffrer("data/mission2.enc", os.urandom(32))
158162
print(f"Résultat du déchiffrement : {resultat_dechiffrement.decode('utf-8')}")
159163
except ValueError as ve:
160164
print(ve)

src/detecteur_crypto.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import os
33
import time
44
from typing import List, Union
5-
5+
from pathlib import Path
66
# Import des modules d'analyse
7-
from analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
8-
from crypto_analyzer import CryptoAnalyzer
9-
from analyzers.chacha20_analyzer import ChaCha20_Analyzer
10-
from analyzers.blowfish_analyzer import Blowfish_Analyzer
11-
from analyzers.aes_gcm_analyzer import Aes_Gcm_Analyzer
7+
from .analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
8+
from .crypto_analyzer import CryptoAnalyzer
9+
from .analyzers.chacha20_analyzer import ChaCha20_Analyzer
10+
from .analyzers.blowfish_analyzer import Blowfish_Analyzer
11+
from .analyzers.aes_gcm_analyzer import Aes_Gcm_Analyzer
12+
from .rapport_mission import generer_rapport_mission
1213

1314
# Import des modules utilitaries
1415
from utils import est_dechiffre
@@ -68,7 +69,7 @@ def analyser_fichier_specifique(self, chemin_fichier_chiffre: str) -> ResultatAn
6869

6970
try:
7071
# Vérification de l'existence du fichier
71-
if not os.path.exists(f"data/{chemin_fichier_chiffre}"):
72+
if not os.path.isfile(Path('data')/f"{chemin_fichier_chiffre}"):
7273
print("Erreur: Fichier non trouvé")
7374
return ResultatAnalyse("", b"", 0.0, b"", 0.0, 0)
7475

@@ -156,7 +157,7 @@ def mission_complete_automatique(self, dossier_chiffres: str, chemin_dictionnair
156157
chemin_fichier = os.path.join(dossier_chiffres, fichier)
157158

158159
# Analyse du fichier
159-
resultat = self.analyser_fichier_specifique(chemin_fichier)
160+
resultat = self.analyser_fichier_specifique(fichier)
160161

161162
# Tentative de déchiffrement si algorithme détecté
162163
if resultat.algo:
@@ -181,7 +182,7 @@ def mission_complete_automatique(self, dossier_chiffres: str, chemin_dictionnair
181182
print(f"{fichier}: Aucun algorithme détecté")
182183

183184
# Rapport de synthèse final
184-
self.generer_rapport_synthese(resultats, time.time() - debut_mission)
185+
generer_rapport_mission().generer_rapport_synthese(resultats, time.time() - debut_mission)
185186

186187
# Mise à jour des statistiques globales
187188
self.missions_completees.append({
@@ -252,4 +253,4 @@ def attaque_dictionnaire_manuelle(self, chemin_fichier: str, algorithme_choisi:
252253
temps_execution = time.time() - debut_attaque
253254
return ResultatAnalyse("", b"", 0.0, b"", temps_execution, 0)
254255

255-
print(DetecteurCryptoOrchestrateur().analyser_fichier_specifique(f"{os.path.abspath(os.curdir)}\\CryptoForensic-Python\\data\\mission2.enc"))
256+
# print(DetecteurCryptoOrchestrateur().analyser_fichier_specifique(f"{os.path.abspath(os.curdir)}\\CryptoForensic-Python\\data\\mission2.enc"))

src/interface_console.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def menu_1(self):
9494
print(f"\n[bold]Score de probabilité[/bold] : [green]{data.score_probabilite}[/green]")
9595
# print(data.texte_dechiffre)
9696
print(f"\n[bold]Temps d'éxécution[/bold] : [green]{round(data.temps_execution,4)}[/green] s")
97-
esc=input("Veuillez appuyer sur la touche entrer pour retrouner au menu principal")
97+
esc=input("Veuillez appuyer sur la touche entrer pour retourner au menu principal")
9898
if esc=="":
9999
self.default_menu()
100100
else : self.default_menu()
@@ -107,14 +107,24 @@ def menu_2(self):
107107
self.dynamiqueText("Mission complète automatique","green")
108108
self.dynamiqueText("Veuillez entrer le chemin du dossier :","white")
109109
time.sleep(0.02)
110-
# chemin_dossier = self.prompt.ask("Veuillez entrer le chemin du dossier : ")
111-
self.console.clear()
110+
111+
chemin_dossier = self.prompt.ask("Veuillez entrer le chemin du dossier : ")
112+
resultat = DetecteurCryptoOrchestrateur().mission_complete_automatique(chemin_dossier, "keys/wordlist.txt")
113+
print(line for line in resultat)
114+
# self.console.clear()
112115
self.dynamiqueText("Mission en cours...","green")
113116
time.sleep(0.02)
114-
self.console.clear()
117+
# self.console.clear()
115118
self.dynamiqueText("Mission terminée","green")
119+
120+
esc=input("Veuillez appuyer sur la touche entrer pour retourner au menu principal")
116121
time.sleep(0.02)
117-
self.default_menu()
122+
123+
if esc=="":
124+
self.default_menu()
125+
else : self.default_menu()
126+
127+
# self.default_menu()
118128

119129
def menu_3(self):
120130
self.console.clear()

src/rapport_mission.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ def recuperer_ancien_rapport(self, base_date:str)->list|str:
5656
except FileNotFoundError:
5757
print('Fichier non trouvé')
5858

59-
print(generer_rapport_mission().generer_rapport_synthese({
60-
'algorithme':'CHACHA20',
61-
'fichier': 'mission1.enc',
62-
'cle':'PK7',
63-
'tentatives':'127',
64-
'temps_execution':"368s",
65-
'taux_succes': "97%",
66-
'statut_succes':'Succès',
67-
'texte_dechiffre':'Je suis là!'
68-
}))
59+
# print(generer_rapport_mission().generer_rapport_synthese({
60+
# 'algorithme':'CHACHA20',
61+
# 'fichier': 'mission1.enc',
62+
# 'cle':'PK7',
63+
# 'tentatives':'127',
64+
# 'temps_execution':"368s",
65+
# 'taux_succes': "97%",
66+
# 'statut_succes':'Succès',
67+
# 'texte_dechiffre':'Je suis là!'
68+
# }))
6969

70-
print(generer_rapport_mission().recuperer_ancien_rapport("05/08/25")[0])
70+
# print(generer_rapport_mission().recuperer_ancien_rapport("05/08/25")[0])

src/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def est_dechiffre(texte:str) -> bool:
5555
pourcent += 30
5656

5757
# Le respect de la ponctuation, les 20% restants
58-
if stats['ponctuation'] > 50 :
58+
if stats['ponctuation_valide'] > 50 :
5959
pourcent += 20
6060

6161
return True if pourcent > 70 else False
@@ -100,7 +100,7 @@ def verifier_texte_dechiffre(texte: str) -> Dict[str, Any]:
100100
copy=texte
101101
for lettre in tab:
102102
copy=copy.replace(lettre, ' ')
103-
mots = [mot for mot in copy.strip().split(' ') if mot]
103+
mots = [mot.removesuffix('\n').removeprefix('\n') for mot in copy.strip().split(' ') if mot != '\n']
104104
stats['nombre_mots']=len(mots)
105105

106106
# Verifier que le chaque mot du texte est un mot anglais/francais

0 commit comments

Comments
 (0)