3 votes

La fonction ne fonctionne qu'une seule fois - C

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;
}

11voto

Johnny Mopp Points 6485
char *encrypted = malloc (sizeof (input));

est probablement le problème car cela sera toujours sizeof(char *). Je pense que vous voulez

char *encrypted = malloc (strlen (input) + 1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X