Как решить неопределенную ссылку на `AES_ctr128_encrypt ' - PullRequest
0 голосов
/ 14 ноября 2018

Здравствуйте, я изучал шифрование AES 128 по этой ссылке https://www.gurutechnologies.net/blog/aes-ctr-encryption-in-c/. Но для запуска примера main.c скомпилировано следующим образом

gcc main.c -lm -lcrypto -lssl -o mai.c

Затем я получаю следующую ошибку:

main.c: In function ‘fencrypt’:
main.c:83:3: warning: implicit declaration of function ‘AES_ctr128_encrypt’; did you mean ‘AES_cfb128_encrypt’? [-Wimplicit-function-declaration]
   AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);
   ^~~~~~~~~~~~~~~~~~
   AES_cfb128_encrypt
/tmp/cc1Gq6eV.o: In function `fencrypt':
main.c:(.text+0x253): undefined reference to `AES_ctr128_encrypt'
/tmp/cc1Gq6eV.o: In function `fdecrypt':
main.c:(.text+0x449): undefined reference to `AES_ctr128_encrypt'
collect2: error: ld returned 1 exit status

Чтобы это исправить, я захожу в каталог, в котором находится openssl, и в заголовочном файле aes.h я пытался найти функцию AES_ctr128_encrypt, но этого не произошло, поэтому я обновил openssl и подтвердил, что существует AES_ctr128_encryptфункционировал в aes.h и пытался его перекомпилировать, но ничего не изменилось.Я оставлю вопрос, потому что я не мог найти решение больше.

Это код для AES_ctr128_encrypt

void fencrypt(char* read, char* write, const unsigned char* enc_key)
{ 
    if(!RAND_bytes(iv, AES_BLOCK_SIZE))
    {
        fprintf(stderr, "Could not create random bytes.");
        exit(1);    
    }

    readFile = fopen(read,"rb"); // The b is required in windows.
    writeFile = fopen(write,"wb");

    if(readFile==NULL)  
    {
        fprintf(stderr, "Read file is null."); 
        exit(1);
    }

    if(writeFile==NULL)
    {
        fprintf(stderr, "Write file is null."); 
        exit(1);
    }

    fwrite(iv, 1, 8, writeFile); // IV bytes 1 - 8
    fwrite("\0\0\0\0\0\0\0\0", 1, 8, writeFile); // Fill the last 4 with null bytes 9 - 16

    //Initializing the encryption KEY
    if (AES_set_encrypt_key(enc_key, 128, &key) < 0)
    {
        fprintf(stderr, "Could not set encryption key.");
        exit(1); 
    }

    init_ctr(&state, iv); //Counter call
    //Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext  
    while(1)    
    {
        bytes_read = fread(indata, 1, AES_BLOCK_SIZE, readFile); 
        AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

        bytes_written = fwrite(outdata, 1, bytes_read, writeFile); 
        if (bytes_read < AES_BLOCK_SIZE)
        {
            break;
        }
    }

    fclose(writeFile);
    fclose(readFile);
}

void fdecrypt(char* read, char* write, const unsigned char* enc_key)
{   

    readFile=fopen(read,"rb"); // The b is required in windows.
    writeFile=fopen(write,"wb");

    if(readFile==NULL)
    {
        fprintf(stderr,"Read file is null."); 
        exit(1);
    }

    if(writeFile==NULL) 
    {
        fprintf(stderr, "Write file is null."); 
        exit(1);
    }

    fread(iv, 1, AES_BLOCK_SIZE, readFile); 

    //Initializing the encryption KEY
    if (AES_set_encrypt_key(enc_key, 128, &key) < 0)
    {
        fprintf(stderr, "Could not set decryption key.");
        exit(1);
    }

    init_ctr(&state, iv);//Counter call
    //Encrypting Blocks of 16 bytes and writing the output.txt with ciphertext       
    while(1)    
    {
        bytes_read = fread(indata, 1, AES_BLOCK_SIZE, readFile);    
        //printf("%i\n", state.num);
        AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

        bytes_written = fwrite(outdata, 1, bytes_read, writeFile); 
        if (bytes_read < AES_BLOCK_SIZE) 
        {
            break;
        }
    }
    fclose(writeFile); 
    fclose(readFile); 
}

Заранее спасибо.

1 Ответ

0 голосов
/ 14 ноября 2018

Если вы используете openssl 1.1.0, см. Что такое точный альтернативный API вместо AES_ctr128_encrypt из openssl 1.1.0?

Вы можете использовать CRYPTO_ctr128_encrypt вместо AES_ctr128_encrypt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...