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的静态库】