2012-03-13 3 views
3

J'ai essayé de créer un fichier d'en-tête XOR de base à utiliser dans certains futurs programmes. Jusqu'à présent, j'ai presque tout pour travailler, mais je n'arrive pas à utiliser la même fonction deux fois. Si j'appelle la fonction pour crypter la chaîne, cela fonctionne, mais si je l'appelle à nouveau, il se bloque. Je ne sais pas si je fais quelque chose de mal en mémoire ou si je manque quelque chose d'évident. J'espère que quelqu'un peut signaler une faille dans cela parce que je n'arrive pas à trouver quelque chose de mal. Editer: Si poster trop c'est trop, n'hésitez pas à couper le code. J'ai déjà sorti un peu, donc je ne suis pas seulement coller mon projet et j'espère que quelqu'un le corrigera.La fonction ne fonctionne qu'une seule fois - C

// 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("Enter a string to encrypt: "); 
    fgets(input, MAX_LENGTH, stdin); 

    if(input[strlen (input) - 1] == '\n') { 
     input[strlen (input) - 1] = '\0'; 
    } 

    //Create a random key 
    char *pass = _create_key(KEY_SIZE); 
    int len = strlen (input); 
    printf("Length of key is %d\n", KEY_SIZE); 
    printf("Entered String: %s - Password: %s\n", input, pass); 

    //Encrypt works fine 
    char *encrypted = malloc (sizeof (input)); 
    _xor_str_s(input, pass, len, encrypted); 
    printf("Encrypted String: %s\n", encrypted); 

    char *decrypted = malloc (sizeof (input)); 
    //Crashes here 
    _xor_str_s(encrypted, pass, len, decrypted); 
    printf("Decrypted String: %s\n", decrypted); 
    return 0; 
} 

//Header File Function 
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 avoids NULL 
    } 
    ret[i] = '\0'; 
    return ret; 
} 
+0

Quel est le message d'erreur que vous recevez? –

+0

Il n'y a pas d'erreur de compilation, il se bloque juste pendant l'exécution sans message. Une autre chose que j'aurais dû ajouter est que cela fonctionne avec des mots de 4 lettres et d'autres longueurs, mais toujours se bloque sur tout ce qui est divisible par 8 et d'autres longueurs aléatoires. Juste une autre chose qui me fait me demander ce qui se passe. – ozdrgnaDiies

+0

Il vous manque une vérification de référence 'NULL' dans' _xor_str_s'. Vérifiez toujours 'NULL' après un appel' malloc'. –

Répondre

11
char *encrypted = malloc (sizeof (input)); 

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

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

Ceci est un excellent exemple de la facilité avec laquelle il est possible de masquer une erreur lorsque vous êtes sûr que c'est correct. Cela a instantanément résolu le problème. Toujours bon d'avoir une nouvelle paire d'yeux pour repérer ce genre de choses. Merci d'avoir répondu! – ozdrgnaDiies

Questions connexes