一个基于C语言通用的AES加解密库
admin 于 2018年07月23日 发表在 嵌入式开发笔记
在一些案例中,发现目前不少开发者选择json数据格式,作为嵌入式设备与远程服务器通讯的协议基础。
Json数据格式,不仅方便协议扩展,而且易于web端开发者联合调试,缩短项目开发周期;只是,由于Json是明文传输,因此在通讯过程中会产生安全性的问题。
为了解决json传输中的安全性问题,本文介绍一个AES通用加密库,可对任意字符长度的数据进行加解密,本库占用空间较少,也可移植小型嵌入式设备。
1. AES加密算法
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。[百度百科]
AES算法原理,推荐阅读博文《AES加密算法的详细介绍与实现》。
2. AES库调用
AES算法实现包含在 aes.c 文件(点击下载附件),实际应用中,只需调用 aes.h 中两个接口:
//加密 bool EncryptDataToCipherTxt(uint8_t *orign, uint8_t *result, uint16_t length); //解密 bool DecryptCipherTxtToData(uint8_t *orign, uint8_t *result, uint16_t length);
3. 调用例程
#include <stdio.h> #include <stdint.h> #include "aes.h" #define AES_ENC_MAX_LEN (512) //使用例程 int main(int argc, char *argv[]) { uint16_t i=0; //定义加密缓存数据 char in[AES_ENC_MAX_LEN]="{\"name\":\"Jack Nimble\",\"format\":{\"type\":\"rect\",\"width\":1920,\"height\":1080,\"interlace\":false,\"framerate\":24}}"; uint8_t out[AES_ENC_MAX_LEN]; //获取数据长度 uint16_t length=strlen(in); //原始数据 printf("原始数据:\n"); printf("报文长度%d\n",strlen(in)); printf("%s\n\n", in); //数据长度非16字节整除,则补齐 while(length%16) { strcat(in,"\0"); //用0补齐 length++; } //原始数据 printf("补位后数据:\n"); printf("报文长度%d\n",strlen(in)); printf("%s\n\n", in); //加密数据 printf("加密数据:\n"); EncryptDataToCipherTxt((uint8_t*)in,out,length); printf("密文长度=%d\n",length); for(i=0; i<length; i++) { printf("%02x ", out[i]); } printf("\n\n"); // 清空in内容 memset(in, 0x00, AES_ENC_MAX_LEN); //将字符数组转为字符串 printf("解密数据:\n"); DecryptCipherTxtToData(out,(uint8_t*)in,length); printf("解密报文长度=%d\n",length); printf("%s\n",in); return 0; }
4. AES加解密效果