C RC4 супер странное поведение
Поэтому я нашел реализацию RC4 на чистом C, которую я использовал на своем сайте. Это работало очень хорошо, кроме случаев, когда я вводил строку из 6 символов. Тогда я получаю страницу внутренней ошибки. Выяснил, что только эта длина вызывает проблемы.
1.Crypt.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.Main
#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-кода. Поблагодарить!
1 ответ
Существует проблема с этой строкой:
char *dup=(char *)malloc(text_length * sizeof(char));
Вы забыли добавить дополнительный байт для завершения '\0'
в конце строки. Итак, на следующей строке:
strcpy(dup,text);
вы делаете доступ за пределы массива dup
, что вызывает неопределенное поведение.