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);
父主题: 常见问题