C语言aes256加密解密 基于openssl的evp库进行的aes_256_ecb的加密解密。(同时包含base64转码解码)

C语言基于openssl的evp库进行的aes_256_ecb的加密解密。](同时包含base64转码)

遇到了需要进行数据加密解密的工作,进行多方查找比较觉得还是evp的库使用比较方便,写了个小demo在此记录一下,话不多说见代码。

#include <openssl/evp.h>
#include <string.h>	 

//base64转码
int DesEncode(char *inbuf, char *outbuf, int len)
{
	int ret = 0;
	//evp库提供的函数,用于base64转码,输入3个字节输出4个字节
	ret = EVP_EncodeBlock(outbuf, inbuf, len);
	if(ret > 0)
	{
		printf("base64转码后的outLen===%ld\n", strlen(outbuf));
		printf("%s\n\n", outbuf);
		return 0;
	}
	
	return 1;
}

//base64解码
int DesDecode(char *inbuf, char *outbuf, int *len)
{
	int ret = 0;
	//evp库提供的函数,用于base64解码,输入4个字节输出3个字节
	ret = EVP_DecodeBlock(outbuf, inbuf, *len);
	if (ret > 0)
	{
		*len = ret - ret%4;//进行换算后获得解码后的实际长度
		printf("=base64解码后的outbuf%s\n,len==:%d\n", outbuf, ret);
		return 0;
	}
	
	return 1;	
}

//加密
int DesEncrypt(const unsigned char *key,
								   char *inbuf, int inlen,
								   char *outbuf, int *outlen)
{		
	EVP_CIPHER_CTX *ctx = NULL;
    //这些接口有大佬写的详细,就不过多撰述。见**[链接**](https://blog.csdn.net/gdwzh/article/details/19230)
	ctx = EVP_CIPHER_CTX_new();
	EVP_EncryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, key, NULL);
 
	if (!EVP_EncryptUpdate(ctx, outbuf, outlen, inbuf, inlen))
	{
		EVP_CIPHER_CTX_free(ctx);
		return 1;
	}
	
	int tmplen = 0;
	if (!EVP_EncryptFinal_ex(ctx, outbuf + *outlen, &tmplen))
	{
		EVP_CIPHER_CTX_free(ctx);
		return 1;
	}
 
	*outlen += tmplen;
	EVP_CIPHER_CTX_free(ctx);
	printf("====加密后的outbuf%s\n,len==:%d\n", outbuf, *outlen);

	return 0;
}
//解密
int DesDecrypt(const unsigned char *key,
								   char *inbuf, int *inlen,
								   char *outbuf, int *outlen)
{
	EVP_CIPHER_CTX *ctx = NULL;
	
	ctx = EVP_CIPHER_CTX_new();
	EVP_DecryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, key, NULL);
 
	if (!EVP_DecryptUpdate(ctx, outbuf, outlen, inbuf, *inlen))
	{
		return 1;
	}

	int tmplen = 0;
	
	if (!EVP_DecryptFinal_ex(ctx, outbuf + *outlen, &tmplen))
	{
		EVP_CIPHER_CTX_free(ctx);
		return 1;
	}
	*outlen += tmplen;
	//
	EVP_CIPHER_CTX_free(ctx);
	outbuf[*outlen] = '\0';//截断
	printf("====解密后的outbuf%s\n,len==:%d\n", outbuf, *outlen);
	return 0;
}
//封装一个加密转码接口
int abupEncryAndEncode(const unsigned char *key, char *inbuf, int inlen,
								   char *outbuf, int *outlen)
{
	int ret = 0;
	int out1len = 0;

	char *out1buf = malloc(100000);		
	if(out1buf)
	{
		memset(out1buf, 0x00, 100000);
	}
	ret = DesEncrypt(key, inbuf, inlen, out1buf, &out1len);
	if(ret)
	{
		return 1;
	}
	ret = DesEncode(out1buf, outbuf, out1len);
	if(ret)
	{
		return 1;
	}
	*outlen = strlen(outbuf);
	printf("==加密和换码ok==\n");
	return 0;
}
//封装一个解密解码内容。
int abupDecryAndDecode(const unsigned char *key,
								   char *inbuf, int *inlen,
								   char *outbuf, int *outlen)
{
	int ret = 0;
	
	char *out1buf = malloc(100000);
	if(out1buf)
	{
		memset(out1buf, 0x00, 100000);
	}
	
	ret = DesDecode(inbuf, out1buf, inlen);//
	if(ret)
	{
		return 1;
	}
	printf("==解码ok==%d\n",*inlen);
	
	ret = DesDecrypt(key, out1buf, inlen, outbuf, outlen);
	if(ret)
	{
		return 1;
	}
	return 0;
}									   
int main()
{
	char * key = strdup("wj14mrIW123456781234567812345678");
	char *inbuf= strdup("1234567812345678");
	//char *inbuf= strdup("123456据;;;;");
	char *outbuf = malloc(100000);
	if(outbuf)
	{
		memset(outbuf, 0x00, 100000);
	}
	
	char *tmpbuf = malloc(100000);
	if(tmpbuf)
	{
		memset(tmpbuf, 0x00, 100000);
	}
	int outLen = 0;int tmpLen = 0; 	

	//加密转码内容
	printf("====inbuf=%s,inLen=%ld\n",inbuf,strlen(inbuf));
	abupEncryAndEncode(key,inbuf, strlen(inbuf), outbuf, &outLen);
	

	//解密解码内容-
	abupDecryAndDecode(key,outbuf,&outLen,tmpbuf,&tmpLen);
	
	printf("=================这是一条分割线===============================\n");		
	printf("====inbuf=%s,inLen=%ld\n",inbuf,strlen(inbuf));
	//加密
	DesEncrypt(key, inbuf, strlen(inbuf), outbuf, &outLen);
	//解密
	DesDecrypt(key, outbuf, &outLen, tmpbuf, &tmpLen);
	//转码
	DesEncode(inbuf, outbuf, strlen(inbuf));
	//解码
	DesDecode(outbuf, tmpbuf, &tmpLen);
	//内存释放省略
	return 0;
}

我是分割线============
编译方式: gcc xxx.c --lcrypto 【链接opensll的静态库】

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值