2012-03-13 2 views
3

Я пытался создать базовый заголовочный файл XOR для использования в некоторых будущих программах. До сих пор я получил почти все, чтобы работать, но я не могу использовать одну и ту же функцию дважды. Если я вызываю функцию для шифрования строки, она работает, но если я ее снова вызову, она сработает. Я не знаю, делаю ли я что-то неправильное, или я не вижу чего-то очевидного. Надеюсь, кто-то может указать на недостаток в этом, потому что я не могу найти ничего плохого.Функция работает только один раз - 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

Какое сообщение об ошибке вы получите? –

+0

Ошибка компиляции, она просто падает во время выполнения без сообщения. Еще одна вещь, которую я должен был добавить, заключается в том, что она работает с четырьмя буквами и некоторыми другими длинами, но всегда сбрасывается на что-либо, делящееся на 8 и некоторые другие случайные длины. Еще одна вещь, которая заставляет меня задаться вопросом, что происходит. – ozdrgnaDiies

+0

Вам не указана контрольная проверка 'NULL' в' _xor_str_s'. Всегда проверяйте «NULL» после вызова «malloc». –

ответ

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

, вероятно, проблема, как это всегда будет sizeof(char *). Я думаю, вы хотите

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

Это яркий пример того, насколько легко замаскировать ошибку, когда вы уверены, что это правильно. Это мгновенно устранило проблему. Всегда хорошо иметь свежую пару глаз, чтобы разглядеть эти вещи. Спасибо за ответ! – ozdrgnaDiies

Смежные вопросы