87 lines
2.1 KiB
C++
87 lines
2.1 KiB
C++
#include "stdafx.h" // IWYU pragma: keep
|
|
#include "encryption.h"
|
|
#include "tree.h"
|
|
#include "functions.h"
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#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);
|
|
}
|