diff --git a/src/analyzers/blowfish_analyzer.py b/src/analyzers/blowfish_analyzer.py index 226eccf..823e101 100644 --- a/src/analyzers/blowfish_analyzer.py +++ b/src/analyzers/blowfish_analyzer.py @@ -1,3 +1,9 @@ +import sys +import os +from ..utils import calculer_entropie +import hashlib +from src.crypto_analyzer import CryptoAnalyzer +from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes from src.crypto_analyzer import CryptoAnalyzer from src.utils import calculer_entropie import hashlib @@ -5,6 +11,7 @@ import re from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives.padding import PKCS7 +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) class Blowfish_Analyzer(CryptoAnalyzer): '''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. @@ -95,6 +102,12 @@ def __filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> list[s """ Filtre le dictionnaire en se basant sur les indices de la mission 3. L'indice pointe vers un format de clé "sha + nombre + chiffres simples". + + Args: + chemin_dictionnaire (str): Chemin du dictionnaire sur lequel on effectue la recherche des potentielles mots clés + + Return: + list[str]: La liste de tous les mots en chaine de caractères, susceptibles d'être des mots clés parmi ceux du dictionnaire fourni. """ mots_filtres: list[str] = [] prefixes = ("sha256", "sha384", "sha512", "sha1") diff --git a/src/interface_console.py b/src/interface_console.py index 7f46af8..24d27fe 100644 --- a/src/interface_console.py +++ b/src/interface_console.py @@ -112,8 +112,12 @@ def menu_2(self): self.dynamiqueText("Mission complète automatique","green") self.dynamiqueText("Veuillez entrer le chemin du dossier :","white") time.sleep(0.02) - - chemin_dossier = self.prompt.ask("Veuillez entrer le chemin du dossier : ") + pad = 0 + while pad < self.calc_center("data"): + print(" ",end='') + pad+=1 + + chemin_dossier = self.prompt.ask("") resultat = DetecteurCryptoOrchestrateur().mission_complete_automatique(chemin_dossier, "keys/wordlist.txt") print(line for line in resultat) # self.console.clear() @@ -121,15 +125,13 @@ def menu_2(self): time.sleep(0.02) # self.console.clear() self.dynamiqueText("Mission terminée","green") - + esc=input("Veuillez appuyer sur la touche entrer pour retourner au menu principal") time.sleep(0.02) - + if esc=="": self.default_menu() else : self.default_menu() - - # self.default_menu() def menu_3(self): self.console.clear() diff --git a/src/utils.py b/src/utils.py index 19a8eb3..15029ea 100644 --- a/src/utils.py +++ b/src/utils.py @@ -170,4 +170,4 @@ def rangerDico() -> None: print('Fichier non trouvé.') # rangerDico() -# print(verifier_texte_dechiffre("je talk !a mamamia:?\n")) \ No newline at end of file +# print(verifier_texte_dechiffre("je talk !a mamamia:?\n")) diff --git a/tests/fichiers_pour_tests/aes_gcm_invalide.enc b/tests/fichiers_pour_tests/aes_gcm_invalide.enc index 4ab7321..ef32f59 100644 Binary files a/tests/fichiers_pour_tests/aes_gcm_invalide.enc and b/tests/fichiers_pour_tests/aes_gcm_invalide.enc differ diff --git a/tests/fichiers_pour_tests/fernet_invalide.enc b/tests/fichiers_pour_tests/fernet_invalide.enc index 83de656..9261f0a 100644 --- a/tests/fichiers_pour_tests/fernet_invalide.enc +++ b/tests/fichiers_pour_tests/fernet_invalide.enc @@ -1 +1 @@ -gAAAAABom24z2UB76X6M0GTn1-vuLLV1lsnxXXsrQ4uOwMoTq-DN7TBUzu_UabYkm2lzQb5tc62SXzplAkZTpw95noj1FtLPsWb54dEXIPgUM8-7r-OaKz4Lr2g75FtQaMxNFw8XOcZgSpL_7vOxtBfg1YD_9dl-iQ== \ No newline at end of file +gAAAAABom24z2UB76X6M0GTn1-vuLLV1lsnxXXsrQ4uOwMoTq-DN7TBUzu_UabYkm2lzQb5tc62SXzplAkZTpw95noj1FtLPsWb54dEXIPgUM8-7r-OaKz4Lr2g75FtQaMxNFw8XOcZgSpL_7vOxtBfg1YD_9dl-iQ== diff --git a/tests/fichiers_pour_tests/mission3_invalide.enc b/tests/fichiers_pour_tests/mission3_invalide.enc new file mode 100644 index 0000000..e69de29 diff --git a/tests/fichiers_pour_tests/mission3_valide.enc b/tests/fichiers_pour_tests/mission3_valide.enc new file mode 100644 index 0000000..5f16393 --- /dev/null +++ b/tests/fichiers_pour_tests/mission3_valide.enc @@ -0,0 +1 @@ +ñÛ%ðÛÙ)$OO¡}› \ No newline at end of file diff --git a/tests/test_analyzers.py b/tests/test_analyzers.py index 8926206..297256e 100644 --- a/tests/test_analyzers.py +++ b/tests/test_analyzers.py @@ -4,6 +4,9 @@ import sys import hashlib from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305 +from Crypto.Cipher import Blowfish +from struct import pack + from cryptography.hazmat.primitives.ciphers.aead import AESGCM from cryptography.fernet import Fernet from pathlib import Path @@ -11,6 +14,7 @@ from src.analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer from src.analyzers.chacha20_analyzer import ChaCha20_Analyzer +from src.analyzers.blowfish_analyzer import Blowfish_Analyzer from src.analyzers.aes_gcm_analyzer import Aes_Gcm_Analyzer from src.analyzers.fernet_analyzer import FernetAnalyzer @@ -116,6 +120,51 @@ def test_chacha20_dechiffrer_fichier_non_existant(self): cle_valide = self.cle_test_chacha with self.assertRaises(FileNotFoundError): self.analyser_chacha.dechiffrer("chemin_invalide.enc", cle_valide) + + +class BlowfishAnalyzerTester(TestCase): + + """ + Cette classe contient les différents tests éffectués sur les méthodes en rapport avec l'analyzer Blowfish + """ + + def setUp(self): + # Initialisation de la classe Blowfish_Analyzer pour les tests des méthodes de cette dernière + self.analyzer = Blowfish_Analyzer() + # Fichier invalide pour les tests d'exceptions et de résultat d'erreur + self.fichier_crypte_invalide = "tests/fichiers_pour_tests/mission3_invalide.enc" + self.fichier_crypte_valide = "tests/fichiers_pour_tests/mission3_valide.enc" + self.fichier_dictionnaire = "./keys/wordlist.txt" + self.key = b'This is 2 blowfish algorithm key' + self.mot_a_trouver = b'zertyuiopqsdfghjklmwxcvbn,;&1234567890iubdo,cap!=)"_' + + # def test_identifier_algo(self): + # self.assertAlmostEqual(self.analyzer.identifier_algo(self.fichier_crypte_invalide), 0.0) + # self.assertAlmostEqual(self.analyzer.identifier_algo(self.fichier_crypte_valide), 0.7) + + def test_generer_cles_candidates(self): + # Dans ce cas, on a un dictionnaire qui contient des valeurs qui ne cadrent pas + # avec notre fichier de test, donc la génération renverra une liste vide + self.assertNotEqual(self.analyzer.generer_cles_candidates(self.fichier_dictionnaire), []) + + def test_dechiffrer_taille_cle_invalide(self): + # On tente de lever l'exception ValueError en renseignant une clé ne respectant + # l'intervalle pour la taille requise + invalide_key = b'\x00' + with self.assertRaises(ValueError): + self.analyzer.dechiffrer(self.fichier_crypte_valide, invalide_key) + + def test_dechiffrer_fichier_introuvable(self): + # Vérification de l'exception FileNotFoundError + with self.assertRaises(FileNotFoundError): + self.analyzer.dechiffrer('dohi.txt', self.key) + + def test_dechiffrer_fichier(self): + # Déchiffrement du fichier valide en utilisant la bonne clé + self.assertEqual(self.analyzer.dechiffrer(self.fichier_crypte_valide, self.key), self.mot_a_trouver) + + # Cas où la valeur de sortie ne correspond à celle attendue + self.assertNotEqual(self.analyzer.dechiffrer(self.fichier_crypte_valide, self.key), b'Dohi 1 fois') class AesGcmTester(TestCase) : _wordlist = "keys/wordlist.txt"