C RC4 супер странное поведение

поэтому я нашел реализацию RC4 на чистом C, которую использовал на своем сайте. Он работал очень хорошо, за исключением случаев, когда я вводил строку из 6 символов. Затем я получаю страницу внутренней ошибки. Выяснил, что только эта длина вызывает проблемы.

1.Крипта.c

unsigned char S[256];
unsigned int i, j;
void swap(unsigned char *s, unsigned int i, unsigned int j) {
unsigned char temp = s[i];
s[i] = s[j];
s[j] = temp;
}

/* KSA */
void rc4_init(unsigned char *key, unsigned int key_length) {
for (i = 0; i < 256; i++)
    S[i] = i;

for (i = j = 0; i < 256; i++) {
    j = (j + key[i % key_length] + S[i]) & 255;
    swap(S, i, j);
}

i = j = 0;
}

/* PRGA */
unsigned char rc4_output() {
i = (i + 1) & 255;
j = (j + S[i]) & 255;

swap(S, i, j);

return S[(S[i] + S[j]) & 255];
}

char *rc4_e(char *text, size_t text_length)
{
char *dup=(char *)malloc(text_length * sizeof(char));
strcpy(dup,text);
unsigned char *vector[2] = {"key", dup}; 
    int y;
    rc4_init(vector[0], strlen((char*)vector[0]));
char *out=(char *)malloc(text_length * sizeof(char) );
char *ptr=out;
    for (y = 0; y < strlen((char*)vector[1]); y++)
       ptr += sprintf(ptr,"%02X",vector[1][y] ^ rc4_output());
*(ptr + 1) = '\0';
return out;
}

2.Основной

#define SIZE 1000
char* pass=(char*)malloc(SIZE * sizeof(char));
char *RC4_pass=(char*)malloc(getSize(pass) * sizeof(char)); 
 strcpy(RC4_pass,rc4_e(pass,sizeof(pass))); 

Любые советы или мысли очень приветствуются. Просто хочу знать, плоха ли сама функция или остальная часть моего кода C. Благодарить!


person FisherDisinformation    schedule 14.04.2015    source источник
comment
сделать тестовую функцию командной строки и запустить ее под отладчиком   -  person pm100    schedule 15.04.2015
comment
относительно вызовов malloc(): 1) не приводить возвращаемое значение 2) всегда проверять (!=NULL) возвращаемое значение, чтобы гарантировать успешную операцию 3) не использовать 'sizeof(char)' в списке параметров, так как это значение всегда 1, и все, что он делает, это загромождает код.   -  person user3629249    schedule 15.04.2015
comment
этот код: 'sizof(pass)' всегда будет 4, потому что pass определяется как char* Я сомневаюсь, что на самом деле это то, что вы хотите   -  person user3629249    schedule 15.04.2015
comment
когда #define'ing числовое значение, всегда заключайте числовое значение в круглые скобки '(' и ')', чтобы избежать некоторых проблем с заменой текста.   -  person user3629249    schedule 15.04.2015
comment
чтобы сделать код более читабельным для нас, людей, сделайте отступ (скажем, 4 пробела) после каждой открывающей скобки '{' и уберите отступ перед каждой закрывающей скобкой '}'. Не используйте вкладки для отступов, так как в каждом редакторе/текстовом процессоре стопы табуляции/ширина табуляции устанавливаются по-разному.   -  person user3629249    schedule 15.04.2015
comment
параметры «i» и «j» маскируют глобальные переменные «i» и «j». Это очень плохая практика программирования. предложите включить все предупреждения при компиляции, чтобы такие проблемы выявлялись/исправлялись сейчас, а не тратились многие часы на отладку любых связанных проблем. правильным параметром для gcc будет '-Wshadow'   -  person user3629249    schedule 15.04.2015


Ответы (1)


Есть проблема с этой строкой:

char *dup=(char *)malloc(text_length * sizeof(char));

Вы забыли добавить дополнительный байт для завершающего '\0' в конце строки. Итак, в следующей строке:

strcpy(dup,text);

вы совершаете доступ за пределами массива dup, что вызывает неопределенное поведение.

person r3mainer    schedule 14.04.2015
comment
Да, это ошибка, которую я должен был исправить, так что спасибо за указание. Я думаю, что моя ошибка была не только в этой функции, но и в том, что я совместил ее с base64, что может быть реальной причиной ошибки. Спасибо еще раз! - person FisherDisinformation; 15.04.2015