基于openssl的evp库进行的aes

    技术2022-07-14  77

    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; }
    Processed: 0.011, SQL: 10