Skip to content
Merged
8 changes: 3 additions & 5 deletions src/analyzers/aes_cbc_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,14 @@ def identifier_algo(self, chemin_fichier_chiffre: str) -> float:
donnees_chiffres = contenu_fichier[16:]

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)
probabilite = 0.6
probabilite = 0.5
else:
return 0.0
probabilite = 0.0

entropie = calculer_entropie(donnees_chiffres)

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)
probabilite += 0.4
else:
return 0.0
probabilite += 0.5

except FileNotFoundError:
return 0.0
Expand Down
24 changes: 11 additions & 13 deletions src/analyzers/chacha20_analyzer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Import des modules
import hashlib
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
from cryptography.exceptions import InvalidTag
from rich import print
import os
import sys
Expand Down Expand Up @@ -109,27 +110,24 @@ def generer_cles_candidates(self, chemin_dictionnaire: str) -> List[bytes]:
return cles_candidates

def dechiffrer(self, chemin_fichier_chiffre: str, cle_donnee: bytes) -> bytes:
if len(cle_donnee) != 32:
if len(cle_donnee) != self._CHACHA20_LONGUEUR_CLE:
raise ValueError("Erreur : La clé n'a pas la taille correcte")

try:
fichier_path: str = chemin_fichier_chiffre
if not os.path.isabs(chemin_fichier_chiffre):
fichier_path = f"data/{chemin_fichier_chiffre}"

with open(fichier_path, 'rb') as f:
with open(chemin_fichier_chiffre, 'rb') as f:
nonce: bytes = f.read(self._CHACHA20_LONGUEUR_NONCE)
texte_chiffre: bytes = f.read()

algorithm_chacha20 = algorithms.ChaCha20(cle_donnee, nonce)
cipher = Cipher(algorithm_chacha20, mode=None)
decrypteur = cipher.decryptor()
resultat: bytes = decrypteur.update(texte_chiffre)
aead = ChaCha20Poly1305(cle_donnee)
resultat: bytes = aead.decrypt(nonce, texte_chiffre, None)

return resultat

except Exception as e:
print(f"Une erreur est survenue : {e}")
except FileNotFoundError:
raise
except InvalidTag:
return b""
except Exception:
return b""

# L'appel direct a été déplacé dans un bloc if __name__ == "__main__" pour de bonnes pratiques (Mouwafic)
Expand Down
Empty file.
17 changes: 10 additions & 7 deletions tests/test_analyzers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os
import sys
import hashlib
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
Expand All @@ -25,7 +25,7 @@ def setUp(self):


def test_aes_cbc_identifier_algo(self):
self.assertAlmostEqual(self.analyser.identifier_algo(self.chemin_fichier_chiffre), 1)
self.assertAlmostEqual(self.analyser.identifier_algo(self.chemin_fichier_chiffre), 1.0, delta=0.1)
self.assertAlmostEqual(self.analyser.identifier_algo(self.chemin_fichier_chiffre_invalide), 0)

def test_aes_cbc_filtrage_dict(self):
Expand Down Expand Up @@ -58,20 +58,23 @@ def setUp(self):
self.cle_test_chacha = hashlib.sha256(b"cle_test").digest()
self.nonce_test_chacha = b"\x00" * 12
self.texte_clair_test_chacha = b"Bonjour le monde, ceci est un test de chiffrement ChaCha20"
self.chemin_fichier_chacha_valide = "tests/fichiers_pour_tests/chacha20_valide.enc"
self.chemin_fichier_chacha_valide = "tests/fichiers_pour_tests/mission_chacha20_temp.enc"
self.chemin_fichier_chacha_invalide = "tests/fichiers_pour_tests/chacha20_invalide.enc"

# Générer un fichier chiffré valide pour les tests de ChaCha20
cipher_chacha = Cipher(algorithms.ChaCha20(self.cle_test_chacha, self.nonce_test_chacha), mode=None)
encryptor = cipher_chacha.encryptor()
texte_chiffre_test = encryptor.update(self.texte_clair_test_chacha)
aead = ChaCha20Poly1305(self.cle_test_chacha)
texte_chiffre_test = aead.encrypt(self.nonce_test_chacha, self.texte_clair_test_chacha, None)
with open(self.chemin_fichier_chacha_valide, "wb") as f:
f.write(self.nonce_test_chacha)
f.write(texte_chiffre_test)

def tearDown(self):
if os.path.exists(self.chemin_fichier_chacha_valide):
os.remove(self.chemin_fichier_chacha_valide)

# Ajout des tests pour ChaCha20_Analyzer
def test_chacha20_identifier_algo(self):
self.assertAlmostEqual(self.analyser_chacha.identifier_algo(self.chemin_fichier_chacha_valide), 1.0, 1)
self.assertAlmostEqual(self.analyser_chacha.identifier_algo(self.chemin_fichier_chacha_valide), 0.8, 1)
self.assertAlmostEqual(self.analyser_chacha.identifier_algo(self.chemin_fichier_chacha_invalide), 0.0, 1)

def test_chacha20_generer_cles_candidates(self):
Expand Down