aes128算法CBC接口
加密接口
说明
- EVP_EncryptInit_ex初始化函数,输入算法类型、key、iv
- EVP_EncryptUpdate,加密函数,可以迭代加密,加密时注意输入位置和长度获取,每次迭代加密时,数据偏移要加上上一次运算获取的长度
- EVP_EncryptFinal_ex,加密结束,注意该函数如输出长度,则要添加到输出的数据长度中
- 整体说加密没有特殊情况。按接口调用即可。不同于解密。
int openssl_aes128_encrypt_cbc(unsigned char *key,unsigned char *iv, unsigned char *in_buf, int in_len, unsigned char *out_buf,int* out_len)
{
EVP_CIPHER_CTX* ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
printf("%s %d\n", __func__, __LINE__);
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_set_padding(ctx, 0);
if (!EVP_EncryptUpdate(ctx, out_buf, out_len, in_buf, in_len))
{
EVP_CIPHER_CTX_free(ctx);
return -1;
}
int tmplen = 0;
if (!EVP_EncryptFinal_ex(ctx, out_buf + *out_len, &tmplen))
{
EVP_CIPHER_CTX_free(ctx);
return -2;
}
*out_len += tmplen;
EVP_CIPHER_CTX_free(ctx);
return 0 ;
}
解密接口
说明
解密接口不同于加密接口,当数据位16B整数倍时,解密需要再次调用update函数而不是finish函数,代码如下:
int openssl_aes128_decrypt_cbc(unsigned char *key,unsigned char *iv, unsigned char *in_buf, int in_len, unsigned char *out_buf,int* out_len)
{
EVP_CIPHER_CTX* ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
int ret = 0;
int tmplen = 0;
printf("%s %d\n", __func__, __LINE__);
EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
if (!EVP_DecryptUpdate(ctx, out_buf, &tmplen, in_buf, in_len))
{
EVP_CIPHER_CTX_free(ctx);
return -1;
}
*out_len = tmplen;
if (in_len > tmplen) {
if (!EVP_DecryptUpdate(ctx, out_buf+tmplen, &tmplen, in_buf+tmplen, in_len-tmplen))
{
// RSP_TRACE("%s EVP_DecryptUpdate error \n", __func__);
EVP_CIPHER_CTX_free(ctx);
return -1;
}
printf("%s %d tmplen=%d\n", __func__, __LINE__,tmplen);
*out_len += tmplen;
}
if (in_len %16!=0){
ret = EVP_DecryptFinal_ex(ctx, out_buf+tmplen, &tmplen);
fprintf(stderr, "err:\n");
if (ret != 0)
{
// RSP_TRACE("%s EVP_DecryptFinal_ex error ret=%d\n", __func__, ret);
EVP_CIPHER_CTX_free(ctx);
return -2;
}
*out_len += tmplen;
}
EVP_CIPHER_CTX_free(ctx);
return 0;
}