aes128算法gcm接口
加密
int openssl_aes128_encrypt_gcm(unsigned char *key,unsigned char *iv,uint8_t *aad,int aad_size,unsigned char *in_buf,int in_len,unsigned char *out_buf,int* out_len,unsigned char *tag)
{int len = 0,enc_len=0;EVP_CIPHER_CTX* ctx = NULL;ctx = EVP_CIPHER_CTX_new();EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL);EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, 12, NULL);EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv);EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_size);EVP_EncryptUpdate(ctx, out_buf, &len, in_buf, in_len);enc_len = len;
EVP_EncryptFinal_ex(ctx, out_buf+enc_len, &len);enc_len += len;EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, tag);
EVP_CIPHER_CTX_free(ctx);*out_len = enc_len;
#if 0printf("%s %d key=%d\n", __func__, __LINE__, 16);data_dump(key, 16);printf("%s %d iv=%d\n", __func__, __LINE__, 16);data_dump(iv, 16);printf("%s %d in_buf=%d\n", __func__, __LINE__, in_len);data_dump(in_buf, in_len);printf("%s %d out_buf=%d\n", __func__, __LINE__, in_len);data_dump(out_buf, in_len);printf("%s %d tag=%d\n", __func__, __LINE__, 16);data_dump(tag, 16);
#endifreturn 0;
}
解密
int openssl_aes128_decrypt_gcm(unsigned char *key,unsigned char *iv,uint8_t *aad,int aad_size,unsigned char *in_buf,int in_len,unsigned char *out_buf,int* out_len,unsigned char *tag)
{int len = 0;printf("%s %d\n", __func__, __LINE__);EVP_CIPHER_CTX *dec_ctx = EVP_CIPHER_CTX_new();EVP_DecryptInit_ex(dec_ctx, EVP_aes_128_gcm(), NULL, NULL, NULL);EVP_CIPHER_CTX_ctrl(dec_ctx, EVP_CTRL_AEAD_SET_IVLEN, 12, NULL);EVP_DecryptInit_ex(dec_ctx, NULL, NULL, key, iv);EVP_DecryptUpdate(dec_ctx, NULL, &len, aad, aad_size);EVP_DecryptUpdate(dec_ctx, out_buf, &len, in_buf, in_len);*out_len = len;EVP_DecryptFinal_ex(dec_ctx, out_buf + len, &len);*out_len += len;EVP_CIPHER_CTX_ctrl(dec_ctx, EVP_CTRL_GCM_SET_TAG, 16, tag);return 0;}