Skip to content

Commit 85a3194

Browse files
e-mandyEunock-webwesley-kami
authored
Add/test blowfish (#56)
* Intégration de AesCbcAnalyzer dans DetecteurCryptoOrchestrateur. * Debut de l'implementation du code dans la classe principale avec le menu * Suite de l'implementation du code dans la classe principale avec le menu * Update de l'option quitter * Revu des fonctions pour une meilleure optimisation * Ajout du guide d'utilisation * mission1 + console prémices * test * finalisation de l'intégration mission1 + console plus de stress * Intégration de l'AesGcmAnalyzer dans l'orchestrateur * Initialisation des test de l'algo de blowfish * Mise en place des tests unitaires en rapport avec l'analyzer Blowfish * Correction des erreurs liées au tests unitaires de l'analyzer Blowfish * Commit 2spi * Ajout de la documentation en rapport avec l'analyzer Blowfish * New interface 2 --------- Co-authored-by: Eunock-web <izumishinishi7@gmail.com> Co-authored-by: wesley-kami <okwuwesley@gmail.com>
1 parent a2fa713 commit 85a3194

File tree

8 files changed

+73
-8
lines changed

8 files changed

+73
-8
lines changed

src/analyzers/blowfish_analyzer.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
import sys
2+
import os
3+
from ..utils import calculer_entropie
4+
import hashlib
5+
from src.crypto_analyzer import CryptoAnalyzer
6+
from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
17
from src.crypto_analyzer import CryptoAnalyzer
28
from src.utils import calculer_entropie
39
import hashlib
410
import base64
511
import re
612
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
713
from cryptography.hazmat.primitives.padding import PKCS7
14+
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
815
class Blowfish_Analyzer(CryptoAnalyzer):
916
'''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.
1017
@@ -95,6 +102,12 @@ def __filtrer_dictionnaire_par_indices(self, chemin_dictionnaire: str) -> list[s
95102
"""
96103
Filtre le dictionnaire en se basant sur les indices de la mission 3.
97104
L'indice pointe vers un format de clé "sha + nombre + chiffres simples".
105+
106+
Args:
107+
chemin_dictionnaire (str): Chemin du dictionnaire sur lequel on effectue la recherche des potentielles mots clés
108+
109+
Return:
110+
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.
98111
"""
99112
mots_filtres: list[str] = []
100113
prefixes = ("sha256", "sha384", "sha512", "sha1")

src/interface_console.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,24 +112,26 @@ def menu_2(self):
112112
self.dynamiqueText("Mission complète automatique","green")
113113
self.dynamiqueText("Veuillez entrer le chemin du dossier :","white")
114114
time.sleep(0.02)
115-
116-
chemin_dossier = self.prompt.ask("Veuillez entrer le chemin du dossier : ")
115+
pad = 0
116+
while pad < self.calc_center("data"):
117+
print(" ",end='')
118+
pad+=1
119+
120+
chemin_dossier = self.prompt.ask("")
117121
resultat = DetecteurCryptoOrchestrateur().mission_complete_automatique(chemin_dossier, "keys/wordlist.txt")
118122
print(line for line in resultat)
119123
# self.console.clear()
120124
self.dynamiqueText("Mission en cours...","green")
121125
time.sleep(0.02)
122126
# self.console.clear()
123127
self.dynamiqueText("Mission terminée","green")
124-
128+
125129
esc=input("Veuillez appuyer sur la touche entrer pour retourner au menu principal")
126130
time.sleep(0.02)
127-
131+
128132
if esc=="":
129133
self.default_menu()
130134
else : self.default_menu()
131-
132-
# self.default_menu()
133135

134136
def menu_3(self):
135137
self.console.clear()

src/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,4 @@ def rangerDico() -> None:
170170
print('Fichier non trouvé.')
171171
# rangerDico()
172172

173-
# print(verifier_texte_dechiffre("je talk !a mamamia:?\n"))
173+
# print(verifier_texte_dechiffre("je talk !a mamamia:?\n"))
0 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
gAAAAABom24z2UB76X6M0GTn1-vuLLV1lsnxXXsrQ4uOwMoTq-DN7TBUzu_UabYkm2lzQb5tc62SXzplAkZTpw95noj1FtLPsWb54dEXIPgUM8-7r-OaKz4Lr2g75FtQaMxNFw8XOcZgSpL_7vOxtBfg1YD_9dl-iQ==
1+
gAAAAABom24z2UB76X6M0GTn1-vuLLV1lsnxXXsrQ4uOwMoTq-DN7TBUzu_UabYkm2lzQb5tc62SXzplAkZTpw95noj1FtLPsWb54dEXIPgUM8-7r-OaKz4Lr2g75FtQaMxNFw8XOcZgSpL_7vOxtBfg1YD_9dl-iQ==

tests/fichiers_pour_tests/mission3_invalide.enc

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
��%���)$OO�}�

tests/test_analyzers.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import sys
55
import hashlib
66
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
7+
from Crypto.Cipher import Blowfish
8+
from struct import pack
9+
710
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
811
from cryptography.fernet import Fernet
912
from pathlib import Path
1013
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
1114

1215
from src.analyzers.aes_cbc_analyzer import Aes_Cbc_Analyzer
1316
from src.analyzers.chacha20_analyzer import ChaCha20_Analyzer
17+
from src.analyzers.blowfish_analyzer import Blowfish_Analyzer
1418
from src.analyzers.aes_gcm_analyzer import Aes_Gcm_Analyzer
1519
from src.analyzers.fernet_analyzer import FernetAnalyzer
1620

@@ -116,6 +120,51 @@ def test_chacha20_dechiffrer_fichier_non_existant(self):
116120
cle_valide = self.cle_test_chacha
117121
with self.assertRaises(FileNotFoundError):
118122
self.analyser_chacha.dechiffrer("chemin_invalide.enc", cle_valide)
123+
124+
125+
class BlowfishAnalyzerTester(TestCase):
126+
127+
"""
128+
Cette classe contient les différents tests éffectués sur les méthodes en rapport avec l'analyzer Blowfish
129+
"""
130+
131+
def setUp(self):
132+
# Initialisation de la classe Blowfish_Analyzer pour les tests des méthodes de cette dernière
133+
self.analyzer = Blowfish_Analyzer()
134+
# Fichier invalide pour les tests d'exceptions et de résultat d'erreur
135+
self.fichier_crypte_invalide = "tests/fichiers_pour_tests/mission3_invalide.enc"
136+
self.fichier_crypte_valide = "tests/fichiers_pour_tests/mission3_valide.enc"
137+
self.fichier_dictionnaire = "./keys/wordlist.txt"
138+
self.key = b'This is 2 blowfish algorithm key'
139+
self.mot_a_trouver = b'zertyuiopqsdfghjklmwxcvbn,;&1234567890iubdo,cap!=)"_'
140+
141+
# def test_identifier_algo(self):
142+
# self.assertAlmostEqual(self.analyzer.identifier_algo(self.fichier_crypte_invalide), 0.0)
143+
# self.assertAlmostEqual(self.analyzer.identifier_algo(self.fichier_crypte_valide), 0.7)
144+
145+
def test_generer_cles_candidates(self):
146+
# Dans ce cas, on a un dictionnaire qui contient des valeurs qui ne cadrent pas
147+
# avec notre fichier de test, donc la génération renverra une liste vide
148+
self.assertNotEqual(self.analyzer.generer_cles_candidates(self.fichier_dictionnaire), [])
149+
150+
def test_dechiffrer_taille_cle_invalide(self):
151+
# On tente de lever l'exception ValueError en renseignant une clé ne respectant
152+
# l'intervalle pour la taille requise
153+
invalide_key = b'\x00'
154+
with self.assertRaises(ValueError):
155+
self.analyzer.dechiffrer(self.fichier_crypte_valide, invalide_key)
156+
157+
def test_dechiffrer_fichier_introuvable(self):
158+
# Vérification de l'exception FileNotFoundError
159+
with self.assertRaises(FileNotFoundError):
160+
self.analyzer.dechiffrer('dohi.txt', self.key)
161+
162+
def test_dechiffrer_fichier(self):
163+
# Déchiffrement du fichier valide en utilisant la bonne clé
164+
self.assertEqual(self.analyzer.dechiffrer(self.fichier_crypte_valide, self.key), self.mot_a_trouver)
165+
166+
# Cas où la valeur de sortie ne correspond à celle attendue
167+
self.assertNotEqual(self.analyzer.dechiffrer(self.fichier_crypte_valide, self.key), b'Dohi 1 fois')
119168

120169
class AesGcmTester(TestCase) :
121170
_wordlist = "keys/wordlist.txt"

0 commit comments

Comments
 (0)