Developers
Resource
文档评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

SM4-GCM获取/设置TAG

SM4-GCM算法利用tag进行完整性校验:加密数据时,在final阶段生成tag,用户可以通过EVP_CIPHER_CTX_ctrl接口获取tag,解密数据时,用户可以通过EVP_CIPHER_CTX_ctrl接口先设置tag,final阶段会与设置的tag比较,达到数据完整性校验的效果。

    EVP_CIPHER_CTX* ectx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ectx, gcm, g_engine, g_key16, g_iv16);
    for (int off = 0; off < 32; off += 8) {
        EVP_EncryptUpdate(ectx, ct + totl_enc, &outl, pt + off, 8);
        totl_enc += outl;
    }
    EVP_EncryptFinal_ex(ectx, ct + totl_enc, &outl);
    totl_enc += outl;
    // get tag
    EVP_CIPHER_CTX_ctrl(ectx, EVP_CTRL_GCM_GET_TAG, 16, tag);
    EVP_CIPHER_CTX_free(ectx);
    EVP_CIPHER_CTX* dctx = EVP_CIPHER_CTX_new();
    EVP_DecryptInit_ex(dctx, gcm, g_engine, g_key16, g_iv16);
    // set tag
    EVP_CIPHER_CTX_ctrl(dctx, EVP_CTRL_GCM_SET_TAG, 16, tag);
    for (int off = 0; off < totl_enc; off += 8) {
        EVP_DecryptUpdate(dctx, dt + totl_dec, &outl, ct + off, 8);
        totl_dec += outl;
    }
    EVP_DecryptFinal_ex(dctx, dt + totl_dec, &outl);
    totl_dec += outl;
    EVP_CIPHER_CTX_free(dctx);