1

您好我正在尝试编写一个使用 EVP_Encrypt Openssl 库的程序,但我遇到了一些麻烦。我使用了用 openssl 河豚简单示例插入垃圾字符的帖子协助作为指导,认为它应该给我一个很好的起点。但是,我很确定出了什么问题,但我不知道是什么。我知道有问题,因为我使用 openssl 测试是否可以解密密文。命令是:我的程序创建的密文文件在cat file.enc | openssl bf-cbc -d -K cafefacedeadbeef -iv 0 > output哪里。file.enc运行 Openssl 命令后,我收到此错误消息bad decrypt 7418:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt: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;
}
4

0 回答 0