diff --git a/src/analyzers/aes_cbc_analyzer.py b/src/analyzers/aes_cbc_analyzer.py index 719381e..7512dcc 100644 --- a/src/analyzers/aes_cbc_analyzer.py +++ b/src/analyzers/aes_cbc_analyzer.py @@ -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 diff --git a/src/analyzers/chacha20_analyzer.py b/src/analyzers/chacha20_analyzer.py index c980411..a30c2cc 100644 --- a/src/analyzers/chacha20_analyzer.py +++ b/src/analyzers/chacha20_analyzer.py @@ -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 @@ -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) diff --git a/tests/fichiers_pour_tests/chacha20_invalide.enc b/tests/fichiers_pour_tests/chacha20_invalide.enc new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_analyzers.py b/tests/test_analyzers.py index dc007e5..a7f5379 100644 --- a/tests/test_analyzers.py +++ b/tests/test_analyzers.py @@ -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__), '..', '..')) @@ -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): @@ -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):