Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
f40bb59
Documentation de la fonction d'entropie
e-mandy Aug 2, 2025
0474003
Merge branch 'feature/calculerEntropieShannon' of https://github.com/…
e-mandy Aug 2, 2025
8f0dbfc
Essai de fusion (1/2)
e-mandy Aug 2, 2025
eadb52d
Fusion (2/2)
e-mandy Aug 3, 2025
2a008e2
Implementation de la fonction de validation du texte déchiffrer
seathiel-12 Aug 3, 2025
b638a49
Récupération du main (1/2)
e-mandy Aug 3, 2025
ecf4eef
Récupération du main (2/2)
e-mandy Aug 3, 2025
e965801
Mise en place des tests unitaires (1/4)
e-mandy Aug 3, 2025
e119f5d
Revert "Mise en place des tests unitaires (1/4)"
e-mandy Aug 3, 2025
14e759d
Mise en place des tests unitaires (1/4)
e-mandy Aug 3, 2025
01800d8
Définition de la classe de gestion des rapports de ission et implémen…
seathiel-12 Aug 3, 2025
e3f5efa
Implémentation de la fonction de recherche d'anciens rapports
seathiel-12 Aug 4, 2025
e593c82
Merge branch 'main' into feature/rapport_mission
mouwaficbdr Aug 4, 2025
3d6332f
Merge branch 'main' of https://github.com/mouwaficbdr/CryptoForensic-…
e-mandy Aug 4, 2025
52433f7
Mise en place des tests liés à l'analyzer aes cbc
e-mandy Aug 4, 2025
af85ee2
Corrections de typage et de logique
mouwaficbdr Aug 4, 2025
896696a
Correction du comportement à la levée de l'exception
mouwaficbdr Aug 4, 2025
3391403
Correction de la lgoque de test de test_exception_déchiffrer
mouwaficbdr Aug 4, 2025
9b38d27
Corection de la logique de test_verification_texte_dechiffre
mouwaficbdr Aug 4, 2025
275b47a
fix: Utilisation de pathlib pour une gestion portable des chemins.
mouwaficbdr Aug 4, 2025
d662e06
Merge branch 'main' into feature/testsUnitaires
mouwaficbdr Aug 4, 2025
ae4cfb0
merge réussi
seathiel-12 Aug 4, 2025
a2c05c5
Validation des tests et corrections du rapport mission
seathiel-12 Aug 4, 2025
7e52274
Validation des tests et corrections du rapport mission
seathiel-12 Aug 4, 2025
ec4191c
merged
seathiel-12 Aug 5, 2025
f67a4a5
Merge branch 'main' of https://github.com/mouwaficbdr/CryptoForensic-…
seathiel-12 Aug 6, 2025
31569fb
Merge branch 'main' of https://github.com/mouwaficbdr/CryptoForensic-…
seathiel-12 Aug 7, 2025
7c1e4b4
chekpoint: Blowfish _Analyzer.identifier_algo()
mouwaficbdr Aug 7, 2025
6bb7780
add: Intiialisation de Blowfish_Analyzer et implémentation de Blowfis…
mouwaficbdr Aug 7, 2025
2a6a8fd
Merge branch 'main' into add/Initialisation_Blowfish_Analyzer
mouwaficbdr Aug 7, 2025
defc99b
Merge branch 'main' of github.com:mouwaficbdr/CryptoForensic-Python i…
mouwaficbdr Aug 7, 2025
da7935e
Implémentation de Blowfish_Analyzer.filtrer_dictionnaire_par_indice()
mouwaficbdr Aug 7, 2025
5053932
Merge branch 'add/Initialisation_Blowfish_Analyzer' of github.com:mou…
mouwaficbdr Aug 7, 2025
746d059
Correction de bug
seathiel-12 Aug 7, 2025
d6b3859
merged
seathiel-12 Aug 7, 2025
4eba401
Implementer de Blowfish déchiffrer
seathiel-12 Aug 7, 2025
7368195
merge sur la branche courante
seathiel-12 Aug 7, 2025
778632b
Integration de blowfish dans le detecteur crypto
seathiel-12 Aug 7, 2025
e4e7a46
merged
seathiel-12 Aug 8, 2025
5ab3e40
merged
seathiel-12 Aug 9, 2025
b5f9fe1
Merge branch 'main' of https://github.com/mouwaficbdr/CryptoForensic-…
seathiel-12 Aug 9, 2025
97432a6
Gestion des bugs de chemin et d'import
seathiel-12 Aug 10, 2025
eb8edb5
Merge branch 'main' of https://github.com/mouwaficbdr/CryptoForensic-…
seathiel-12 Aug 10, 2025
da5c573
Update gitignore
mouwaficbdr Aug 10, 2025
e1773ef
add: Fichier run_tests.py qui run tous les tests et donne le feedback
mouwaficbdr Aug 10, 2025
f7e6858
fix: Standardisation uniforme de tous les imports pour uniformité
mouwaficbdr Aug 10, 2025
2513ebd
tests aes_gcm
seathiel-12 Aug 10, 2025
45b3656
pull et merge sur les tests
seathiel-12 Aug 10, 2025
fc1ed08
fix: Correction de la validation de la taille de clé dans Blowfish_An…
mouwaficbdr Aug 10, 2025
dffa15f
pull et merge du main
seathiel-12 Aug 10, 2025
e08d3ca
fix: Amélioration et uniformisation de la gestion des erreurs pour le…
mouwaficbdr Aug 10, 2025
46accc8
Merge branch 'main' into feature/testsUnitaires
mouwaficbdr Aug 10, 2025
e8503e4
Merge branch 'main' of github.com:mouwaficbdr/CryptoForensic-Python i…
mouwaficbdr Aug 10, 2025
517b96e
fix: Correction des erreurs de logique
mouwaficbdr Aug 10, 2025
3d748b9
merged
seathiel-12 Aug 10, 2025
8f20bfc
merged
seathiel-12 Aug 10, 2025
94ff070
test de l'analyzer Fernet
seathiel-12 Aug 10, 2025
148c920
Merge branch 'feature/testsUnitaires' of https://github.com/mouwaficb…
seathiel-12 Aug 10, 2025
ce9d50c
Correction de l'orchestrateur et ajustements correspondants
seathiel-12 Aug 11, 2025
c6ee4a3
pull et merge sur hotfix
seathiel-12 Aug 11, 2025
3f706c7
Lancement du système de stepping pour la progress bar
seathiel-12 Aug 11, 2025
3465442
fix: Corrections mineures
mouwaficbdr Aug 11, 2025
ef4e443
Merge branch 'hotfix/Problèmes_globaux' of github.com:mouwaficbdr/Cry…
mouwaficbdr Aug 11, 2025
829a9e6
Merge branch 'hotfix/Problèmes_globaux' of https://github.com/mouwafi…
seathiel-12 Aug 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from src.detecteur_crypto import DetecteurCryptoOrchestrateur
from src.detecteur_crypto import DetecteurCryptoOrchestrateur, ResultatAnalyse
from src.analyzers.blowfish_analyzer import Blowfish_Analyzer
from src.analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
from src.interface_console import consoleInterface
Expand All @@ -13,4 +13,5 @@
# except FileNotFoundError:
# print("Erreur: Le fichier 'mission3.enc' est introuvable.")

