From 103fb7d640fe69a154dfc062e172642a84cc0cbd Mon Sep 17 00:00:00 2001 From: antoine Date: Sat, 23 Jan 2016 22:57:15 +0100 Subject: [PATCH] fonctionne --- aes.cpp | 84 +++++++++++---------------- aes.cpp.save => aes.cpp.iteratif | 0 aes.hpp | 96 ++++++++++++++++++++++++++----- crypt.hpp | 16 +++--- crypto.ex | Bin 62216 -> 0 bytes decrypt.hpp | 36 ++++++++---- file | 1 + file.txt | 7 --- makefile | 9 ++- 9 files changed, 155 insertions(+), 94 deletions(-) rename aes.cpp.save => aes.cpp.iteratif (100%) delete mode 100755 crypto.ex create mode 100644 file delete mode 100644 file.txt diff --git a/aes.cpp b/aes.cpp index 84f49d8..9d51f30 100644 --- a/aes.cpp +++ b/aes.cpp @@ -11,73 +11,57 @@ int main(int argc, char* argv[]) { //*************************************************** char* filename = argv[1]; - aes O = crypt(filename); + aes* O = new crypt(filename); // Read the file to encrypt - unsigned char *file; + unsigned char* file; // readFile fait l'aloccation mémoire !!! pensé au free - size_t fileLength = O.readFile(&file); + size_t fileLength = O->readFile(&file); printf("%d bytes to be encrypted\n", (int)fileLength); // Encrypt the file unsigned char *encryptedFile; int encryptedFileLength; - crypt temp = static_cast(O); - - // if((encryptedFileLength = (temp).aesEncrypt((const unsigned char*)file, fileLength, &encryptedFile) ) == -1) { - // fprintf(stderr, "Encryption failed\n"); - // return 1; - // } - // printf("%d bytes encrypted\n", encryptedFileLength); + if((encryptedFileLength = (dynamic_cast(O))->aesEncrypt((const unsigned char*)file, fileLength, &encryptedFile) ) == -1) { + fprintf(stderr, "Encryption failed\n"); + return 1; + } - // // Append .enc to the filename - // char *encryptedFilename = (char*)malloc(strlen(filename) + 5); - // if(encryptedFilename == NULL) { - // fprintf(stderr, "Failed to allocate memory\n"); - // return 1; - // } - // sprintf(encryptedFilename, "%s.enc", filename); - - // // Write the encrypted file to its own file - // writeFile(encryptedFilename, encryptedFile, encryptedFileLength); - - // std::cerr << "aesKey : "; - // for (int i = 0; i < 32; i++) { - // std::cerr << std::hex << aesKey[i]; - // } - // std::cerr << std::endl; - - // printf("Encrypted message written to \"%s\"\n", encryptedFilename); + printf("%d bytes encrypted\n", encryptedFileLength); + std::cerr << O->PrintAesKey() << std::endl; + // Write the encrypted file to its own file + std::string encryptedFilename = O->writeFile(encryptedFile, encryptedFileLength); + printf("Encrypted message written to \"%s\"\n", encryptedFilename.c_str()); + free(encryptedFile); free(file); - // //*************************************************** + //*************************************************** + std::cerr << "*******************************" << std::endl; + aes* O2 = new decrypt(encryptedFilename.c_str(), O->getAesKey(), O->getAesIV()); - // fileLength = readFile(encryptedFilename, &file); + fileLength = O2->readFile(&file); + std::cerr << "byte to be dectypted : " << fileLength << std::endl; - // // Decrypt the encrypted file - // unsigned char *decryptedFile; - // int decryptedFileLength; - // if((decryptedFileLength = aesDecrypt(aesDecryptCtx, aesKey, aesIV, file, fileLength, &decryptedFile)) == -1) { - // fprintf(stderr, "Decryption failed\n"); - // return 1; - // } - // printf("%d bytes decrypted\n", (int)decryptedFileLength); + // Decrypt the encrypted file + unsigned char* decryptedFile; - // // Append .dec to the filename - // char *decryptedFilename = (char*)malloc(strlen(filename) + 5); - // if(decryptedFilename == NULL) { - // fprintf(stderr, "Failed to allocate memory\n"); - // return 1; - // } - // sprintf(decryptedFilename, "%s.dec", filename); + int decryptedFileLength; + if((decryptedFileLength = (dynamic_cast(O2))->aesDecrypt(file, fileLength, &decryptedFile)) == -1) { + fprintf(stderr, "Decryption failed\n"); + return 1; + } - // // Write the decrypted file to its own file - // writeFile(decryptedFilename, decryptedFile, decryptedFileLength); - // printf("Decrypted file written to \"%s\"\n", decryptedFilename); + printf("%d bytes decrypted\n", (int)decryptedFileLength); + std::cerr << O2->PrintAesKey() << std::endl; + // Write the decrypted file to its own file + std::string decryptedFilename = O2->writeFile(decryptedFile, decryptedFileLength); + printf("Decrypted file written to \"%s\"\n", decryptedFilename.c_str()); - // free(decryptedFile); - // free(file); + free(decryptedFile); + free(file); + delete O2; + delete O; return 0; } \ No newline at end of file diff --git a/aes.cpp.save b/aes.cpp.iteratif similarity index 100% rename from aes.cpp.save rename to aes.cpp.iteratif diff --git a/aes.hpp b/aes.hpp index 7bb6ffd..d3630c3 100644 --- a/aes.hpp +++ b/aes.hpp @@ -4,7 +4,11 @@ #include #include #include +#include #include +#include +#include +#include #include #include @@ -22,17 +26,28 @@ class aes { protected: unsigned char* aesKey; unsigned char* aesIV; + aes& clone(const aes& _e); + void init_all(); + void clear_all(); + void setExtension(std::string _ex); private: std::string filename; + std::string generateNewFilename(); + std::string extension = ".new"; public: + aes() {}; aes(std::string _filename); - aes(const aes& _e); - void init_all(); - void writeFile(unsigned char *file, size_t fileLength); + std::string writeFile(unsigned char *file, size_t fileLength); int readFile(unsigned char **file); - void clear_all(); - ~aes(); + + std::string PrintAesKey(); + void setAesIV(unsigned char* _aesIV); + void setAesKey(unsigned char* _aesKey); + unsigned char* getAesKey(); + unsigned char* getAesIV(); + + virtual ~aes() = default; }; aes::aes(std::string _filename) { @@ -41,8 +56,13 @@ aes::aes(std::string _filename) { aesIV = (unsigned char*)malloc(AES_KEYLEN/8); } -aes::aes(const aes& _e) : filename(_e.filename) { - std::cerr << "salut\n"; +aes& aes::clone(const aes& _e) { + filename = _e.filename; + + setAesKey(_e.aesKey); + setAesIV(_e.aesIV); + + return *this; } void aes::init_all() { @@ -54,7 +74,7 @@ void aes::init_all() { exit(FAILURE); } - #define USE_PBKDF + // #define USE_PBKDF #ifdef USE_PBKDF std::cerr << "utilisation de USE_PBKDF" << std::endl; // Get some random data to use as the AES pass and salt @@ -84,7 +104,7 @@ void aes::init_all() { } // peut être déporté le buffer lut avec methode pour travaillé dessus -int aes::readFile(unsigned char **file) { +int aes::readFile(unsigned char** file) { FILE *fd = fopen(filename.c_str(), "rb"); if(fd == NULL) { fprintf(stderr, "Failed to open file: %s\n", strerror(errno)); @@ -102,7 +122,7 @@ int aes::readFile(unsigned char **file) { fprintf(stderr, "Failed to allocate memory\n"); exit(1); } - + // Read the file into the buffer size_t bytesRead = fread(*file, 1, fileLength, fd); @@ -116,8 +136,15 @@ int aes::readFile(unsigned char **file) { return fileLength; } -void aes::writeFile(unsigned char *file, size_t fileLength) { - FILE *fd = fopen(filename.c_str(), "wb"); +std::string aes::generateNewFilename() { + std::regex e("\\b(.*[(\\.txt)]*)\\.[^(txt)].*"); + filename = std::regex_replace(filename, e,"$1"); + return filename+extension; +} + +std::string aes::writeFile(unsigned char *file, size_t fileLength) { + std::string newFile = generateNewFilename(); + FILE *fd = fopen(newFile.c_str(), "wb"); if(fd == NULL) { fprintf(stderr, "Failed to open file: %s\n", strerror(errno)); exit(1); @@ -131,6 +158,49 @@ void aes::writeFile(unsigned char *file, size_t fileLength) { } fclose(fd); + return newFile; +} + +void aes::setExtension(std::string _ex) { + extension = _ex; +} + +void aes::setAesKey(unsigned char* _aesKey) { + if(aesKey == NULL) + aesKey = (unsigned char*)malloc(AES_KEYLEN/8); + memcpy(aesKey , _aesKey, AES_KEYLEN/8); +} + +void aes::setAesIV(unsigned char* _aesIV) { + if(aesIV == NULL) + aesIV = (unsigned char*)malloc(AES_KEYLEN/8); + memcpy(aesIV , _aesIV, AES_KEYLEN/8); +} + + +unsigned char* aes::getAesKey() { + unsigned char* res = (unsigned char*)malloc(AES_KEYLEN/8); + memcpy(res, aesKey, AES_KEYLEN/8); + return res; +} + +unsigned char* aes::getAesIV() { + unsigned char* res = (unsigned char*)malloc(AES_KEYLEN/8); + memcpy(res, aesIV, AES_KEYLEN/8); + return res; +} + +std::string aes::PrintAesKey() { + std::stringstream ss; + std::string res; + + res = "aesKey : "; + for (int i = 0; i < 32; i++) { + ss << std::hex; + ss >> res; + res += std::string(1, (char)aesKey[i]+'\n'); + } + return res; } void aes::clear_all() { @@ -138,6 +208,4 @@ void aes::clear_all() { free(aesKey); } -aes::~aes() {} - #endif \ No newline at end of file diff --git a/crypt.hpp b/crypt.hpp index 1c4f123..e272add 100644 --- a/crypt.hpp +++ b/crypt.hpp @@ -9,7 +9,7 @@ private: public: crypt(std::string filename); - crypt(const aes& a); + crypt(const crypt& a); void init_all(); int aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **encMsg); ~crypt(); @@ -23,19 +23,21 @@ crypt::crypt(std::string filename) : aes(filename) { init_all(); } -crypt::crypt(const aes& _a) : aes(_a) { +crypt::crypt(const crypt& _a) : aes::aes() { + this->clone(_a); + aesEncryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); if(aesEncryptCtx == NULL) { exit(FAILURE); } - int res = EVP_CIPHER_CTX_copy(aesEncryptCtx, static_cast(_a).aesEncryptCtx); + + int res = EVP_CIPHER_CTX_copy(aesEncryptCtx, _a.aesEncryptCtx); if(!res) exit(FAILURE); - - // *aesEncryptCtx = (*(static_cast(_a)).aesEncryptCtx); } void crypt::init_all() { + setExtension(".enc"); aes::init_all(); EVP_CIPHER_CTX_init(aesEncryptCtx); } @@ -46,7 +48,7 @@ int crypt::aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **e *encMsg = (unsigned char*)malloc(msgLen + AES_BLOCK_SIZE); if(encMsg == NULL) return FAILURE; - + if(!EVP_EncryptInit_ex(aesEncryptCtx, EVP_aes_256_cbc(), NULL, aes::aesKey, aes::aesIV)) { return FAILURE; } @@ -60,8 +62,6 @@ int crypt::aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **e return FAILURE; } - EVP_CIPHER_CTX_cleanup(aesEncryptCtx); - return encMsgLen + blockLen; } diff --git a/crypto.ex b/crypto.ex deleted file mode 100755 index 082483d472149a9d49c4e08990eff8e4f8130951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62216 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 E0P3g`xBvhE diff --git a/decrypt.hpp b/decrypt.hpp index 9a78c83..2c48832 100644 --- a/decrypt.hpp +++ b/decrypt.hpp @@ -7,32 +7,44 @@ class decrypt : public aes { private: EVP_CIPHER_CTX* aesDecryptCtx; public: - decrypt(std::string filename); - decrypt(const aes& a); - void init_all(); - int aesDecrypt(unsigned char *encMsg, size_t encMsgLen, unsigned char **decMsg); - ~decrypt(); + decrypt(std::string filename, unsigned char* aesKey=0, unsigned char* aesIV=0); + decrypt(const decrypt& a); + void init_all(bool initSuper=true); + int aesDecrypt(unsigned char *encMsg, size_t encMsgLen, unsigned char** decMsg); + ~decrypt(); }; -decrypt::decrypt(std::string filename) : aes(filename) { +decrypt::decrypt(std::string filename, unsigned char* aesKey, unsigned char* aesIV) : aes(filename) { aesDecryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); if(aesDecryptCtx == NULL) { exit(FAILURE); } - init_all(); + if(aesKey && aesIV) { + setAesKey(aesKey); + setAesIV(aesIV); + init_all(false); + } + else + init_all(); } -decrypt::decrypt(const aes& _a) : aes(_a) { +decrypt::decrypt(const decrypt& _a) : aes::aes() { + this->clone(_a); aesDecryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); if(aesDecryptCtx == NULL) { exit(FAILURE); } - *aesDecryptCtx = (*(static_cast(_a)).aesDecryptCtx); + + int res = EVP_CIPHER_CTX_copy(aesDecryptCtx, _a.aesDecryptCtx); + if(!res) + exit(FAILURE); } -void decrypt::init_all() { - aes::init_all(); +void decrypt::init_all(bool initSuper) { + setExtension(".dec"); + if(initSuper) + aes::init_all(); EVP_CIPHER_CTX_init(aesDecryptCtx); } @@ -42,7 +54,7 @@ int decrypt::aesDecrypt(unsigned char *encMsg, size_t encMsgLen, unsigned char * *decMsg = (unsigned char*)malloc(encMsgLen); if(*decMsg == NULL) return FAILURE; - + if(!EVP_DecryptInit_ex(aesDecryptCtx, EVP_aes_256_cbc(), NULL, aes::aesKey, aes::aesIV)) { return FAILURE; } diff --git a/file b/file new file mode 100644 index 0000000..fbcf12d --- /dev/null +++ b/file @@ -0,0 +1 @@ +toto diff --git a/file.txt b/file.txt deleted file mode 100644 index f5efd25..0000000 --- a/file.txt +++ /dev/null @@ -1,7 +0,0 @@ -toto - - -rftyguhjio - -ftyguhiokpl -ùvfdjibngflkg,kflhi,omqcgikfsngchjfdngbfopdpioijn,hgiuhnb,sd; diff --git a/makefile b/makefile index 1775626..788d2a8 100644 --- a/makefile +++ b/makefile @@ -1,8 +1,11 @@ main: - @g++ -Wall -Wextra -ggdb -o crypto.ex aes.cpp -lcrypto + @g++ -Wall -Wextra -ggdb -o crypto.ex aes.cpp -lcrypto --std=c++14 run: - @./crypto.ex file.txt + @./crypto.ex file + +valgrind: + @valgrind --leak-check=full --track-origins=yes ./crypto.ex file clean: - @rm *.ex \ No newline at end of file + @rm *.ex