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

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

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

/******************************************************************************************
*** File Name		: tea_check
*** Description	:	
***	writer											timer										version
***	WL											 		2020/6/18								V0.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:
***	writer											timer										version
***	XXX													XXX/XX/XX								XXX
******************************************************************************************/

/******************************************************************************************
*** 函数名称: 无
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:无
***	编者										时间										版本
***	XXX											XXX/XX/XX								XXX
******************************************************************************************/ 
//************************\    /\    /********** |    ***********************************//
//*************************\  /  \  /*********** |    ***********************************//
//**************************\/    \/************ |_ _ ***********************************//


/*******************
  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加密函数
*** 调度周期:无
***	编者										时间										版本
***	WL											2020/6/18								V0.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	:	
***	writer											timer										version
***	WL													2020/6/18								V0.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_SIZE	32		//通讯数组长度

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、展示效果:

 

 

 

 

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值