如何解决对AES_ctr128_encrypt的未定义引用

时间:2018-11-14 06:24:10

标签: c encryption aes

您好,我正在使用此链接https://www.gurutechnologies.net/blog/aes-ctr-encryption-in-c/研究AES 128加密。 但是要运行示例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.h中有一个AES_ctr128_encrypt函数,并尝试重新编译它,但没有任何更改。我会提出一个问题,因为我找不到解决方案了。

这是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 :(得分:0)

假设您使用的是openssl 1.1.0,请参见What is exact alternate API instead of AES_ctr128_encrypt from openssl 1.1.0?

您可以使用CRYPTO_ctr128_encrypt代替AES_ctr128_encrypt