From bbfdf67777b9f78bdd5592b863d93b0448ce2fd3 Mon Sep 17 00:00:00 2001 From: Loic GUEGAN Date: Sat, 7 Mar 2015 19:59:15 +0400 Subject: [PATCH] =?UTF-8?q?Classe=20HASHCrypt=20totalement=20revue=20et=20?= =?UTF-8?q?pens=C3=A9e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CryptClass/HASHCrypt.cpp | 88 +++++++++++++++++++++++----------------- CryptClass/HASHCrypt.hpp | 33 +++++++-------- main.cpp | 16 +++++++- 3 files changed, 81 insertions(+), 56 deletions(-) diff --git a/CryptClass/HASHCrypt.cpp b/CryptClass/HASHCrypt.cpp index ec25bf6..d77ee05 100644 --- a/CryptClass/HASHCrypt.cpp +++ b/CryptClass/HASHCrypt.cpp @@ -1,11 +1,8 @@ #include "HASHCrypt.hpp" - //Constructeur -HASHCrypt::HASHCrypt(std::string chain){ - this->MD5_32=this->initMD5_32(chain); //Initialisation MD5 sur 32bits - this->MD5_128=this->initMD5_128(chain); //Initialisation MD5 sur 128bits +HASHCrypt::HASHCrypt(){ } @@ -14,52 +11,67 @@ HASHCrypt::~HASHCrypt(){ } +/* + chain : objet de type string à hacher à l'aide de l'algorithme MD5 + digest: tableau de type byte* contenant les données hasher + size: int faisant référence à la taille du tableau -//Retourne la somme de controle MD5 sur 32 bits -std::string HASHCrypt::initMD5_32(std::string chain){ + Attention si size!=sizeof(digest) risque d'erreur de type Segmentation fault - //Calcule de la somme de controle MD5 dans un type byte à partir du paramètre chain +*/ +void HASHCrypt::getMD5_128(std::string chain, byte* digest, int size){ + + //Contrôle de la taille du digest + this->checkDigestSize(CryptoPP::Weak1::MD5::DIGESTSIZE,size); + + //Calcule de la somme de controle MD5 dans un type byte* à partir du paramètre chain CryptoPP::Weak1::MD5 hash; - byte digest[ CryptoPP::Weak1::MD5::DIGESTSIZE ]; hash.CalculateDigest( digest, (byte*) chain.c_str(), chain.length() ); - //Convertion du hash en std::string - CryptoPP::HexEncoder encoder; - std::string output; - encoder.Attach( new CryptoPP::StringSink( output ) ); - encoder.Put( digest, sizeof(digest) ); - encoder.MessageEnd(); - - //Retourne la sortie de la convertion - return output; } -//Retourne la somme de controle MD5 sur 128 bits -std::string HASHCrypt::initMD5_128(std::string chain){ - //Calcule de la somme de controle MD5 dans un type byte à partir du paramètre chain - CryptoPP::Weak1::MD5 hash; - byte digest[ CryptoPP::Weak1::MD5::DIGESTSIZE * 4 ]; +/* + chain : objet de type string à hacher à l'aide de l'algorithme SHA-256 + digest: tableau de type byte* contenant les données hasher + size : int faisant référence à la taille du tableau + + Attention si size!=sizeof(digest) risque d'erreur de type Segmentation fault + +*/ +void HASHCrypt::getSHA_256(std::string chain, byte* digest, int size){ + + //Contrôle de la taille du digest + this->checkDigestSize(CryptoPP::SHA256::DIGESTSIZE,size); + + //Calcule du SHA-256 dans un type byte* à partir du paramètre chain + CryptoPP::SHA256 hash; hash.CalculateDigest( digest, (byte*) chain.c_str(), chain.length() ); - - //Convertion du hash en std::string - CryptoPP::HexEncoder encoder; - std::string output; - encoder.Attach( new CryptoPP::StringSink( output ) ); - encoder.Put( digest, sizeof(digest) ); - encoder.MessageEnd(); - - //Retourne la sortie de la convertion - return output; } -//Getter MD5_32 -std::string HASHCrypt::getMD5_32(){ - return this->MD5_32; +/* + size : contient la taille des données passer en paramètre à la méthode de hashage choisi +*/ +std::string HASHCrypt::getInvalidDigestSizeError(int sizeRequired, int size){ + std::ostringstream erreurStream; + erreurStream << "Taille de digest invalide ! ("<< sizeRequired <<" octets requis et "<< size <<" donner)"; + return erreurStream.str(); } -//Getter MD5_128 -std::string HASHCrypt::getMD5_128(){ - return this->MD5_128; +/* + sizeRequired : Taille du disgest attendu + size : Taille du digest donné +*/ +void HASHCrypt::checkDigestSize(int sizeRequired, int size){ + try{ + if(size !=sizeRequired){ + throw this->getInvalidDigestSizeError(sizeRequired, size); + } + + } + catch(std::string erreur){ + std::cerr << erreur < #include - +#include //----- Includes crypto++ ----- -//Pour le calcule de la somme de controle MD5 +//Pour le calcule de la MD5 #include //Pour la convertion en hexadécimal et vice-versa #include +//Pour l'utilisation de l'algorithme SHA +#include /*----- Description ----- -Classe executant divers fonctions de hachage sur -un paramètre donné à l'initialisation, ainsi celui-ci -n'est présent en mémoire qu'à l'initialisation. +Classe exécutant divers fonctions de hachage sur +un paramètre donné à la méthode choisie. +Gestion des exceptions. Utilise la bibliothèque crypto++ */ @@ -22,26 +24,25 @@ class HASHCrypt{ public: //Constructeur - HASHCrypt(std::string chain); + HASHCrypt(); //Destructeur ~HASHCrypt(); - std::string getMD5_32(); //Retourne MD5_32 - std::string getMD5_128(); //Retourne MD5_128 - + //Contruit un MD5 de 128 bits sur le tableau digest de taille size à l'aide de la chaine chaine. + void getMD5_128(std::string chain, byte* digest, int size); + //Contruit un SHA de 256 bits sur le tableau digest de taille size à l'aide de la chaine chaine. + void getSHA_256(std::string chain, byte* digest, int size); //Retourne SHA_256 private: - //Calcule de MD5 sur 32bits - std::string initMD5_32(std::string chain); - //Calcule de MD5 sur 128 bits - std::string initMD5_128(std::string chain); + //Arrête le programme en cas de taille de Digest invalide et affiche une erreur. + void checkDigestSize(int sizeRequired, int size); + //Assemble et retourne les messages d'erreurs de type : InvalidDigestSizeError + std::string getInvalidDigestSizeError(int sizeRequired, int size); - std::string MD5_32; //Attribut MD5 sur 32bits - std::string MD5_128; //Attribut MD5 sur 128 bits }; diff --git a/main.cpp b/main.cpp index cb3bf44..fc3b22a 100644 --- a/main.cpp +++ b/main.cpp @@ -15,9 +15,21 @@ void aff(std::string chaine); //----- Program Start ----- int main(){ - HASHCrypt hash= HASHCrypt("Chaine de test"); - aff(hash.getMD5_128()); + + + + + HASHCrypt hash= HASHCrypt(); + + byte code[16]; + + hash.getMD5_128("Phrase de test !", code, sizeof(code)); + + for(int i=0; i<16;i++){ + std::cout << code[i]; + } + return 0;