美食网站开发目的,东莞网站建设报价 一呼百应,土木工程网官网首页,长尾词挖掘工具目录
一、前言
二、TEA算法
三、AES算法
四、加解密测试
五、安全性保障 一、前言 物联网的安全性是经常被提及的一个点#xff0c;如果你的设备之间通讯没有加密的话#xff0c;那么攻击者很容易就能获取并解析出报文的协议#xff0c;从而根据攻击者的需要进行设备操…目录
一、前言
二、TEA算法
三、AES算法
四、加解密测试
五、安全性保障 一、前言 物联网的安全性是经常被提及的一个点如果你的设备之间通讯没有加密的话那么攻击者很容易就能获取并解析出报文的协议从而根据攻击者的需要进行设备操控和敏感信息获取。举个例子现在有很多的WiFi插座连接WIFI后用户就能通过手机去控制插座开关如果设计者对安全不重视所有报文都是明文那么攻击者只要设局让用户连在同一个局域网WiFi获取一些身份信息即可自己组合相关报文对插座进行控制了是一件比较危险的事情。 对于设备端处理器性能有好有差的所以对于加密算法要根据实际情况去选配在这里我们主要介绍TEA和AES两种加密算法具体的算法原理属于加密学的内容还是挺难懂的有兴趣可以自己深入研究我们这里主要讲下如何封装和使用这两种加密算法。 加解密的流程如下图所示我们这里都是对称加密加解密用的同一个密钥没什么太复杂的流程。 二、TEA算法 TEA是一个非常轻量级的加解密算法效率高、强度好很多游戏类有实时性要求的都是用TEA算法QQ好像也是它的基本介绍百科里有TEA加密算法_百度百科。对于我们使用者而言主要有几个点注意下就行了。
1、TEA采用对称加密数据是8字节一组密钥是16字节一组所以对用户层的数据有要求数据需要8字节对齐不够的自己补齐再输入密码要16字节。
2、TEA算法的加密强度跟算法本身关系不大主要还是加密轮次建议是32轮所以驱动库里就写死了加解密算法轮次要对应。 下面先展现每组的加密单元代码如下所示 /* 描述 : TEA加密单元
输入 :
输出 : */
void EncryptTEA(u32 *firstChunk, u32 *secondChunk, u32* key)
{u32 y *firstChunk;u32 z *secondChunk;u32 sum 0;u32 delta 0x9e3779b9;for (int i 0; i 32; i)//32轮运算(需要对应下面的解密核心函数的轮数一样){sum delta;y ((z 4) key[0]) ^ (z sum) ^ ((z 5) key[1]);z ((y 4) key[2]) ^ (y sum) ^ ((y 5) key[3]);}*firstChunk y;*secondChunk z;}/* 描述 : TEA解密单元
输入 :
输出 : */
void DecryptTEA(u32 *firstChunk, u32 *secondChunk, u32* key)
{u32 sum 0;u32 y *firstChunk;u32 z *secondChunk;u32 delta 0x9e3779b9;sum delta 5; //32轮运算所以是2的5次方16轮运算所以是2的4次方8轮运算所以是2的3次方for (int i 0; i 32; i) //32轮运算{z - (y 4) key[2] ^ y sum ^ (y 5) key[3];y - (z 4) key[0] ^ z sum ^ (z 5) key[1];sum - delta;}*firstChunk y;*secondChunk z;
} 具体核心函数的内部原理我们就不考究了简单的观察就是4字节4字节数据与16字节的密码做相关运算。 接下来看下如何调用这个核心加解密函数具体代码如下 /* 描述 :TEA数据加密函数
输入 : buff的长度必须是8的整数倍
输出 : */
u16 tea_encrypt_buff(u8 *buff, u16 len, u32* key)
{u8 *p buff; u16 i,counts;if(len%8!0){printf(Encrypt buff len err!\n);return 0;}countslen/8; for(i0;icounts;i){EncryptTEA((u32 *)p, (u32 *)(p 4), key);p8;}return len;
}/* 描述 : TEA数据解密函数
输入 : buff的长度必须是8的整数倍
输出 : */
u16 tea_decrypt_buff(u8 *buff, u16 len, u32* key)
{u8 *p buff; u16 i,counts;if(len%8!0){printf(Decryp buff len err!\n);return 0;} countslen/8; for(i0;icounts;i){DecryptTEA((u32 *)p, (u32 *)(p 4), key);p8;}return len;
} 这是自己封装的主要是检测输入的数据长度有没有8字节对齐然后调用加解密函数对每个单元的数据一次操作由于是指针传递所以明文和密文都是在同一个缓冲区内。 三、AES算法 AES算法是当今使用最多的对称加密算法了效率高、安全性好它的实现比较复杂我们用的是mbedtls库把其中的AES相关部分拿出来因为整个库对于单片机来讲着实有点大了GitHub - Mbed-TLS/mbedtls: An open source, portable, easy to use, readable and flexible TLS library, and reference implementation of the PSA Cryptography API. Releases are on a varying cadence, typically around 3 - 6 months between releases. AES内部还分了5中加密模式具体看这里介绍我们选择的是cbc模式密码16字节其它模式自己也可以尝试。AES五种加密模式CBC、ECB、CTR、OCF、CFB - 知乎 下面具体看下驱动库封装后的程序代码如下 /* 描述 :AES-CBC模式加密
输入 :
输出 : */
int aes_encrypt_buff(u8 *in_buff, u16 in_len,u8 *out_buff, u16 out_size,u8 *passwd)
{static mbedtls_aes_context aes_ctx;u16 loop_cnts0;//循环加密次数u8 temp_buff[20]{0};u8 iv[17]{0},key[17]{0};loop_cntsin_len/16;if(in_len%160)loop_cnts;if(loop_cnts*16out_size)return 0;if(strlen((char*)passwd)16){memcpy(key, passwd, 16);}else{strcpy((char*)key, (char*)passwd);}mbedtls_aes_init(aes_ctx);mbedtls_aes_setkey_enc(aes_ctx, key, 128);memset(iv,0,sizeof(iv));for(int i0;iloop_cnts;i){if(iloop_cnts-1 in_len%160)//最后一组{memset(temp_buff, 0, sizeof(temp_buff));memcpy(temp_buff, in_buff[i*16], in_len%16);//用0填充}else{memcpy(temp_buff, in_buff[i*16], 16);}mbedtls_aes_crypt_cbc(aes_ctx, MBEDTLS_AES_ENCRYPT, 16, iv, temp_buff, out_buff[i*16]);}return loop_cnts*16;
}/* 描述 :AES-CBC模式解密
输入 :
输出 : */
int aes_decrypt_buff(u8 *in_buff, u16 in_len,u8 *out_buff, u16 out_size,u8 *passwd)
{mbedtls_aes_context aes_ctx;u16 loop_cnts0;//循环加密次数u8 temp_buff[16]{0};u8 iv[16]{0},key[17]{0};loop_cntsin_len/16;if(in_len%160)return 0; //密文长度必须是16的整数倍if(loop_cnts*16out_size)return 0;if(strlen((char*)passwd)16){memcpy(key, passwd, 16);}else{strcpy((char*)key, (char*)passwd);}mbedtls_aes_init(aes_ctx);mbedtls_aes_setkey_dec(aes_ctx, key, 128);memset(iv,0,sizeof(iv));for(int i0;iloop_cnts;i){memcpy(temp_buff, in_buff[i*16], 16);mbedtls_aes_crypt_cbc(aes_ctx, MBEDTLS_AES_DECRYPT, 16, iv, temp_buff, out_buff[i*16]);}return loop_cnts*16;
} CBC模式需要初始化向量这里全部初始化为‘0’核心还是调用mbedtls的库函数代码自行阅读接下来做一些测试看下如何使用。 四、加解密测试 测试环境如下所示 如果采用的是净化器项目的工程代码那么user_opt.h和rtconfig.h文件参数修改下不然RAM不够用任务无法运行AES算法有点吃内存对于小身板来讲比较够呛。 下面是测试代码放在user_app.c文件里代码如下 u8 in_buff[32]{0123456789ABCDEF0123456789ABCDEF};u8 out_buff[32]{0};u8 passwd[16]{0123456789123456};//TEA加解密测试printf(*****start tea test!\n);printf(000 in_buff%s\n, in_buff); tea_encrypt_buff(in_buff, 32, (u32*)passwd);//TEA加密printf_hex(out_buff, in_buff, 32);//打印密文tea_decrypt_buff(in_buff, 32, (u32*)passwd);//TEA解密printf(111 in_buff%s\n, in_buff);//打印解密明文 //AES加解密测试printf(\n*****start aes test!\n);printf(000 in_buff%s\n, in_buff); aes_encrypt_buff(in_buff, 32, out_buff, 32, passwd);//AES加密printf_hex(out_buff, out_buff, 32);//打印密文memset(in_buff, 0, 32);//清空明文区aes_decrypt_buff(out_buff, 32, in_buff, 32, passwd);//AES解密printf(222 in_buff%s\n, in_buff); 测试结果如下图所示密文用16进制的方式打印不然是乱码 从结果上看加解密算法没什么问题速度也还可以不过AES算法对于STM32F103C8T6可能还是有点大了芯片的RAM是20KB单纯AES文件就要用掉10KB左右所以对于前端小型设备可能还是TEA算法比较合适这个自行选择。 五、安全性保障 现在回到物联网本身有哪些我们可以采用加密传输呢像购买的从机设备一般是没办法的比如485温湿度传感器这种厂家已经固定程序了不会为你去做适配的不过这一类传感器也不必要加密通讯了因为它是有线局部传输物理环境本身比较安全。备端的加密一般放在无线组网方面和主机与服务器通讯方面。 首先无线组网数据容易被截获如果内容是加密的对方破解需要代价和时间如果你在内容里加上时间戳等信息可以有效防止重放攻击以后会讲的LoRa自组网就会用到加密算法了。 主机跟服务器方面就不用多说了这部分如果没有加密的话很容易被攻击因为数据一般是发往互联网的攻击者的操作手段太多了我们只能尽可能得做好数据加密防止一些常规手段的攻击。 安全性不单单是加密算法的事更重要的是密钥的存放如果密钥很容易就被获取了那么跟没加密是一样的。对于单片机设备如果有一定价值攻击者可以通过非正常手段读取单片机内部flash的所有内容如果你的密钥是明文写在程序内的对方很快就能获悉了所以一个高可靠性产品的代码写起来确实不容易至于要如何防止只能在后续项目实操中融入了。 代码链接https://download.csdn.net/download/ypp240124016/89110489
文件中的drv_common.c和drv_common.h直接替换掉原来的就行。 本项目的交流QQ群:701889554