Я работаю над добавлением тестовой программы на C, которая реализует функции openssl RC4. Страница руководства в Linux дает мне формат для функций и говорит включить заголовочный файл, что я и сделал. Однако, когда я пытаюсь скомпилировать, он продолжает выдавать мне ошибки.
/tmp/ccQwY6Sr.o: In function `main':
rc4.c:(.text+0xd5): undefined reference to `RC4_set_key'
rc4.c:(.text+0xef): undefined reference to `RC4'
collect2: error: ld returned 1 exit status
Удивительно, но я не могу найти никакой информации по этому конкретному вопросу в Интернете. Как неопределенная ссылка включена в заголовочный файл, который должен их определять?
Если бы кто-нибудь мог указать мне в правильном направлении здесь, я был бы признателен за помощь.
моя строка компиляции:
gcc rc4.c -o rc4
моя программа:
#include <openssl/rc4.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
FILE* inFile;
char * bufferIn;
char * bufferOut;
char data[] = "PASSword123";
RC4_KEY * key;
inFile = fopen("/home/chris/Desktop/testfile.txt", "rb+");
fseek(inFile, 0, SEEK_END);
int size = ftell(inFile);
rewind(inFile);
bufferIn = (char*)malloc(sizeof(char)*size);
bufferOut = (char*)malloc(sizeof(char)*size);
fread(bufferIn, 1, size, inFile);
rewind(inFile);
RC4_set_key(key, 11, data);
RC4(key, size, bufferIn, bufferOut);
free(bufferIn);
free(bufferOut);
return 0;
}
my compile line is: gcc rc4.c -o rc4
Заголовок <openssl/rc4.h>
включает только объявления функций RC4, а не их определения. Эти функции определены в библиотеке libcrypto, которая является частью OpenSSL. Добавьте -lcrypto
в свою командную строку, чтобы связать эту библиотеку.
Кроме того, RC4 не считается безопасным. Избегайте его использования.
fseek(inFile, 0, SEEK_END);
— это неопределенное поведение для бинарного потока в строго соответствующем коде C. Почему этому учат как «как получить размер файла», мне непонятно. Для определения «размера файла» требуются методы, специфичные для реализации, иftell()
в любом случае ограничен 2 ГБ на 32-разрядных машинах.