2012-03-13 7 views
3

今後のいくつかのプログラムで使用するための基本的なXORヘッダーファイルを作成しようとしています。これまでのところ、私はほとんど全てを動かすことができましたが、同じ機能を2回使用することはできません。文字列を暗号化する関数を呼び出すと動作しますが、再度呼び出すとクラッシュします。私は何か記憶的に間違ったやり方をしているのか分かりませんか分かりません。私は間違ったことを見つけることができないので、誰かがこれの欠陥を指摘できることを願っています。機能は一度しか動作しません - 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

コンパイルエラーはなく、実行時にメッセージなしでクラッシュします。私が追加すべきもう一つのことは、4文字の単語とその他の長さで動作するが、8で割り切れるものやその他のランダムな長さではいつもクラッシュするということだ。私は何が起こっているのだろうかと思います。 – ozdrgnaDiies

+0

'_xor_str_s'に' NULL'参照チェックがありません。 'malloc'呼び出しの後で常に' NULL'をチェックしてください。 –

答えて

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

これは常にsizeof(char *)になるように、おそらく問題です。あなたが望むと思います

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

これは、正しいと確信している間にエラーを光沢化するのが簡単であることを示す優れた例です。これは瞬時に問題を解決しました。これらの種類のものを見つけ出すためには、常に新しい目を持つのは良いことです。答えをありがとう! – ozdrgnaDiies

関連する問題