consoleInterface()
consoleInterface()
# print(DetecteurCryptoOrchestrateur().mission_complete_automatique('data/', 'keys/wordlist.txt'))
2 changes: 1 addition & 1 deletion rapport_mission.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
RAPPORT DE SYNTHESE DU 05/08/25 � 00:01:06~ Mission 2: CHACHA20 ~ I - Statistiques relatives � l'analyse du fichier~Fichier crypt� par cet algorithme: mission1.enc~Cl� de d�chiffrement identifi�e: PK7 ~Nombre de tentatives: 127 ~Temps d'ex�cution: 368s ~ II - R�sultats obtenusTaux r�ussite du d�chiffrement: 97%(Succ�s)~Texte d�chiffr�: Je suis l�! ~
RAPPORT DE SYNTHESE DU 11/08/25 � 04:19:59~ Mission 1: AES-CBC-256 ~ I - Statistiques relatives � l'analyse du fichier~-Fichier crypt� par cet algorithme: ('mission1.enc',)~-Cl� de d�chiffrement identifi�e: b'\xf7@[\xc1\xb5\x83c\xd8g?\xda\xcbO\xbd\rcZ\xfc\xfe\x9b\x0f\x88\r\xf1\x80\x89\xa1R\x0f\xd1f\xd8' ~-Nombre de tentatives: 1 ~-Temps d'ex�cution: 0.013037919998168945 ~ II - R�sultats obtenus~-Taux r�ussite du d�chiffrement: 69.42(Succ�s)~-Texte d�chiffr�: F�licitations ! Vous avez d�chiffr� la mission 1.~Le secret de cette mission est : AES-256-CBC est toujours largement utilis� dans l'industrie.~Cl� utilis�e : paris2024~Algorithme : AES-256-CBC avec PBKDF2 ~~RAPPORT DE SYNTHESE DU 11/08/25 � 04:19:59~ Mission 3: BLOWFISH ~ I - Statistiques relatives � l'analyse du fichier~-Fichier crypt� par cet algorithme: ('mission3.enc',)~-Cl� de d�chiffrement identifi�e: b'' ~-Nombre de tentatives: 15 ~-Temps d'ex�cution: 0.010114669799804688 ~ II - R�sultats obtenus~-Taux r�ussite du d�chiffrement: 0(Echec)~-Texte d�chiffr�: b'' ~~RAPPORT DE SYNTHESE DU 11/08/25 � 04:19:59~ Mission 5: FERNET ~ I - Statistiques relatives � l'analyse du fichier~-Fichier crypt� par cet algorithme: ('mission5.enc',)~-Cl� de d�chiffrement identifi�e: b"i'\xaaf\x99\xdc\xa0A\xed\xc6\xce\xfe`\xcc\xb9/\xf8\xa1\x0e~\x18\xd3\xbb\xeb\xa1\x9f\xc0|\xc8\xf1_\xdd" ~-Nombre de tentatives: 2 ~-Temps d'ex�cution: 0.016638517379760742 ~ II - R�sultats obtenus~-Taux r�ussite du d�chiffrement: 66.0(Succ�s)~-Texte d�chiffr�: Magnifique ! Derni�re mission compl�t�e.~Message final : j'adore la cryptographie~Cette phrase �tait la cl� elle-m�me !~Algorithme : Fernet (bas� sur AES-128-CBC + HMAC) ~~
4 changes: 2 additions & 2 deletions src/analyzers/aes_cbc_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def identifier_algo(self, chemin_fichier_chiffre: str) -> float:

return probabilite

def filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> list[str]:
def __filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> list[str]:
'''
Filtre le dictionnaire sur la base des indices fournis pour sélectionner uniquement les mots de passe pertinents.

Expand Down Expand Up @@ -100,7 +100,7 @@ def generer_cles_candidates(self, chemin_dictionnaire: str) -> list[bytes]:
list[bytes]: liste des clés candidates.
'''

mots_de_passe_cible = self.filtrer_dictionnaire_par_indices(chemin_dictionnaire)
mots_de_passe_cible = self.__filtrer_dictionnaire_par_indices(chemin_dictionnaire)

clees_candidates: list[bytes] = []
kdf = PBKDF2HMAC(
Expand Down
156 changes: 104 additions & 52 deletions src/analyzers/aes_gcm_analyzer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from src.crypto_analyzer import CryptoAnalyzer
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from typing import List
import re

class Aes_Gcm_Analyzer(CryptoAnalyzer):
Expand All @@ -18,11 +19,11 @@ class Aes_Gcm_Analyzer(CryptoAnalyzer):

'''

_PBKDF2_SALT = b"AES_GCM_SALT_2024" #Fourni
_PBKDF2_ITERATIONS = 10000 #Fourni
_PBKDF2_LONGUEUR_CLE = 32 #Longueur de la clé
_PBKDF2_SALT: bytes = b"AES_GCM_SALT_2024" #Fourni
_PBKDF2_ITERATIONS: int = 10000 #Fourni
_PBKDF2_LONGUEUR_CLE: int = 32 #Longueur de la clé

def __filtrer_dictionnaire_par_indice(self, chemin_dictionnaire: str) -> list[str]:
def __filtrer_dictionnaire_par_indice(self, chemin_dictionnaire: str) -> List[str]:
"""
Filtre le dictionnaire en se basant sur les indices de la mission 4.
L'indice pointe vers le format de clé "Acronyme en majuscules + 4 chiffres".
Expand All @@ -33,10 +34,10 @@ def __filtrer_dictionnaire_par_indice(self, chemin_dictionnaire: str) -> list[st
Returns:
list[str]: Une liste de mots de passe filtrés.
"""
mots_filtres: list[str] = []
mots_filtres: List[str] = []

# L'année courante
annee_courante = "2024" #Normalement 2025 mais on considère 2024 pour se conformer à la wordlist
annee_courante: str = "2024" #Normalement 2025 mais on considère 2024 pour se conformer à la wordlist

# Définition du motif d'acronyme de 4 lettres en majuscules
# On utilise une expression régulière pour plus de robustesse
Expand All @@ -45,12 +46,12 @@ def __filtrer_dictionnaire_par_indice(self, chemin_dictionnaire: str) -> list[st
try:
with open(chemin_dictionnaire, "r", encoding="utf-8") as f:
for ligne in f:
mot = ligne.strip()
mot: str = ligne.strip()

# Vérifie si le mot de passe correspond au format de l'indice
# ex: NATO2024, UN2024, etc.
if mot.endswith(annee_courante):
acronyme = mot[:-4] # Extrait la partie acronyme
acronyme: str = mot[:-4] # Extrait la partie acronyme
if motif_acronyme.match(acronyme):
mots_filtres.append(mot)

Expand All @@ -60,7 +61,7 @@ def __filtrer_dictionnaire_par_indice(self, chemin_dictionnaire: str) -> list[st

return mots_filtres

def generer_cles_candidates(self, chemin_dictionnaire: str) -> list[bytes]:
def generer_cles_candidates(self, chemin_dictionnaire: str) -> List[bytes]:
'''
Génère les clées candidates pour déchiffrer le fichier à partir de la liste retournée par filtrer_dictionnaire_par_indices.

Expand All @@ -71,57 +72,108 @@ def generer_cles_candidates(self, chemin_dictionnaire: str) -> list[bytes]:
list[bytes]: liste des clés candidates.
'''

mots_de_passe_cible = self.__filtrer_dictionnaire_par_indice(chemin_dictionnaire)
mots_de_passe_cible: List[str] = self.__filtrer_dictionnaire_par_indice(chemin_dictionnaire)

clees_candidates: list[bytes] = []
clees_candidates: List[bytes] = []

for mot_de_passe in mots_de_passe_cible:
# Créer une nouvelle instance de PBKDF2 pour chaque mot de passe
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=self._PBKDF2_LONGUEUR_CLE,
iterations=self._PBKDF2_ITERATIONS,
salt=self._PBKDF2_SALT
algorithm=hashes.SHA256(),
length=self._PBKDF2_LONGUEUR_CLE,
iterations=self._PBKDF2_ITERATIONS,
salt=self._PBKDF2_SALT
)
mot_de_passe_en_octets: bytes = mot_de_passe.encode('utf-8')
cle_derivee: bytes = kdf.derive(mot_de_passe_en_octets)
clees_candidates.append(cle_derivee)

return clees_candidates

def identifier_algo(self, chemin_fichier_chiffre):
"""
Identifie si le fichier utilise l'algorithme AES GCM.

Args:
chemin_fichier_chiffre(str): Le chemin vers le fichier chiffré.

Returns:
float: Probabilité que le fichier utilise AES GCM (0.0 à 1.0).
"""
try:
# Pour l'instant, retourner une probabilité par défaut
# TODO: Implémenter la logique d'identification AES GCM
return 0.5
except Exception as e:
print(f"Erreur lors de l'identification de l'algorithme: {e}")
return 0.0

def dechiffrer(self, chemin_fichier_chiffre, cle_donnee):
"""
Déchiffre le fichier chiffré avec la clé donnée.

Args:
chemin_fichier_chiffre(str): Le chemin vers le fichier chiffré.
cle_donnee(bytes): La clé de déchiffrement.

Returns:
bytes: Le contenu déchiffré ou une chaîne vide en cas d'échec.
"""
try:
# Pour l'instant, retourner une chaîne vide
# TODO: Implémenter la logique de déchiffrement AES GCM
return b""
except Exception as e:
print(f"Erreur lors du déchiffrement: {e}")
return b""
def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
"""
Identifie si le fichier utilise l'algorithme AES GCM.

Cette méthode utilise plusieurs heuristiques spécifiques à AES GCM pour se différencier d'AES CBC :
- Structure : nonce (12 bytes) + données chiffrées + tag d'authentification (16 bytes)
- Pas de contrainte de taille (pas de padding)
- Tag d'authentification reconnaissable
- Mode authentifié moderne (plus sécurisé que CBC)

Args:
chemin_fichier_chiffre(str): Le chemin vers le fichier chiffré.

Returns:
float: Probabilité que le fichier utilise AES GCM (0.0 à 1.0).
"""
try:
with open(chemin_fichier_chiffre, "rb") as f:
contenu_fichier: bytes = f.read()

# Heuristique 1: Vérifier que le fichier est assez grand pour contenir nonce + tag
# Nonce (12 bytes) + tag (16 bytes) = minimum 28 bytes
if len(contenu_fichier) < 28:
return 0.0

# Heuristique 2: Extraire la structure potentielle
nonce_potentiel: bytes = contenu_fichier[0:12] # 12 bytes pour le nonce
tag_potentiel: bytes = contenu_fichier[-16:] # 16 bytes pour le tag d'authentification
donnees_chiffrees: bytes = contenu_fichier[12:-16] # Le reste

probabilite: float = 0.0

# Heuristique 3: Vérifier la présence d'un tag d'authentification de 16 bytes
if len(tag_potentiel) == 16:
probabilite += 0.25

# Heuristique 4: Analyser l'entropie des données chiffrées
from src.utils import calculer_entropie
entropie_donnees = calculer_entropie(donnees_chiffrees)
if entropie_donnees > 7.0:
probabilite += 0.25 # Augmenté de 0.2 à 0.25

# Heuristique 5: Vérifier l'entropie du tag d'authentification
entropie_tag = calculer_entropie(tag_potentiel)
if entropie_tag > 7.5:
probabilite += 0.25 # Augmenté de 0.2 à 0.25

# Heuristique 6: Différenciation clé d'AES CBC
# AES CBC nécessite une taille multiple de 16 bytes (padding PKCS7) contrairement à AES GCM
if len(donnees_chiffrees) % 16 != 0:
# Si la taille n'est pas multiple de 16, c'est probablement GCM (pas de padding)
probabilite += 0.21 # Légèrement augmenté pour dépasser 0.8

# Heuristique 7: Vérifier l'entropie du nonce
entropie_nonce = calculer_entropie(nonce_potentiel)
if entropie_nonce > 7.0:
probabilite += 0.1

# Si toutes les heuristiques de base sont satisfaites
if probabilite >= 0.5:
probabilite += 0.1

return probabilite

except FileNotFoundError:
print(f"Erreur : Le fichier '{chemin_fichier_chiffre}' est introuvable.")
return 0.0
except Exception as e:
print(f"Erreur lors de l'identification de l'algorithme AES GCM: {e}")
return 0.0

def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
"""
Déchiffre le fichier chiffré avec la clé donnée.

Args:
chemin_fichier_chiffre(str): Le chemin vers le fichier chiffré.
cle_donnee(bytes): La clé de déchiffrement.

Returns:
bytes: Le contenu déchiffré ou une chaîne vide en cas d'échec.
"""
try:
# TODO: Implémenter la logique de déchiffrement AES GCM
return b""
except Exception as e:
print(f"Erreur lors du déchiffrement: {e}")
return b""
5 changes: 2 additions & 3 deletions src/analyzers/chacha20_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,7 @@ def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
print(f"Erreur lors de l'identification de l'algorithme: {e}")
return 0.0

def filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> List[bytes]:
# En supposant qu'elle retourne une liste de bytes pour les clés.
def __filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> List[bytes]:

"""
Cette fonction a pour but de filter le fichier de dictionnaire en fonction des différents niveaux d'indices
Expand Down Expand Up @@ -160,7 +159,7 @@ def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
# Erreur de déchiffrement (clé incorrecte, format invalide)
return b""

# L'appel direct a été déplacé dans un bloc if __name__ == "__main__" pour de bonnes pratiques (Mouwafic)

if __name__ == "__main__":
try:
resultat_dechiffrement: bytes = ChaCha20_Analyzer().dechiffrer("data/mission2.enc", os.urandom(32))
Expand Down
Loading