2012-03-13 74 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

你收到的錯誤信息是什麼? – 2012-03-13 04:04:41

+0

沒有編譯錯誤,它只是在運行時崩潰而沒有消息。我應該補充的另一件事是,它可以處理4個字母和其他長度的字符,但總是可以在任何可以被8和其他隨機長度整除的東西上崩潰。另一件事讓我想知道發生了什麼。 – ozdrgnaDiies 2012-03-13 04:06:44

+0

您在'_xor_str_s'中缺少'NULL'引用檢查。在'malloc'調用之後總是檢查'NULL'。 – 2012-03-13 04:07:40

回答

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

可能是問題,因爲這將永遠是sizeof(char *)。我想你想要

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

這是一個很好的例子,說明當你確定它是正確的時候掩飾錯誤是多麼容易。這立即解決了問題。總是很好,有一個新的眼睛來發現這些類型的東西。感謝你的回答! – ozdrgnaDiies 2012-03-13 04:16:55