2016-10-18 8 views
0

Я сделал функцию для шифрования строки в C (с GCC), но я получаю случайные символы в конце расшифрованной строки. Функция сохранит длину входной строки с первым символом и используемым ключом (первый символ -1) вторым. Все строки, которые должны быть зашифрованы, имеют длину от 10 до 30, поэтому я надеюсь, что при преобразовании в хранилище нет никаких проблем.Случайные символы в конце строки

Весь код здесь:

#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() ОК):

output[offset] = '\0'; 

Должно быть:

output[i] = '\0'; 

Изменение этого должно работать.