C 使用EVP_加密时出现问题

C 使用EVP_加密时出现问题,c,encryption,openssl,corruption,C,Encryption,Openssl,Corruption,嗨,我正在尝试编写一个使用EVP_Encrypt Openssl库的程序,但是我遇到了一些问题。我用这篇文章作为指导,认为它应该给我一个好的起点。然而,我很确定有些地方出了问题,但我不知道是什么。我知道有些地方不对劲,因为我使用openssl测试密文是否可以解密。命令是:cat file.enc | openssl bf cbc-d-K cafefacedeadbeef-iv 0>output,其中file.enc是我的程序创建的密文文件。在运行Openssl命令之后,我得到了这个错误消息bad

嗨,我正在尝试编写一个使用EVP_Encrypt Openssl库的程序,但是我遇到了一些问题。我用这篇文章作为指导,认为它应该给我一个好的起点。然而,我很确定有些地方出了问题,但我不知道是什么。我知道有些地方不对劲,因为我使用openssl测试密文是否可以解密。命令是:cat file.enc | openssl bf cbc-d-K cafefacedeadbeef-iv 0>output,其中file.enc是我的程序创建的密文文件。在运行Openssl命令之后,我得到了这个错误消息bad decrypt 7418:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:错误解密:EVP_enc.c:330:此问题可能与我试图0出初始化向量或读取密钥的方式有关,但我不是正数。任何帮助都会很好

加密功能:

void encrypt(unsigned char *key, unsigned char* msg)
{
        unsigned char iv[8]={0};

        int length = 0;
        EVP_CIPHER_CTX enc_struct;
        EVP_CIPHER_CTX_init(&enc_struct);
        EVP_EncryptInit(&enc_struct, EVP_bf_cbc(), key, iv);

        unsigned char* out = (unsigned char *) malloc(sizeof(unsigned char) * 1024 +EVP_MAX_BLOCK_LENGTH);

        if (EVP_EncryptUpdate(&enc_struct, out, &length, msg, 8) != 1)
        {
                printf("error update\n");
                exit(EXIT_FAILURE);
        }

        write(STDOUT_FILENO, out, length);

        int temp_length = 0;

        if(EVP_EncryptFinal(&enc_struct, out+length, &temp_length) !=1)
        {
                printf("error final\n");
                exit(EXIT_FAILURE);
        }

        write(STDOUT_FILENO, out+length, temp_length);

        EVP_CIPHER_CTX_cleanup(&enc_struct);

        free(out);
}
调用加密函数并读取密钥

int main(int argc, char* argv[])
{
        setprogname("bf");
        setproctitle("-%s", "bf");
        int decrypt_flag = 0;
        int encrypt_flag = 0;
        int key_flag = 0;
        char ch;
        unsigned char raw_key[16] = {'\0'};

        if (argc <=1)
              help();
        memcpy(raw_key, argv[optind], 24);

        bytes_read = read(STDIN_FILENO, msg, 8);
        if (encrypt_flag)
                encrypt(raw_key, msg);
        else
                decrypt();
        return 0;
}

我认为您需要使用特定于openssl的方法来派生密钥。。。它叫