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 0
printf("%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);
#endif
return 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;
}