单片机通讯数据加密 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、展示效果:
单片机通讯数据加密 TEA 方式相关推荐
- 基于51单片机的OLED驱动方式(iic通讯方式)
基于51单片机的OLED驱动方式(iic通讯方式) 前言: 本人从事硬件开发,自学软件,因为发现在学习过程中,有很多问题对于没有项目实战经验的新手来讲太难解决了,可以说基本上是无从下手.现将自己学习过 ...
- 单片机上使用TEA加密通信(转)
源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...
- 使用MCGS触摸屏与单片机通讯的心得
使用MCGS在项目中已经有一年了,有些个人心得如下:1.MCGS的设备驱动是真的不好用,灵活性较差,当然这里针对MCGS与单片机通讯的时候,PLC设备还好.所以如果你想做MCGS与单片机通讯,最好采用 ...
- 安卓设备通过USB串口与STM32单片机通讯之二
安卓设备通过USB串口与STM32单片机通讯之二 本博文系JGB联合商务组的原创作品,引用请标明出处. 本博文接续上一篇的末尾章节. (二) APP的JAVA代码部分(使用Android Studio ...
- 【转】dicom通讯的工作方式及dicom标准简介!!
转自:dicom通讯的工作方式及dicom标准简介 - assassinx - 博客园 本文主要讲述dicom标准及dicom通讯的工作方式.dicom全称医学数字图像与通讯 其实嘛就两个方面 那就是 ...
- 通讯可以并联吗_工业控制知识:吃透RS485通讯的连接方式,接485总线就简单多了...
RS485被广泛使用,可以支持ModBus协议.由于其简单.价优.可靠和成熟,因此,被广泛应用于工业控制.智能仪器和电力通信. 我们来看看RS485的一个典型组网结构: 理论上,RS485总线的传输距 ...
- STM8系列单片机程序的下载方式
STM8系列单片机程序的下载方式 一.概述 二.SWIM硬件接口下载方式 三.UART硬件接口下载方式 四.总结 原文链接:https://www.yourcee.com/newsinfo/29285 ...
- 网易im即时聊天php怎么接入,网易云信IM即时通讯功能接入方式与流程_如何收费_企业服务汇...
编者按:很多企业在考虑使用网易云信提供的IM即时通讯功能,对于企业应当如何接入该功能.接入方式和流程是怎样的.应当如何收费等不太清楚.企业服务汇通过评测网易云信IM即时通讯功能来告诉你答案. 网易云信 ...
- android 极光 环信,环信、容联云通讯、极光推送和网易云信IM即时通讯功能接入方式_部署方式_企业服务汇...
编者按:企业在挑选IM即时通讯功能服务商时,对于企业应当如何接入其IM功能.接入方式和部署方式有哪些等问题不太清楚.今天企业服务汇通过评测环信.容联云通讯.极光推送和网易云信这四家服务商来为你详细说明 ...
最新文章
- IDEA maven项目查自动查看依赖关系,解决包冲突问题
- jQuery event的复制粘贴的坑
- visual studio 的各个版本下载地址
- 計算機二級-java06
- sql 日期间隔排查双休_免费教程《图解SQL面试题》
- HTTP权威指南 文字版 带目录
- 罗技鼠标驱动G HUB导致触摸板无法使用
- jrtplib库移植到android上
- 江苏省谷歌高清卫星地图下载
- android 让程序在后台运行,android – 如何让我的应用程序在后台运行?
- 学术论文的标准格式是什么?写论文有哪些小技巧?
- java代码实现注册发送邮件激活账户
- Taro微信小程序实现 美团购物车小红点动画效果
- java转go之初体验(一)
- 计算雅思成绩C语言,雅思考试总成绩计算查分表
- Swift 调用C++代码
- 学编程用什么系统好?
- Oracle启动错误:ORA-00821: Specified value of sga_target 2352M is too small, needs to be at least 4352M
- 速卖通产品如何推广引流?速卖通如何引流?
- pdf加密怎么加?在线免费对PDF文档加密
热门文章
- JavaScript:RxJS(5.5.9)
- 基于Domoticz智能家居系统(十六)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(二)正式DIY
- 【JY】SAFE考虑徐变和收缩效应的长期挠度分析
- pythonsklearn乳腺癌数据集_【sklearn数据集】SVM之乳腺癌数据集实战
- Pyspark让pandas特征工程代码在集群上飞起来——天猫复购率baseline
- 有没有书单视频制作软件?制作书单四步完成
- Flutter系统icon图标【全系列】
- CNC编程培训,潇洒Powermil编程培训
- JavaScript获取某年某月的最后一天
- EXCEl-AND函数的使用方法