Skip to content

Commit 688003d

Browse files
committed
Merge et optimisation de l'integration de la progress bar
2 parents d9a0cf6 + 5c87591 commit 688003d

18 files changed

Lines changed: 728 additions & 349 deletions

rapport_mission.txt

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

resultat.txt

-160 Bytes
Binary file not shown.
File renamed without changes.

src/analyzers/aes_cbc_analyzer.py

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ class Aes_Cbc_Analyzer(CryptoAnalyzer):
2626

2727
def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
2828
'''
29-
Détermine la probabilité que l'algo de chiffrement utilisé soit l'aes cbc en:
29+
Estime la probabilité que le fichier soit chiffré en AES-CBC.
3030
31-
- recherchant l'IV en tête
32-
- vérifiant si le reste du fichier en dehors de l'IV a une taille multiple de 16 octets
33-
- déterminant si l'entropie est assez élevée dans le fichier chiffré (>7.5)
31+
Principes:
32+
- IV attendu en début de fichier (16 octets), suivi des données chiffrées.
33+
- En CBC, le corps (hors IV) est multiple de 16 octets (padding par blocs).
34+
- L'entropie élevée est un indicateur secondaire (faible poids).
35+
- On pénalise un motif typique AES-GCM (nonce 12B + tag 16B + corps non multiple de 16).
3436
3537
Args:
3638
chemin_fichier_chiffre(str): Le chemin du fichier chiffré à traiter (mission1.enc).
@@ -42,27 +44,48 @@ def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
4244
try:
4345
with open(chemin_fichier_chiffre, "rb") as f:
4446
contenu_fichier = f.read()
45-
46-
if len(contenu_fichier) < 16: #Heuristique IV probable en début de fichier (Vérifie si le fichier est assez grand pour contenir déjà l'IV)
47+
48+
# Garde simple: impossible d'avoir IV (16B) si le fichier est trop court
49+
if len(contenu_fichier) < 16:
4750
return 0.0
48-
49-
initialization_vector = contenu_fichier[0:16] # type: ignore
50-
donnees_chiffres = contenu_fichier[16:]
51-
52-
if len(donnees_chiffres) % 16 == 0: #Heuristique taille multipe de 16 bytes (Vérifie si les donnéese chiffrés sont en bloc de 16 octets, caractéristique de l'aes cbc)
53-
probabilite = 0.5
51+
52+
iv = contenu_fichier[:16]
53+
corps = contenu_fichier[16:]
54+
55+
score: float = 0.0
56+
57+
# CBC: le corps doit être multiple de 16 (car padding par blocs de 16)
58+
if len(corps) % 16 == 0 and len(corps) > 0:
59+
score += 0.55
5460
else:
55-
probabilite = 0.0
56-
57-
entropie = calculer_entropie(donnees_chiffres)
58-
59-
if entropie > 7.5: #Heuristique entropie élevée (L'entropie doit être supérieur à 7.5 pour confirmer le chiffrement robuste caractéristique des algos de chiffrement)
60-
probabilite += 0.5
61-
61+
score -= 0.25
62+
63+
# Entropie globale des données (indicateur secondaire, on ajoute un bonus léger)
64+
ent = calculer_entropie(corps)
65+
if ent > 7.3:
66+
score += 0.35
67+
68+
# Négatif contre GCM: motif nonce 12B au début + tag 16B à la fin + corps non multiple de 16
69+
# Si ce motif est détecté, cela contredit CBC → forte pénalité
70+
if len(contenu_fichier) >= 28:
71+
from src.utils import calculer_entropie as entf
72+
nonce12 = contenu_fichier[:12]
73+
tag16 = contenu_fichier[-16:]
74+
corps_gcm = contenu_fichier[12:-16]
75+
if len(corps_gcm) > 0 and (
76+
entf(nonce12) > 7.0 and entf(tag16) > 7.0 and len(corps_gcm) % 16 != 0
77+
):
78+
score -= 0.60
79+
80+
# Normalisation: on borne toujours le score dans [0, 1]
81+
if score < 0.0:
82+
score = 0.0
83+
if score > 1.0:
84+
score = 1.0
85+
return score
86+
6287
except FileNotFoundError:
6388
return 0.0
64-
65-
return probabilite
6689

6790
def __filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> list[str]:
6891
'''

0 commit comments

Comments
 (0)