单片机上使用TEA加密通信

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN7

开发环境:MDK4.72

单片机:STM32

说明:

在项目中单片机会与服务器进行网络通讯.需要对通讯加密,我选择了TEA加密算法.

源码:

tea.h

/*********************************************************************
*						   TEA算法头文件
*						(c)copyright 2013,jdh
*						  All Right Reserved
*文件名:tea.h
*程序员:jdh
**********************************************************************/
/*********************************************************************
*说明:TEA加密解密算法
*TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,
*实现简单著称。
*算法很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,
*算法采用迭代的形式,
*推荐的迭代轮数是64轮,最少32轮。
**********************************************************************/

#ifndef _TEA_H_
#define _TEA_H_

/*********************************************************************
*							头文件
**********************************************************************/

#include "header.h"

/*********************************************************************
*							函数
**********************************************************************/

/*********************************************************************
*							tea加密
*参数:v:要加密的数据,长度为8字节
*     k:加密用的key,长度为16字节
**********************************************************************/

static void tea_encrypt(uint32_t *v,uint32_t *k);

/*********************************************************************
*							tea解密
*参数:v:要解密的数据,长度为8字节
*     k:解密用的key,长度为16字节
**********************************************************************/

static void tea_decrypt(uint32_t *v,uint32_t *k);

/*********************************************************************
*							加密算法
*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这
*     size_src:源数据大小,单位字节
*     key:密钥,16字节
*返回:密文的字节数
**********************************************************************/

uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key);

/*********************************************************************
*							解密算法
*参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这
*     size_src:源数据大小,单位字节
*     key:密钥,16字节
*返回:明文的字节数,如果失败,返回0
**********************************************************************/

uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key);

#endif

tea.c

/*********************************************************************
*						   TEA算法主文件
*						(c)copyright 2013,jdh
*						  All Right Reserved
*文件名:hash.c
*程序员:jdh
**********************************************************************/

/*********************************************************************
*							头文件
**********************************************************************/

#include "tea.h"

/*********************************************************************
*							函数
**********************************************************************/

/*********************************************************************
*							tea加密
*参数:v:要加密的数据,长度为8字节
*     k:加密用的key,长度为16字节
**********************************************************************/

static void tea_encrypt(uint32_t *v,uint32_t *k)
{
	uint32_t y = v[0],z = v[1],sum = 0,i;
	uint32_t delta = 0x9e3779b9;
	uint32_t a = k[0],b = k[1],c = k[2],d = k[3];  

	for (i = 0;i < 32;i++)
	{
		sum += delta;
		y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
		z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
	}
	v[0] = y;
	v[1] = z;
}

/*********************************************************************
*							tea解密
*参数:v:要解密的数据,长度为8字节
*     k:解密用的key,长度为16字节
**********************************************************************/

static void tea_decrypt(uint32_t *v,uint32_t *k)
{
	uint32_t y = v[0],z = v[1],sum = 0xC6EF3720,i;
	uint32_t delta = 0x9e3779b9;
	uint32_t a = k[0],b = k[1],c = k[2],d = k[3];    

	for (i = 0;i < 32;i++)
	{
		z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
		y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
		sum -= delta;
	}
	v[0] = y;
	v[1] = z;
}

/*********************************************************************
*							加密算法
*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这
*     size_src:源数据大小,单位字节
*     key:密钥,16字节
*返回:密文的字节数
**********************************************************************/

uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
	uint8_t a = 0;
	uint16_t i = 0;
	uint16_t num = 0;

	//将明文补足为8字节的倍数
	a = size_src % 8;
	if (a != 0)
	{
		for (i = 0;i < 8 - a;i++)
		{
			src[size_src++] = 0;
		}
	}

	//加密
	num = size_src / 8;
	for (i = 0;i < num;i++)
	{
		tea_encrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
	}

	return size_src;
}

/*********************************************************************
*							解密算法
*参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这
*     size_src:源数据大小,单位字节
*     key:密钥,16字节
*返回:明文的字节数,如果失败,返回0
**********************************************************************/

uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
	uint16_t i = 0;
	uint16_t num = 0;

	//判断长度是否为8的倍数
	if (size_src % 8 != 0)
	{
		return 0;
	}

	//解密
	num = size_src / 8;
	for (i = 0;i < num;i++)
	{
		tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
	}

	return size_src;
}

加密示例代码:

i = 0;
            //设备类型
            arr[i++] = DEVICE >> 8;
            arr[i++] = DEVICE;
            //命令字
            arr[i++] = node.cmd >> 8;
            arr[i++] = node.cmd;
            //序列号
            if (node.index)
            {
                arr[i++] = node.index >> 8;
                arr[i++] = node.index;
            }
            else
            {
                arr[i++] = Tx_Index >> 8;
                arr[i++] = Tx_Index;
                Tx_Index++;
            }
            //用户号
            arr[i++] = User_Id >> 24;
            arr[i++] = User_Id >> 16;
            arr[i++] = User_Id >> 8;
            arr[i++] = User_Id;
            //密码
            //判断是否是确认修改密码
            if (node.cmd != CMD_NET_CONFIRM_EDIT_PASSWORD)
            {
                arr[i++] = Password >> 24;
                arr[i++] = Password >> 16;
                arr[i++] = Password >> 8;
                arr[i++] = Password;
            }
            else
            {
                arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> 24);
                arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> 16);
                arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> 8);
                arr[i++] = (uint8_t)PASSWORD_BACKDOOR;
            }
            //报文长度
            arr[i++] = node.size >> 8;
            arr[i++] = node.size;
            //包文crc
            crc = crc_code(node.buf,node.size);
            arr[i++] = crc >> 8;
            arr[i++] = crc;
            //报文
            memcpy(arr + LEN_FRAME_HEAD_NET,node.buf,node.size);
            //加密报文
            size = encrypt(arr,node.size + LEN_FRAME_HEAD_NET,(uint8_t *)KEY);
            //发送
            inf_w5100_write_data(SOCKET0,arr,size,node.ip,PORT_SERVER);

