单片机上使用TEA加密通信
扫描二维码
随时随地手机看文章
环境:
主机:WIN7
开发环境:MDK4.72
单片机:STM32
说明:
在项目中单片机会与服务器进行网络通讯.需要对通讯加密,我选择了TEA加密算法.
源码:
tea.h
/*********************************************************************
*TEA算法头文件
*(c)copyright2013,jdh
*AllRightReserved
*文件名:tea.h
*程序员:jdh
**********************************************************************/
/*********************************************************************
*说明:TEA加密解密算法
*TEA(TinyEncryptionAlgorithm)是一种简单高效的加密算法,以加密解密速度快,
*实现简单著称。
*算法很简单,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字节
**********************************************************************/
staticvoidtea_encrypt(uint32_t*v,uint32_t*k);
/*********************************************************************
*tea解密
*参数:v:要解密的数据,长度为8字节
*k:解密用的key,长度为16字节
**********************************************************************/
staticvoidtea_decrypt(uint32_t*v,uint32_t*k);
/*********************************************************************
*加密算法
*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这
*size_src:源数据大小,单位字节
*key:密钥,16字节
*返回:密文的字节数
**********************************************************************/
uint16_tencrypt(uint8_t*src,uint16_tsize_src,uint8_t*key);
/*********************************************************************
*解密算法
*参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这
*size_src:源数据大小,单位字节
*key:密钥,16字节
*返回:明文的字节数,如果失败,返回0
**********************************************************************/
uint16_tdecrypt(uint8_t*src,uint16_tsize_src,uint8_t*key);
#endif
tea.c
/*********************************************************************
*TEA算法主文件
*(c)copyright2013,jdh
*AllRightReserved
*文件名:hash.c
*程序员:jdh
**********************************************************************/
/*********************************************************************
*头文件
**********************************************************************/
#include"tea.h"
/*********************************************************************
*函数
**********************************************************************/
/*********************************************************************
*tea加密
*参数:v:要加密的数据,长度为8字节
*k:加密用的key,长度为16字节
**********************************************************************/
staticvoidtea_encrypt(uint32_t*v,uint32_t*k)
{
uint32_ty=v[0],z=v[1],sum=0,i;
uint32_tdelta=0x9e3779b9;
uint32_ta=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字节
**********************************************************************/
staticvoidtea_decrypt(uint32_t*v,uint32_t*k)
{
uint32_ty=v[0],z=v[1],sum=0xC6EF3720,i;
uint32_tdelta=0x9e3779b9;
uint32_ta=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