2016-10-18 10 views
0

Cで文字列を暗号化する関数を作成しましたが(GCCを使用)、復号化された文字列の最後にランダムな文字があります。 この関数は、入力文字列の長さを最初の文字に、使用されたキー(最初の文字-1)を2番目に保存します。暗号化されるすべての文字列の長さは10〜30です。したがって、charとして格納するときに問題がないことを願っています。ここ文字列の末尾のランダムな文字列

全体コード:

#include <stdio.h> //printf 
#include <stdlib.h> //malloc 
#include <string.h> //strlen 

char* x(const char* toEncrypt); 
char* y(const char* toDecrypt); 

int main() { 
    const char *secret = "hellohello"; 
    printf("original: %s\n", secret); 

    const char* crypted = x(secret); 
    printf("crypted: %s\n", crypted); 

    const char* decrypted = y(crypted); 
    printf("decrypted: %s\n", decrypted); 

    return 0; 
} 

char* x(const char* toEncrypt) { 
    printf("x->toEncrypt = %s\n", toEncrypt); 

    int offset = 0, i = 0; 
    int length = strlen(toEncrypt); 
    printf("\tx->length = %d\n", length); 

    char key = ((char)(*toEncrypt))-1; 
    printf("\tx->key = %c\n", key); 

    char* output = (char*)malloc(length+3); //toEncrypt length + (length + key + null) 

    output[offset++] = (char)length; 
    output[offset++] = key; 

    for (i = 0; i < length; i++) { 
     printf("i = %d\toffset = %d\tchar = %c\n", i, offset, toEncrypt[i]); 
     output[offset++] = toEncrypt[i]^key; 
    } 
    output[offset] = '\0'; 

    printf("\tx->output = %s\n", output); 
    return output; 
} 

char* y(const char* toDecrypt) { 
    printf("y->toDecrypt = %s\n", toDecrypt); 

    int offset = 0, i = 0; 
    int length = (int)toDecrypt[offset++] ; 
    printf("\tx->length = %d\n", length); 

    char key = (char)toDecrypt[offset++]; 
    printf("\ty->key = %c\n", key); 

    char* output = (char*)malloc(length+1); 

    for (i = 0; i < length; i++) { 
     printf("i = %d\toffset = %d\tchar = %c\n", i, offset, (char)toDecrypt[offset] ^key); 
     output[i] = toDecrypt[offset++]^key; 
    } 

    output[offset] = '\0'; 

    printf("\ty->output = %s\n", output); 
    return output; 
} 

そして出力:私は、問題はこの文にあると思います

original: hellohello 
x->toEncrypt = hellohello 
     x->length = 10 
     x->key = g 
i = 0 offset = 2  char = h 
i = 1 offset = 3  char = e 
i = 2 offset = 4  char = l 
i = 3 offset = 5  char = l 
i = 4 offset = 6  char = o 
i = 5 offset = 7  char = h 
i = 6 offset = 8  char = e 
i = 7 offset = 9  char = l 
i = 8 offset = 10  char = l 
i = 9 offset = 11  char = o 
     x->output = 
g 
crypted: 
g 
y->toDecrypt = 
g 
     x->length = 10 
     y->key = g 
i = 0 offset = 2  char = h 
i = 1 offset = 3  char = e 
i = 2 offset = 4  char = l 
i = 3 offset = 5  char = l 
i = 4 offset = 6  char = o 
i = 5 offset = 7  char = h 
i = 6 offset = 8  char = e 
i = 7 offset = 9  char = l 
i = 8 offset = 10  char = l 
i = 9 offset = 11  char = o 
     y->output = hellohellobe 
decrypted: hellohellobe 
+0

必ず 'malloc()'の戻り値をチェックし、戻り値をキャストしないでください。 –

+2

私の魔法のクリスタルボールは、あなたがどこにいるかというとヌルターミネーターを書いていないと私に伝えています。コードを読むことでこれが確認されます。 'y'では' offset'と 'i'の違いを調べましたか? – immibis

答えて

6

(機能y()中 - 機能x()で同じ文はOKです):

output[offset] = '\0'; 

これは、次のとおりです。

output[i] = '\0'; 

これを変更すると効果があります。

関連する問題