Skip to content

Commit 8604f92

Browse files
authored
Add/initialisation blowfish analyzer (#26)
* chekpoint: Blowfish _Analyzer.identifier_algo() * add: Intiialisation de Blowfish_Analyzer et implémentation de Blowfish_Analyzer.identifier_algo()
1 parent ac4d295 commit 8604f92

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

src/analyzers/blowfish_analyzer.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from ..detecteur_crypto import CryptoAnalyzer
2+
from ..utils import calculer_entropie
3+
4+
class Blowfish_Analyzer(CryptoAnalyzer):
5+
'''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.
6+
7+
Cette classe a trois méthodes:
8+
- identifier_algo: Détermine si l'algo de chiffrement utilsé sur le fichier chiffré qui lui est passé en paramètre est blowfish.
9+
- generer_cles_candidates: Génère une liste de clés candidates pour le déchiffrement du fichier chiffré
10+
- dechiffrer: fait le déchiffrement proprement dit sur la base de la liste des clés générées
11+
12+
Attributes:
13+
14+
15+
'''
16+
def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
17+
'''
18+
Détermine la probabilité que l'algo de chiffrement utilisé soit blowfish en:
19+
20+
- vérifiant la présence d'un IV à l'en-tête (taille fichier > 8 octets) et que la taille du fichier est un multiple de 8 (blocs de 8 octets pour l'algo blowfish)
21+
- calculant l'entropie des données chiffrées
22+
- calculant l'entropie des sous blocs
23+
24+
Args:
25+
chemin_fichier_chiffre(str): Le chemin du fichier chiffré à traiter (mission1.enc).
26+
27+
Returns:
28+
float: probabilité calculée.
29+
'''
30+
31+
score = 0.0
32+
try:
33+
with open(chemin_fichier_chiffre, "rb") as f:
34+
contenu_fichier: bytes = f.read()
35+
taille_totale = len(contenu_fichier)
36+
TAILLE_IV = 8
37+
38+
# Heuristique 1 : Vérification de la taille (le critère le plus important)
39+
if taille_totale > TAILLE_IV and taille_totale % 8 == 0:
40+
score += 0.4
41+
42+
donnees_chiffrees = contenu_fichier[TAILLE_IV:]
43+
44+
# Heuristique 2 : Vérification de l'entropie globale
45+
entropie_globale = calculer_entropie(donnees_chiffrees)
46+
if entropie_globale > 7.5:
47+
score += 0.3
48+
49+
# Heuristique 3 : Vérification du "pattern Blowfish" (entropie par sous-blocs)
50+
taille_donnees = len(donnees_chiffrees)
51+
moitie = taille_donnees // 2
52+
53+
entropie_moitie1 = calculer_entropie(donnees_chiffrees[:moitie])
54+
entropie_moitie2 = calculer_entropie(donnees_chiffrees[moitie:])
55+
56+
if entropie_moitie1 > 7.5 and entropie_moitie2 > 7.5:
57+
score += 0.3
58+
59+
except FileNotFoundError:
60+
return 0.0
61+
62+
return score

0 commit comments

Comments
 (0)