一个基于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加解密效果

