解决方案

单片机通讯数据加密 TEA 方式

seo靠我 2023-09-23 01:31:24

今天记录下关于TEA方式的加密协议我理解为:发送数组赋值,发送数组加密,接收加密数组,然后再解密为实际数据;

1、#include "tea_check.c"文件代码:

/****************SEO靠我************************************************************************** *** File Name : tSEO靠我ea_check *** Description : *** writer timer version *** WL 2020/6/18 V0.1 SEO靠我 ******************************************************************************************/ /*SEO靠我***************************************************************************************** **SEO靠我* include file *** *************************************************************************SEO靠我*****************/ #include "tea_check.h"/**************************************************SEO靠我**************************************** *** Macro definition *** ******************SEO靠我************************************************************************/ /*************************SEO靠我***************************************************************** *** struct and enum variabSEO靠我le *** *************************************************************************************SEO靠我*****/ /****************************************************************************************** SEO靠我 *** global variable *** *************************************************************SEO靠我*****************************/ TEA_DAT ted_data;/*******************************************SEO靠我*********************************************** *** function source code *** *******SEO靠我***********************************************************************************/ /**************SEO靠我**************************************************************************** *** Name : NoneSEO靠我 *** Parameters(in) : None *** Return value : None *** Description: SEO靠我*** writer timer version *** XXX XXX/XX/XX XXX *************************************SEO靠我*****************************************************//*********************************************SEO靠我********************************************* *** 函数名称: 无 *** 输入参数: 无 *** 返 SEO靠我回 值: 无 *** 说 明:无 *** 编者 时间 版本 *** XXX XXX/XX/XX XXX ****************SEO靠我**************************************************************************/ //**************SEO靠我**********\ /\ /********** | ***********************************// //***********************SEO靠我**\ / \ /*********** | ***********************************// //**************************\/ SEO靠我\/************ |_ _ ***********************************///*******************TEA加密解密算法 *****SEO靠我**************/ void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigneSEO靠我d int* key) {unsigned int y = *firstChunk;unsigned int z = *secondChunk;unsigned int sum = 0SEO靠我;unsigned int delta = 0x9e3779b9;for (int i = 0; i < 8; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样){sum += delta;SEO靠我y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1]);z += ((y << 4) + key[2]) ^ (y + sum) ^ ((SEO靠我y >> 5) + key[3]);}*firstChunk = y;*secondChunk = z; }void DecryptTEA(unsigned int *firstChuSEO靠我nk, unsigned int *secondChunk, unsigned int* key) {unsigned int sum = 0;unsigned int y = *fiSEO靠我rstChunk;unsigned int z = *secondChunk;unsigned int delta = 0x9e3779b9;sum = delta << 3; //32轮运算,所以是SEO靠我2的5次方;16轮运算,所以是2的4次方;8轮运算,所以是2的3次方for (int i = 0; i < 8; i++) //8轮运算{z -= (y << 4) + key[2] ^ y + suSEO靠我m ^ (y >> 5) + key[3];y -= (z << 4) + key[0] ^ z + sum ^ (z >> 5) + key[1];sum -= delta;}*firstChunkSEO靠我 = y;*secondChunk = z; }//buffer:输入的待加密数据buffer,在函数中直接对元数据buffer进行加密;size:buffer长度;key是密钥; SEO靠我 void EncryptBuffer(char* buffer, int size, unsigned int* key) {char *p = buffer;int lSEO靠我eftSize = size;while (p < buffer + size &&leftSize >= sizeof(unsigned int) * 2){EncryptTEA((unsignedSEO靠我 int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);p += sizeof(unsigned int) * 2;leftSize -=SEO靠我 sizeof(unsigned int) * 2;} }//buffer:输入的待解密数据buffer,在函数中直接对元数据buffer进行解密;size:buffer长度;key是SEO靠我密钥; void DecryptBuffer(char* buffer, int size, unsigned int* key) {char *p = buffer;SEO靠我int leftSize = size;while (p < buffer + size &&leftSize >= sizeof(unsigned int) * 2){DecryptTEA((unsSEO靠我igned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);p += sizeof(unsigned int) * 2;leftSiSEO靠我ze -= sizeof(unsigned int) * 2;} }//设置密钥,必须需要16个字符或以上 unsigned int *key = (unsigned SEO靠我int *)"testkey123456789";char TEA_TxBuff[32]; char TEA_RxBuff[32];/*************************SEO靠我***************************************************************** *** 函数名称: adc_GetConvertedSEO靠我Group *** 输入参数: 无 *** 返 回 值: 无 *** 说 明:TEA加密函数 *** 调度周期:无 **SEO靠我* 编者 时间 版本 *** WL 2020/6/18 V0.1 ***************************************************SEO靠我***************************************/ void tea_testFunction(void) {uint8_t count;SEO靠我ted_data.key = (unsigned int *)"testkey123456789"; //需要用户自己输入 ,设置密钥,必须需要16个字符或以上for(count =0; count SEO靠我<sizeof(ted_data.TEA_TxBuff); count ++){ted_data.TEA_TxBuff[count] = 0x30 + count;}Debug_Printf(UARTSEO靠我_DEBUG,"\r\n原始数据\t:%s \r\n" ,(char *)ted_data.TEA_TxBuff); //打印原始数据HAL_Delay(100); EncryptBuffer(tedSEO靠我_data.TEA_TxBuff, sizeof(ted_data.TEA_TxBuff), ted_data.key); //加密数据Debug_Printf(UART_DEBUG,"发送加密数据\SEO靠我t:%s \r\n" ,(char *)ted_data.TEA_TxBuff); //打印加密数据 HAL_Delay(100); memcpy(ted_data.TEA_RxBuff, ted_dSEO靠我ata.TEA_TxBuff, sizeof(ted_data.TEA_TxBuff)); //模拟接收到加密后的数据,放入接收数组Debug_Printf(UART_DEBUG,"接收加密数据\t:SEO靠我%s \r\n" ,(char *)ted_data.TEA_RxBuff); //打印接收加密数据HAL_Delay(100); DecryptBuffer(ted_data.TEA_RxBuff,SEO靠我 sizeof(ted_data.TEA_RxBuff), ted_data.key);Debug_Printf(UART_DEBUG,"解密数据\t:%s \r\n" ,(char *)ted_daSEO靠我ta.TEA_RxBuff); HAL_Delay(100); }

