跳转到主要内容
cathy 提交于

作者: 刘韶轩

这里说的加密通信和常说的防止程序被破解加密还是不一样的。后者指的是程序烧录到单片机以后,防止被竞争对手读取里面的hex文件而采取的一些手段。简单点说:防抄板。

后者指的是,通信过程中,对一些比较重要的信息进行加密,这样即便别人得到了,也不知道信息是什么意思。比如说UART通信,假设正在传输IC卡的账户,密码,余额等信息。换做五年前的我,肯定是傻不愣登的直接送过去。如果有人想获取这个信息,很容易的,几条线接过去就能读到。

TEA加密是怎么加密呢?定义和原理我就不说了,百度都能找到,万一说错了还丢人。简单说下过程:算法分两部分,一部分进行加密,一部分进行解密。

发送方先对数据进行加密,然后传输;接收方收到数据,然后解密,得到真正的信息。

小白可能会问,解密算法网上遍地都是,那第三方得到以后岂不是也能解密?

理论上是这样,但是,解密还需要一个比较重要的东西,就是:密钥。

怎么读?普通字典里一般读:mi yue(蜜月?),技术字典中被标为:mi yao

这里的密钥是一个16字节的数字,必须要有这个密钥,数据才能被解密,如果没有,暴力破解?16字节可能的组合有多少种呢...........

大致就是这么一个算法,很短小,却很有用。下面是源码:

<p>tea.h </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                          TEA算法头文件  </p>
<p> </p>
<p>*                       (c)copyright 2013,jdh  </p>
<p> </p>
<p>*                         All Right Reserved  </p>
<p> </p>
<p>*文件名:tea.h  </p>
<p> </p>
<p>*程序员:jdh  </p>
<p> </p>
<p>**********************************************************************/  </p>

<p>/*********************************************************************  </p>
<p> </p>
<p>*说明:TEA加密解密算法  </p>
<p> </p>
<p>*TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,  </p>
<p> </p>
<p>*实现简单著称。  </p>
<p> </p>
<p>*算法很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,  </p>
<p> </p>
<p>*算法采用迭代的形式,  </p>
<p> </p>
<p>*推荐的迭代轮数是64轮,最少32轮。  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>#ifndef _TEA_H_   </p>
<p> </p>
<p>#define _TEA_H_   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           头文件  </p>
<p> </p>
<p>**********************************************************************/  </p>

<p>#include &quot;header.h&quot;   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           函数  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           tea加密  </p>
<p> </p>
<p>*参数:v:要加密的数据,长度为8字节  </p>
<p> </p>
<p>*     k:加密用的key,长度为16字节  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>static void tea_encrypt(uint32_t *v,uint32_t *k);   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           tea解密  </p>
<p> </p>
<p>*参数:v:要解密的数据,长度为8字节  </p>
<p> </p>
<p>*     k:解密用的key,长度为16字节  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>static void tea_decrypt(uint32_t *v,uint32_t *k);   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/********************************************************************* </p>

<p>*                           加密算法  </p>
<p> </p>
<p>*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这  </p>
<p> </p>
<p>*     size_src:源数据大小,单位字节  </p>
<p> </p>
<p>*     key:密钥,16字节  </p>
<p> </p>
<p>*返回:密文的字节数  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key);   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           解密算法  </p>
<p> </p>
<p>*参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这  </p>
<p> </p>
<p>*     size_src:源数据大小,单位字节  </p>
<p> </p>
<p>*     key:密钥,16字节  </p>
<p> </p>
<p>*返回:明文的字节数,如果失败,返回0  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key);   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>#endif   </p>
<p> </p>
<p> </p>
<p> </p>
<p>tea.c </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                          TEA算法主文件  </p>
<p> </p>
<p>*                       (c)copyright 2013,jdh  </p>
<p> </p>
<p>*                         All Right Reserved  </p>
<p> </p>
<p>*文件名:hash.c </p>

<p>*程序员:jdh  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           头文件  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>#include &quot;tea.h&quot;   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           函数  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           tea加密  </p>
<p> </p>
<p>*参数:v:要加密的数据,长度为8字节  </p>
<p> </p>
<p>*     k:加密用的key,长度为16字节  </p>
<p> </p>
<p>**********************************************************************/  </p>

