J'ai essayé de créer un fichier d'en-tête XOR de base pour une utilisation dans certains programmes futurs. Jusqu'à présent, j'ai réussi presque tout à faire fonctionner, mais je ne semble pas pouvoir utiliser la même fonction deux fois. Si j'appelle la fonction pour chiffrer la chaîne, ça marche, mais ensuite si je l'appelle à nouveau, il plante. Je ne sais pas si je fais quelque chose de mal au niveau de la mémoire ou si je manque quelque chose d'évident. J'espère que quelqu'un pourra pointer une erreur dans cela parce que je ne semble trouver aucun problème.
Édition : Si poster autant est trop, n'hésitez pas à raccourcir le code. J'ai déjà enlevé pas mal de choses, donc je ne suis pas en train de coller tout mon projet en espérant que quelqu'un le répare.
// Main.c
#define MAX_LENGTH 255
#define KEY_SIZE 8
int main(int argc, char *argv[]) {
//Get String to XOR
char *input = malloc (MAX_LENGTH);
printf("Entrez une chaîne à chiffrer : ");
fgets(input, MAX_LENGTH, stdin);
if(input[strlen (input) - 1] == '\n') {
input[strlen (input) - 1] = '\0';
}
//Créer une clé aléatoire
char *pass = _create_key(KEY_SIZE);
int len = strlen (input);
printf("Longueur de la clé est %d\n", KEY_SIZE);
printf("Chaîne Entrée : %s - Mot de passe : %s\n", input, pass);
//Chiffrement fonctionne bien
char *encrypted = malloc (sizeof (input));
_xor_str_s(input, pass, len, encrypted);
printf("Chaîne Chiffrée : %s\n", encrypted);
char *decrypted = malloc (sizeof (input));
//Plante ici
_xor_str_s(encrypted, pass, len, decrypted);
printf("Chaîne Déchiffrée : %s\n", decrypted);
return 0;
}
//Fonction dans le fichier d'en-tête
void _xor_str_s(char *str, char *pass, int len, char *out) {
int i = 0;
for(i = 0; i < len; i++) {
*(out + i) = str[i] ^ pass[i % strlen (pass)];
}
*(out + i) = 0;
}
char * _create_key(int len) {
len = !len ? 16 : len;
char *ret = (char *)malloc (len);
unsigned int _GLOBAL_SEED_ = (unsigned int)time(NULL);
srand (_GLOBAL_SEED_);
int i = 0;
for(i = 0; i < len; i++) {
ret[i] = (char)(rand() + 1); //+1 évite NULL
}
ret[i] = '\0';
return ret;
}