今天记录下关于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、展示效果:
今天记录下关于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、展示效果:
举报