在一些案例中,发现目前不少开发者选择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加解密效果

aes.png

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:嵌入式,aes加解密