源:单片机上使用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[],z = v[],sum = ,i;
uint32_t delta = 0x9e3779b9;
uint32_t a = k[],b = k[],c = k[],d = k[]; for (i = ;i < ;i++)
{
sum += delta;
y += ((z << ) + a) ^ (z + sum) ^ ((z >> ) + b);
z += ((y << ) + c) ^ (y + sum) ^ ((y >> ) + d);
}
v[] = y;
v[] = z;
} /*********************************************************************
* tea解密
*参数:v:要解密的数据,长度为8字节
* k:解密用的key,长度为16字节
**********************************************************************/ static void tea_decrypt(uint32_t *v,uint32_t *k)
{
uint32_t y = v[],z = v[],sum = 0xC6EF3720,i;
uint32_t delta = 0x9e3779b9;
uint32_t a = k[],b = k[],c = k[],d = k[]; for (i = ;i < ;i++)
{
z -= ((y << ) + c) ^ (y + sum) ^ ((y >> ) + d);
y -= ((z << ) + a) ^ (z + sum) ^ ((z >> ) + b);
sum -= delta;
}
v[] = y;
v[] = z;
} /*********************************************************************
* 加密算法
*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这
* size_src:源数据大小,单位字节
* key:密钥,16字节
*返回:密文的字节数
**********************************************************************/ uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
uint8_t a = ;
uint16_t i = ;
uint16_t num = ; //将明文补足为8字节的倍数
a = size_src % ;
if (a != )
{
for (i = ;i < - a;i++)
{
src[size_src++] = ;
}
} //加密
num = size_src / ;
for (i = ;i < num;i++)
{
tea_encrypt((uint32_t *)(src + i * ),(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 = ;
uint16_t num = ; //判断长度是否为8的倍数
if (size_src % != )
{
return ;
} //解密
num = size_src / ;
for (i = ;i < num;i++)
{
tea_decrypt((uint32_t *)(src + i * ),(uint32_t *)key);
} return size_src;
}

加密示例代码:

i = ;
//设备类型
arr[i++] = DEVICE >> ;
arr[i++] = DEVICE;
//命令字
arr[i++] = node.cmd >> ;
arr[i++] = node.cmd;
//序列号
if (node.index)
{
arr[i++] = node.index >> ;
arr[i++] = node.index;
}
else
{
arr[i++] = Tx_Index >> ;
arr[i++] = Tx_Index;
Tx_Index++;
}
//用户号
arr[i++] = User_Id >> ;
arr[i++] = User_Id >> ;
arr[i++] = User_Id >> ;
arr[i++] = User_Id;
//密码
//判断是否是确认修改密码
if (node.cmd != CMD_NET_CONFIRM_EDIT_PASSWORD)
{
arr[i++] = Password >> ;
arr[i++] = Password >> ;
arr[i++] = Password >> ;
arr[i++] = Password;
}
else
{
arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> );
arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> );
arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> );
arr[i++] = (uint8_t)PASSWORD_BACKDOOR;
}
//报文长度
arr[i++] = node.size >> ;
arr[i++] = node.size;
//包文crc
crc = crc_code(node.buf,node.size);
arr[i++] = crc >> ;
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) == )
{
//解密失败
break;
}

单片机上使用TEA加密通信(转)的更多相关文章

  1. 数据的加密传输——单片机上实现TEA加密解密算法

    各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...

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

    xmlrpc .  https . cookies . httpclient.bugzilla . java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能,网上针对bugzilla的实现很 ...

  3. PC和单片机通过MODBUS RTU通信

    最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度.湿度.或者控制信号的状态等.有了MODBU ...

  4. TEA加密

    TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据.TEA特点是速度快.效率高,实现也 ...

  5. 在Windows上使用Let加密IIS

    在Windows上使用Let加密IIS https://weblog.west-wind.com/posts/2016/Feb/22/Using-Lets-Encrypt-with-IIS-on-Wi ...

  6. ZMQ示例:使用 curve 进行加密通信

    1. ZMQ 官方文档 ZMQ 的官方文档中关于 curve 的介绍如下: Client and server roles A socket using CURVE can be either cli ...

  7. SSL及其加密通信过程

    SSL及其加密通信过程 什么是SSL SSL英文全称Secure Socket Layer,安全套接层,是一种为网络通信提供安全以及数据完整性的安全协议,它在传输层对网络进行加密.它主要是分为两层: ...

  8. Python3+ssl实现加密通信

    一.说明 1. python标准库ssl可实现加密通信 2. ssl库底层使用openssl,做了面向对像化改造和简化,但还是可以明显看出openssl的痕迹 3. 本文先给出python实现的soc ...

  9. 转: https 加密通信流程

    https 加密通信流程当用户在浏览器中输入一个以https开头的网址时,便开启了浏览器与被访问站点之间的加密通信.下面我们以一个用户访问https://qbox.me为例,给读者展现一下SSL/TL ...

随机推荐

  1. IE9 浏览器无法捕获中键事件

    在silverlight中由于需要添加中键事件,所以通过hook来捕获,但是在IE9上无法运行,该问题是由于IE9设置问题,如下图修改配置, 取消选择即可:

  2. Atomic 升级

    Atomic 采用类似github的版本管理,  可以使用以下命令升级 ostree remote add --set=gpg-verify=false atomic20160212 http://. ...

  3. mx51 IPU 透明处理

    Freescale MX51平台的透明处理根据bpp(bits_per_pixel)不同,处理方式有所不同. 透明处理涉及到两个图层的合并,这个合并操作是MX51 IPU的DP(Display pro ...

  4. nginx构建https

    1.生成证书#openssl genrsa -des3 -out server.key 1024#openssl req -new -key server.key -out server.csr#op ...

  5. hibernate异常:org.hibernate.exception.GenericJDBCException

    异常:org.hibernate.exception.GenericJDBCException 提示:Cannot open connection 提示:不能打开链接 一般这个异常是由 java.sq ...

  6. 常用的js事件

    onmouseover:鼠标放上去时触发事件 onmouseout:鼠标从上面移开时触发事件 onclick:鼠标单击事件 onfocus:获得焦点 onblur:失去焦点 onchange:下拉菜单 ...

  7. Android:关于背景选择器Selector的item顺序

    在使用背景选择器的时候,如果item的顺序不对,会导致不起作用. 1.首先背景选择器的normal选项一定要放在最后. 2.pressed的选择器应该在seclet的前面.我在使用的时候找了半天问题, ...

  8. sql 关于dblink和多条update、insert事务回滚写法

    在存储过程的编写中难免会遇到调用同库他人的proc和跨库调用proc,还有一个proc中有多条对多表进行写入和修改的语句.那么就会用到tran. 如果我们在不写try的情况下就要对每个insert,u ...

  9. MarkDown编写规范指南

    Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...

  10. jquery操作ajax返回的页面元素

    这两天工作不忙,正好从朋友那里拿到一个某个应用的开发文档,相关数据放在了mongodb里,自己电脑可以本地开启服务器然后通过给的借口来获取数据.由于这是一个比较大比较全的一个完整项目,也没有那么多经历 ...