Ошибки
Измените char words[16]
на char words[18]
. Вам нужно 18 элементов в words
, потому что вы хотите обрабатывать ключи длиной до 16 символов, потому что fgets
будет читать ключ плюс символ новой строки, а буфер будет содержать нулевой символ после этого.
Изменить fgets(word,16, key)
на fgets(word, sizeof word, key)
. fgets
необходимо знать полный размер доступного буфера, включая пространство для символа новой строки и завершающего нулевого символа, а не только количество требуемых ключевых символов.
Удалить *(buf_ptr + 1) = '\0';
. Это не нужно, потому что sprintf
записывает завершающий нулевой символ и потому что правильное расположение для него будет buf_ptr
, а не buf_ptr+1
. Таким образом, это утверждение записывается за пределы места, выделенного для buf_str
.
Неверный код
Следующий код не вызывает проблем, с которыми вы сталкиваетесь, но он может быть написан лучше.
Объявите main
как int main(void)
или int main(int argc, char *argv[])
, а не int main()
.
Не пишите s[l] = 0x23;
, если только вам не нужно написать программу, которая использует набор символов, отличный от набора символов реализации C, с которой он компилируется и выполняется. Чтобы установить символ «#», используйте s[l] = '#';
.
. Если в sprintf(buf_ptr, "%02X", outbuf[i]);
вы измените %02X
на %02x
, тогда он будет использовать нижний регистр для шестнадцатеричного числа, и вы можете использовать стандарт strcmp
для сравнения буфера с cipherTextGiven
вместо необходимости использования пользовательской функции strcicmp
. Еще лучше, когда программа запускается, преобразует cipherTextGiven
из шестнадцатеричного в необработанный двоичный файл и, при тестировании ключей-кандидатов, сравнивает этот необработанный двоичный файл с вычисленным текстом шифра, используя memcmp
.
В этом:
i=strlen(words);
words[i-1]='\0';
i=strlen(words);
Измените последнюю строку на i = i-1;
, потому что мы знаем, что предыдущая строка уменьшила длину на единицу, поэтому мы можем установить длину напрямую, не вызывая strlen
снова. Многие программисты пишут эти строки примерно так:
i = strlen(words);
words[--i] = '\0';