单片机学习小组
直播中

李桂英

7年用户 1342经验值
私信 关注

关于TEA方式的加密协议理解

TEA方式的加密协议的程序代码该怎样去编写呢?

回帖(1)

h1654155275.5954

2022-1-20 11:21:18
今天记录下关于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 {
ted_data.TEA_TxBuff[count] = 0x30 + count;
}


Debug_Printf(UART_DEBUG,"rn原始数据t:%s rn" ,(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 rn" ,(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 rn" ,(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 rn" ,(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 //uart redirect fputc
#include //copy function
#include //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、展示效果:


举报

更多回帖

发帖
×
20
完善资料,
赚取积分