<p>static void tea_decrypt(uint32_t *v,uint32_t *k)    </p>
<p> </p>
<p>{   </p>
<p> </p>
<p>    uint32_t y = v[0],z = v[1],sum = 0xC6EF3720,i;    </p>
<p> </p>
<p>    uint32_t delta = 0x9e3779b9;               </p>
<p> </p>
<p>    uint32_t a = k[0],b = k[1],c = k[2],d = k[3];       </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    for (i = 0;i &lt; 32;i++)    </p>
<p> </p>
<p>    {                            </p>
<p> </p>
<p>        z -= ((y &lt;&lt; 4) + c) ^ (y + sum) ^ ((y &gt;&gt; 5) + d);   </p>
<p> </p>
<p>        y -= ((z &lt;&lt; 4) + a) ^ (z + sum) ^ ((z &gt;&gt; 5) + b);   </p>
<p> </p>
<p>        sum -= delta;                        </p>
<p> </p>
<p>    }   </p>
<p> </p>
<p>    v[0] = y;   </p>
<p> </p>
<p>    v[1] = z;   </p>
<p> </p>
<p>}   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/*********************************************************************  </p>
<p> </p>
<p>*                           加密算法  </p>
<p> </p>
<p>*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这  </p>
<p> </p>
<p>*     size_src:源数据大小,单位字节  </p>
<p> </p>
<p>*     key:密钥,16字节  </p>
<p> </p>
<p>*返回:密文的字节数  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key)   </p>
<p> </p>
<p>{   </p>
<p> </p>
<p>    uint8_t a = 0;   </p>
<p> </p>
<p>    uint16_t i = 0;   </p>
<p> </p>
<p>    uint16_t num = 0;   </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    //将明文补足为8字节的倍数   </p>
<p> </p>
<p>    a = size_src % 8;   </p>
<p> </p>
<p>    if (a != 0)   </p>
<p> </p>
<p>    {   </p>
<p> </p>
<p>        for (i = 0;i &lt; 8 - a;i++)   </p>
<p> </p>
<p>        {   </p>
<p> </p>
<p>            src[size_src++] = 0;   </p>
<p> </p>
<p>        }   </p>
<p> </p>
<p>    }   </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    //加密   </p>
<p> </p>
<p>    num = size_src / 8;   </p>
<p> </p>
<p>    for (i = 0;i &lt; num;i++)   </p>
<p> </p>
<p>    {   </p>
<p> </p>
<p>        tea_encrypt((uint32_t *)(src + i * 8),(uint32_t *)key);   </p>
<p> </p>
<p>    }   </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    return size_src;   </p>
<p> </p>
<p>}   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>/********************************************************************* </p>
<p>*                           解密算法  </p>
<p> </p>
<p>*参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这  </p>
<p> </p>
<p>*     size_src:源数据大小,单位字节  </p>
<p> </p>
<p>*     key:密钥,16字节  </p>
<p> </p>
<p>*返回:明文的字节数,如果失败,返回0  </p>
<p> </p>
<p>**********************************************************************/   </p>
<p> </p>
<p>   </p>
<p> </p>
<p>uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key)   </p>
<p> </p>
<p>{   </p>
<p> </p>
<p>    uint16_t i = 0;   </p>
<p> </p>
<p>    uint16_t num = 0;   </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    //判断长度是否为8的倍数   </p>
<p> </p>
<p>    if (size_src % 8 != 0)   </p>
<p> </p>
<p>    {   </p>
<p> </p>
<p>        return 0;   </p>
<p> </p>
<p>    }   </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    //解密   </p>
<p> </p>
<p>    num = size_src / 8;   </p>
<p> </p>
<p>    for (i = 0;i &lt; num;i++)   </p>
<p> </p>
<p>    {   </p>
<p> </p>
<p>        tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key);   </p>
<p> </p>
<p>    }   </p>
<p> </p>
<p>       </p>
<p> </p>
<p>    return size_src;   </p>
<p> </p>
<p>}  </p>

本文转载自<a href="http://mp.weixin.qq.com/s/h62aEctPwxZgWafWpbvdSw"&gt; 单片机爱好者</a>

单片机上使用TEA加密通信