c++ - Openssl EVP "EVP_CTRL_GCM_GET_TAG"失败

标签 c++ encryption openssl evp-cipher

我在 C++ 中使用 Openssl EVP。不知何故获取标签失败。
我的代码:

int do_crypt(FILE *in, FILE *out){
    unsigned char inbuf[1024], aadbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
    int inlen, lenbuf, unused, outlen;
    EVP_CIPHER_CTX *ctx;

    unsigned char key[] = "0123456789abcdeF";
    unsigned char iv[] = "123456788765";
    unsigned char tag[16];

    ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);
    EVP_CipherInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL, do_encrypt);
    EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, sizeof(iv), NULL);

    OPENSSL_assert(EVP_CIPHER_CTX_key_length(ctx) == 16);
    OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) == 12);
    EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, 1);
    
    FILE * aad_f = fopen("aad.txt", "rb");
    
    for(;;){
        size_t a = fread(aadbuf, 1, 1024, aad_f);
        lenbuf = int(a);
        
        if (lenbuf <= 0) break;
        EVP_CipherUpdate(ctx, NULL, &unused, aadbuf, lenbuf);
     }
    /* Input text */
    for(;;){
        size_t a = fread(inbuf, 1, 1024, in);
        inlen = int(a);
        if (inlen <= 0) break;
        EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen);
        fwrite(outbuf, 1, outlen, out);
        }
    
    EVP_CipherFinal_ex(ctx, outbuf, &outlen);
    EVP_CIPHER_CTX_free(ctx);
    fwrite(outbuf, 1, outlen, out);
    
    if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag)){
         cout << "error get tag" << endl;
         return 0;
   }
        FILE * tag_f = fopen("tag.txt", "wb");
        fwrite(tag, 1, sizeof(tag), tag_f);
        cout << tag << endl;
    }
    return 0;
    
    }
但为什么?所有其他的 EVP 功能都做得很好。我想念什么?我必须调用其他功能吗?代替标签,@\267* 被写入 tag.txt 文件。

最佳答案

代码中有两个错误:

  • 由于sizeof用于确定 IV 的长度,0 终止符也被计算在内,并确定错误的长度 13。而不是 sizeof , strlen必须应用,返回正确的值 12。
  • 在确定标签之前释放上下文,即 EVP_CIPHER_CTX_freeEVP_CIPHER_CTX_ctrl 之前调用.这个顺序必须颠倒。

  • 通过这些更改,将创建正确的密文和标签。
    请注意,固定 key /IV 对只能用于测试。实际上, key /IV 对只能使用一次,尤其是对于 GCM。

    关于c++ - Openssl EVP "EVP_CTRL_GCM_GET_TAG"失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63690501/

    相关文章:

    c++ - 强制派生自类

    java - SSL 如何保护数据免遭嗅探?

    linux - OpenSSL命令行解密打嗝

    openssl CLI - 验证整个认证链的 CRL

    c++ - 实例化成员模板函数时存在错误(?)编译器行为

    c++ - 如何使用位图实现按钮类型的效果

    c++ - 当范围消失时,我们如何通过引用返回变量

    c - 修改c字符串的每个字符

    java - 解密错误填充错误

    c - OpenSSL导致丢包?奇怪的CPU使用率