#include "stdafx.h" // IWYU pragma: keep #include "encryption.h" #include "tree.h" #include "functions.h" #ifdef _WIN32 #include #endif // 1re étape: chaque bit de la clé d'entrée est un gauche ou droite dans l'arbre // l'arbre est de profondeur inégale et random Node* gen_tree(){ Node* r = new Node(); // root r->value ^= '1'; Node* a = new Node(); // left a->value ^= '8'; Node* aa = new Node(); // left left aa->value ^= ('3'^0xbe); Node* ab = new Node(); ab->value ^= ('7'^0xef); Node* b = new Node(); b->value ^= '5'; Node* ba = new Node(); ba->value ^= '4'; Node* bb = new Node(); bb->value ^= '2'; // defining tree links r->left = a; r->right = b; a->left = aa; a->right = ab; b->left = ba; b->right = bb; aa->value^=0xbe; ab->value^=0xef; return r; } char* derive_key_from_tree(char* key){ auto stdfunclist = new Obfuscated_stdFunclist(); char* res = (char*) stdfunclist->obfusc_malloc(sizeof(char)*9*8); Node* root = gen_tree(); Node* current = root; int i_key = 0; int i_res = 0; while(key[i_key] != '\0'){ char character = key[i_key]; for (int j = 0; j < 8; j++){ int bit = ((character >> j) & 0x01); // gets byte number j if(bit){ // right current = current->r(); } else { // left current = current->l(); } if(current->is_leaf()){ res[i_res] = current->v(); current = root; i_res ++; } } i_key++; } res[i_res] = current->v(); res[i_res+1] = '\0'; return res; } void encrypt_decrypt(char* key, char* msg){ #ifdef _WIN32 DWORD old; VirtualProtect(msg, 0x100, PAGE_EXECUTE_READWRITE, &old); #endif char* newkey = derive_key_from_tree(key); // printf("%s\n",newkey); int i = 0; int j = 0; while (msg[i] != '\0'){ msg[i] ^= newkey[j]; // printf("\\x%x",msg[i]); j++; if (newkey[j] == '\0'){ j = 0; } i++; } // printf("%s\n",msg); }