解密示例代码:

//解密数据
if (decrypt(buf,msg.socket_msg[i].size,(uint8_t *)KEY) == 0)
{
        //解密失败
        break;
}

单片机上使用TEA加密通信

时间: 2024-11-04 13:21:12

单片机上使用TEA加密通信的相关文章

数据的加密传输——单片机上实现TEA加密解密算法(转)

源:数据的加密传输——单片机上实现TEA加密解密算法 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实现起来比较困难,但一种叫TEA的加密算法特别适合单片机使用. TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,实现简单著称.算法很简单,TEA算法每一次可以操作64-bit(8-byte),

教你如何在51单片机上模拟串口通信!!!

我们可以不使用单片机本身带有的串口,而自己用程序去模拟一个串口并达到和本身的串口具有同样的功能, 首先,我们需要用到CH340串口模块,大家可以上某宝自行购买. 正面: 反面: 然后我们需要了解一下这串口模块上的引脚: 5V  :与VCC短路为5V TLL输出(电源和信号输出都是5V) VCC:可以与3.3V和5V用跳帽连接 3.3V:与VCC短路为3.3V TLL输出(电源和信号输出都是3.3V) TXD:发送数据端口(与单片机上的接收引脚用杜邦线连接) RXD:接收数据端口(与单片机上的发送

三.mail 接收权限 dovecot加密通信 php数据库 thunderbird

postconf -d:查看默认设置postconf -n:查看当前设置postconf -e "inet_interfaces = all":修改选项inet_interfaces 参数指定postfix系统监听的网络接口. 一.邮件的限制==access==   ##禁止某个ip接受邮件[[email protected] ~]# cd /etc/postfix/[[email protected] postfix]# lsaccess     generic        mai

前后端(支持app)RSA加密通信证书生成方法汇编

最近一个项目,处于安全上的考虑,前后端需要使用安全证书加密通信,涉及ios/android-后台交互.在测试环境上没有正式的CA证书,使用自签证书开发. 下面把生成4套环境的自签证书过程mark下,如有需要,可参考: 以下命令的执行环境均为windows-cmd界面(前提需安装jdk,使用jdk自带的keytool工具) 1.生成jks.csr证书(这俩证书暂时没用): keytool -genkey -alias *.test.com -sigalg SHA1withRSA -keyalg R

bugzilla4的xmlrpc接口api调用实现分享: xmlrpc + https + cookies + httpclient +bugzilla + java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能

xmlrpc .  https . cookies . httpclient.bugzilla . java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能,网上针对bugzilla的实现很少,针对xmlrpc的有但是基本都是http协议的,https下的认证处理比较麻烦,而且会话保持也是基本没有太多共享,所以本人决定结合xmlrpc\bugzilla官方文档,网友文章,结合个人经验总结而成,已经在window2007 64+jdk7位机器上调试通过 手把手教你如何实现: 第一步: 在

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

导读:触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好.触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序.Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议.关键词:触摸屏,MCS-51单片机,Modbus协议,通信 在工业控制中经常需要观察系统的运行状态或者修改运行参数.触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以

Liunx 部署邮件TLS/SSL加密通信服务

部署邮件TLS/SSL加密通信服务 一.部署普通邮件服务器 1) 搭建并检测邮件服务的发送服务 [[email protected] ~]# rpm -q postfix postfix-2.10.1-6.el7.x86_64 [[email protected] ~]# netstat -pantu | grep :25 tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1822/ma

Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信

一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使用两台RHEL7虚拟机,其中svr7作为CA数字证书服务器,而pc207作为测试用客户机. 步骤: 步骤一:使用OpenSSL加密/解密文件 1)加密文件 创建一个明文的文本文件f1.txt,使用openssl进行加密,选用des3加密算法,输出的加密文件为f1.txt.enc . [[email 

邮件TLS/SSL加密通信

案例1:邮件TLS/SSL加密通信 1 案例1:邮件TLS/SSL加密通信1.1 问题 本案例要求为基于Postfix+Dovecot的邮件服务器提供加密通信支持,主要完成以下任务操作: 为SMTP服务(postfix)添加TLS/SSL加密通信支持 基于dovecot配置POP3s+IMAPS加密通信支持 客户端收发信测试,确保加密的邮件通信可用 1.2 方案 使用两台RHEL7虚拟机,其中svr7作为CA服务器,而mail作为测试用的Postfix+Dovecot邮件服务器.另外可准备一台p