2、#include "tea_check.h"代码:

/***************************************SEO靠我*************************************************** *** File Name : tea_check *** DeSEO靠我scription : *** writer timer version *** WL 2020/6/18 V0.1 *****************SEO靠我*************************************************************************/ #ifndef __TEA_CHECK_H SEO靠我 #define __TEA_CHECK_H/*************************************************************************SEO靠我***************** *** include file *** *********************************************SEO靠我*********************************************/ #include "main.h"#include "usart.h" //system SEO靠我file include #include <stdio.h> //uart redirect fputc #include <string.h> //copy function SEO靠我 #include <stdarg.h> //va_start /vsnprintf /va_end function/***********************************SEO靠我******************************************************* *** Macro definition *** ***SEO靠我***************************************************************************************/ #deSEO靠我fine TEA_SIZE 32 //通讯数组长度typedef struct {unsigned int *key; //设置密钥,必须需要16个字符或以上char TEA_TxBuSEO靠我ff[TEA_SIZE];char TEA_RxBuff[TEA_SIZE];}TEA_DAT;/***************************************************SEO靠我*************************************** *** struct and enum variable *** ***********SEO靠我*******************************************************************************/ /******************SEO靠我************************************************************************ *** global variableSEO靠我 *** ***************************************************************************************SEO靠我***/ extern TEA_DAT ted_data;/**************************************************************SEO靠我**************************** *** global function *** *******************************SEO靠我***********************************************************/ extern void EncryptTEA(unsigned int *fiSEO靠我rstChunk, unsigned int *secondChunk, unsigned int* key); extern void DecryptTEA(unsigned intSEO靠我 *firstChunk, unsigned int *secondChunk, unsigned int* key); extern void EncryptBuffer(char*SEO靠我 buffer, int size, unsigned int* key); extern void DecryptBuffer(char* buffer, int size, unsSEO靠我igned int* key); extern void tea_testFunction(void);#endif

3、展示效果:

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2