完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
今天记录下关于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 #include #include /****************************************************************************************** *** 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、展示效果: |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 02:59 , Processed in 1.106539 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号