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

发布时间:2025-12-09 16:29:14 浏览次数:4

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

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

/********************************************************************************************* File Name: tea_check*** Description:***writertimerversion***WL 2020/6/18V0.1******************************************************************************************/ /*********************************************************************************************include file*********************************************************************************************/#include "tea_check.h"/*********************************************************************************************Macro definition*********************************************************************************************/ /*********************************************************************************************struct and enum variable*********************************************************************************************/ /*********************************************************************************************global variable*********************************************************************************************/ TEA_DAT ted_data;/*********************************************************************************************function source code*********************************************************************************************/ /********************************************************************************************* Name: None*** Parameters(in): None*** Return value : None*** Description:***writertimerversion***XXXXXX/XX/XXXXX******************************************************************************************//********************************************************************************************* 函数名称: 无*** 输入参数: 无*** 返 回 值: 无*** 说 明:无***编者时间版本***XXXXXX/XX/XXXXX******************************************************************************************/ //************************\ /\ /********** | ***********************************////*************************\ / \ /*********** | ***********************************////**************************\/ \/************ |_ _ ***********************************///*******************TEA加密解密算法*******************/void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key){unsigned int y = *firstChunk;unsigned int z = *secondChunk;unsigned int sum = 0;unsigned int delta = 0x9e3779b9;for (int i = 0; i < 8; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样){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;}void DecryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key){unsigned int sum = 0;unsigned int y = *firstChunk;unsigned int z = *secondChunk;unsigned int delta = 0x9e3779b9;sum = delta << 3; //32轮运算,所以是2的5次方;16轮运算,所以是2的4次方;8轮运算,所以是2的3次方for (int i = 0; i < 8; i++) //8轮运算{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;}//buffer:输入的待加密数据buffer,在函数中直接对元数据buffer进行加密;size:buffer长度;key是密钥;void EncryptBuffer(char* buffer, int size, unsigned int* key){char *p = buffer;int leftSize = size;while (p < buffer + size &&leftSize >= sizeof(unsigned int) * 2){EncryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);p += sizeof(unsigned int) * 2;leftSize -= sizeof(unsigned int) * 2;}}//buffer:输入的待解密数据buffer,在函数中直接对元数据buffer进行解密;size:buffer长度;key是密钥;void DecryptBuffer(char* buffer, int size, unsigned int* key){char *p = buffer;int leftSize = size;while (p < buffer + size &&leftSize >= sizeof(unsigned int) * 2){DecryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);p += sizeof(unsigned int) * 2;leftSize -= sizeof(unsigned int) * 2;}}//设置密钥,必须需要16个字符或以上unsigned int *key = (unsigned int *)"testkey123456789";char TEA_TxBuff[32];char TEA_RxBuff[32];/********************************************************************************************* 函数名称: adc_GetConvertedGroup*** 输入参数: 无*** 返 回 值: 无*** 说 明:TEA加密函数*** 调度周期:无***编者时间版本***WL2020/6/18V0.1******************************************************************************************/ void tea_testFunction(void){uint8_t count;ted_data.key = (unsigned int *)"testkey123456789";//需要用户自己输入 ,设置密钥,必须需要16个字符或以上for(count =0; count <sizeof(ted_data.TEA_TxBuff); count ++){ted_data.TEA_TxBuff[count] = 0x30 + count;}Debug_Printf(UART_DEBUG,"\r\n原始数据\t:%s \r\n" ,(char *)ted_data.TEA_TxBuff);//打印原始数据HAL_Delay(100);EncryptBuffer(ted_data.TEA_TxBuff, sizeof(ted_data.TEA_TxBuff), ted_data.key);//加密数据Debug_Printf(UART_DEBUG,"发送加密数据\t:%s \r\n" ,(char *)ted_data.TEA_TxBuff);//打印加密数据HAL_Delay(100);memcpy(ted_data.TEA_RxBuff, ted_data.TEA_TxBuff, sizeof(ted_data.TEA_TxBuff));//模拟接收到加密后的数据,放入接收数组Debug_Printf(UART_DEBUG,"接收加密数据\t:%s \r\n" ,(char *)ted_data.TEA_RxBuff);//打印接收加密数据HAL_Delay(100);DecryptBuffer(ted_data.TEA_RxBuff, sizeof(ted_data.TEA_RxBuff), ted_data.key);Debug_Printf(UART_DEBUG,"解密数据\t:%s \r\n" ,(char *)ted_data.TEA_RxBuff);HAL_Delay(100);}

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

/********************************************************************************************* File Name: tea_check*** Description:***writertimerversion***WL2020/6/18V0.1******************************************************************************************/ #ifndef __TEA_CHECK_H#define __TEA_CHECK_H/*********************************************************************************************include file*********************************************************************************************/#include "main.h"#include "usart.h"//system file include #include <stdio.h>//uart redirect fputc#include <string.h>//copy function#include <stdarg.h>//va_start /vsnprintf /va_end function/*********************************************************************************************Macro definition*********************************************************************************************/ #define TEA_SIZE32//通讯数组长度typedef struct{unsigned int *key;//设置密钥,必须需要16个字符或以上char TEA_TxBuff[TEA_SIZE];char TEA_RxBuff[TEA_SIZE];}TEA_DAT;/*********************************************************************************************struct and enum variable*********************************************************************************************/ /*********************************************************************************************global variable*********************************************************************************************/ extern TEA_DAT ted_data;/*********************************************************************************************global function*********************************************************************************************/ extern void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key);extern void DecryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key);extern void EncryptBuffer(char* buffer, int size, unsigned int* key);extern void DecryptBuffer(char* buffer, int size, unsigned int* key);extern void tea_testFunction(void);#endif

 

3、展示效果:

 

 

 

 

 

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477