搜索
bottom↓
回复: 158

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

  [复制链接]

出0入0汤圆

发表于 2010-9-13 19:52:53 | 显示全部楼层 |阅读模式
各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性。常用的加密解密算法比如DES、RSA等,受限于单片机的内存和运算速度,实现起来比较困难,但一种叫TEA的加密算法特别适合单片机使用,我搜了一下,发现坛子里没有相关资料,嘿嘿,钻了个空,补充之~~

TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,实现简单著称。算法很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。目前我只知道QQ一直用的是16轮TEA。--摘自CSDN博客

我之前做过一个数字的无线对讲机,把语音数据加密后发送,双方事先规定好公共的密钥,就可以进行加密和解密了。至于TEA算法速度,在我看来确实很快,我当时用的是16位的msp430单片机,晶振只有6M,每秒钟大概可以进行两三百次加密和解密的操作(一次加密和解密32字节)。
说到加密,最简单的方式就是把要发送的数据和同样长度的密码进行异或运算,得到新的数据就是加密后的数据,然后,接收方把加密数据和密码进行异或就能得到原始数据。但这种异或的方法安全性如何,我也说不清楚。

下面上传了c++实现的TEA算法,可以在vc里面调试看看。我把它改了改,让它适合单片机使用,下面的TEA.h和TEA.c可以包含在你的工程里面。
使用时,根据你所要加密的数据包长度修改宏定义BLOCK_SIZE,密钥的长度是16字节。数据和密钥都是存放在数组里面的,比如:

//TEA密钥
unsigned char TEA_key[16]=
{
  0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10
};

//数据缓冲区
unsigned char TX_buffer[32];
unsigned char RX_buffer[32];

加密时使用函数:
btea_encrypt(TX_buffer,TEA_key);      //TEA加密
这样,数组TX_buffer里面的新内容就是加密后的数据。

接收到的密文数据存放在RX_buffer里面,调用下面函数:
decrpyt(RX_buffer,TEA_key);      //TEA解密
就能得到之前的明文。

/*******************
  TEA加密解密算法
*******************/
#include "TEA.h"

#define MX (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z)
#define DELTA 0x9e3779b9
#define S_LOOPTIME   1    //5
#define BLOCK_SIZE   31   //PAGE_SIZE,根据你所要加密的数据包长度修改此参数(单位:字节)

/*
*key  maybe 128bit =16 Bytes.
*buf  maybe BLOCK_SIZE
*/

void btea_encrypt( unsigned char* buf, unsigned char* key )
{
  unsigned char  n=BLOCK_SIZE/4;
  unsigned long *v=(unsigned long *)buf;
  unsigned long *k=(unsigned long *)key;
  unsigned long z = v[n - 1],y = v[0],sum = 0,e ;
  unsigned char p,q ;
  // Coding Part

  q = S_LOOPTIME + 52 / n ;
  while ( q-- > 0 )
  {
    sum += DELTA ;
    e = sum >> 2 & 3 ;
    for ( p = 0 ; p < n - 1 ; p++ )
      y = v[p + 1],
      z = v[p] += MX;
      y = v[0] ;
    z = v[n - 1] += MX;
  }
}

/*
*key  maybe 128bit =16Bytes.
*buf  maybe BLOCK_SIZE
inbuf == outbuf == buf
*/

void btea_decrpyt( unsigned char* buf, unsigned char* key )
{
  unsigned char n=BLOCK_SIZE/4;
  unsigned long *v=(unsigned long *)buf;
  unsigned long *k=(unsigned long *)key;
  unsigned long z = v[n - 1],y = v[0],sum = 0,e ;
  unsigned char  p,q ;

  //Decoding Part...
  q = S_LOOPTIME + 52 / n ;
  sum = q * DELTA ;
  while ( sum != 0 )
  {
    e = sum >> 2 & 3 ;
    for ( p = n - 1 ; p > 0 ; p-- )
      z = v[p - 1],
      y = v[p] -= MX;
      z = v[n - 1] ;
    y = v[0] -= MX;
            sum -= DELTA ;
  }
}

点击此处下载 ourdev_582753YN9I5S.rar(文件大小:753K) (原文件名:TEA.rar)

出0入0汤圆

发表于 2010-9-13 20:01:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-13 20:10:43 | 显示全部楼层
不错不错,是个好东西。

出0入0汤圆

发表于 2010-9-13 21:34:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-13 21:41:40 | 显示全部楼层
强贴!MARK!!!

出0入0汤圆

发表于 2010-9-13 21:53:03 | 显示全部楼层
好贴,mark。

出0入0汤圆

发表于 2010-9-13 22:09:31 | 显示全部楼层
QQ2008之前的协议就是TEA加密的,现在没去研究过就不清楚了
代码确实较为简单,适合MCU用的

出0入8汤圆

发表于 2010-9-13 22:14:15 | 显示全部楼层
好东西,mark

出0入0汤圆

发表于 2010-9-13 22:36:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-13 22:54:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-13 23:04:59 | 显示全部楼层
试了一下!

请问楼主下面这个参数的含义
#define S_LOOPTIME   1    //5



BLOCK_SIZE为什么是31,而不是32呢????
#define BLOCK_SIZE   31   //PAGE_SIZE,根据你所要加密的数据包长度修改此参数(单位:字节)

出0入0汤圆

发表于 2010-9-13 23:18:18 | 显示全部楼层
好东西,收下了,谢谢

出0入0汤圆

发表于 2010-9-14 01:32:10 | 显示全部楼层
半夜睡不着,顶帖

出0入0汤圆

发表于 2010-9-14 07:40:18 | 显示全部楼层
拜读。

出0入17汤圆

发表于 2010-9-14 07:59:55 | 显示全部楼层
mark

出0入17汤圆

发表于 2010-9-14 08:02:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-14 08:20:15 | 显示全部楼层
标 记

出0入0汤圆

发表于 2010-9-14 08:44:17 | 显示全部楼层
M A R K

出0入0汤圆

发表于 2010-9-14 08:49:02 | 显示全部楼层
强帖!!!

出0入0汤圆

发表于 2010-9-14 08:53:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-14 09:13:37 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-9-14 09:17:21 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-9-14 09:25:14 | 显示全部楼层
真不错,比AES简单多了
顺便提一下
XXX.plg
XXX.ncb
XXX.opt
/debug 下所有的文件
可以不发出来,以便节约网络带宽.

出0入0汤圆

发表于 2010-9-14 09:26:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-14 09:46:32 | 显示全部楼层
不错,试一试

出0入0汤圆

发表于 2010-9-14 10:18:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-14 10:45:58 | 显示全部楼层
关注下

出0入0汤圆

发表于 2010-9-14 10:47:06 | 显示全部楼层
刚才查了下资料说 TEA (包括其扩展 XXTEA) 在对抗差分明文攻击时,无法得到预期的128bit安全特性,
不过要是给 IAP 加密(传密文进IAP程序,解开后烧写Flash)应该没事.
点击此处下载 ourdev_582838F1ICM8.pdf(文件大小:319K) (原文件名:254.pdf)

出0入0汤圆

发表于 2010-9-14 10:48:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-14 11:03:54 | 显示全部楼层
看了下 不错。。我也搞差不多的 有比这更好的  其他不多说 有需要学习的可以联系

出0入0汤圆

发表于 2010-9-14 11:10:39 | 显示全部楼层
我有DES 单片机方面应用 呵呵 不方便发出来 有时间可以讨论下

出0入0汤圆

 楼主| 发表于 2010-9-14 11:12:54 | 显示全部楼层
回复【27楼】hameyou
回复【10楼】jackielau 九天
试了一下!  
请问楼主下面这个参数的含义  
#define s_looptime   1    //5   
block_size为什么是31,而不是32呢????  
#define block_size   31   //page_size,根据你所要加密的数据包长度修改此参数(单位:字节)
-----------------------------------------------------------------------
我试了一下 block_size是数据包的大小,按上面的例子的话应该是32,如果设为31的话只加密了28个字节,还有四个字节未加密
-----------------------------------------------------------------------

这个是我的疏忽,block_size应该填32,而不是31,我做的东西缓存是32字节,因为第一个字节是指令,不用加密,所以是31,我直接把源码复制粘贴过来的,忘记了修改,抱歉!

s_looptime的含义是什么?这也是我困惑的,原来的程序里面用的是5,这是不是迭代次数之类的参数?等待高人解释。。。
我调试发现s_looptime无论填多少,生成的密文是不一样的,但是解密后数据都是对的。

出0入0汤圆

发表于 2010-9-14 11:18:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-14 12:26:14 | 显示全部楼层
马克

出0入0汤圆

发表于 2010-9-14 13:10:17 | 显示全部楼层
nilxy可不可以留个Q  讨论下 有点想法请教下

出0入0汤圆

发表于 2010-9-14 13:45:15 | 显示全部楼层
比如 我有数

密钥 KEY[]={0xAB,0X54,0XA9,0X8C,0XEB,0X1F,0X0A,0XD2};

需要加密的数据就是明文 是吗?

那明文 OP【】={0x00,0x00,0x00,0x7B,0xEE,0xEE,0xEE,0xEE}

烦请楼主算下 我想看下结果,和DES的比较下 。。
谢谢

出0入0汤圆

发表于 2010-9-14 14:40:31 | 显示全部楼层
mark TEA,AES,DES

出0入17汤圆

发表于 2010-9-14 14:55:01 | 显示全部楼层
刚才测试了一下,如果加密数据的长度小于8,也就是 BLOCK_SIZE 如果小于8,加密解密失败,确认一下是否存在这个问题,谢谢

出0入0汤圆

发表于 2010-9-14 15:49:41 | 显示全部楼层
y = v[p + 1],和z = v[p - 1],这两句有问题吗

出5入8汤圆

发表于 2010-9-14 16:11:11 | 显示全部楼层
mark!

出0入0汤圆

 楼主| 发表于 2010-9-14 16:49:56 | 显示全部楼层
回复【39楼】Trylin
刚才测试了一下,如果加密数据的长度小于8,也就是 block_size 如果小于8,加密解密失败,确认一下是否存在这个问题,谢谢
-----------------------------------------------------------------------

百度百科上搜到了TEA的相关资料http://baike.baidu.com/view/3368021.html
我查过,TEA原始算法使用128位的密钥为64位的信息块进行加密,也就是说密钥长度16字节、数据长度8字节是不能改变的。上传的这个算法是TEA的变种,数据长度可以自定,但要大于8字节,可能就是这个原因

出0入0汤圆

 楼主| 发表于 2010-9-14 16:56:38 | 显示全部楼层
回复【37楼】ql1007
比如 我有数
密钥 key[]={0xab,0x54,0xa9,0x8c,0xeb,0x1f,0x0a,0xd2};
需要加密的数据就是明文 是吗?
那明文 op【】={0x00,0x00,0x00,0x7b,0xee,0xee,0xee,0xee}
烦请楼主算下 我想看下结果,和des的比较下 。。
谢谢
-----------------------------------------------------------------------

TEA的密钥长度必须是16字节,好像不能改,你的这个密钥长度是8字节
至于DES,好像特别耗内存吧,至少要1K内存是不是有这么回事?为何不贴出来给大家分享呢。。。

出0入0汤圆

发表于 2010-9-14 19:43:43 | 显示全部楼层
回复【33楼】nilxy  
-----------------------------------------------------------------------
n=32/4=8
q=1+52/8=7
也就是进行7次迭代???

n=BLOCK_SIZE/4;
q = S_LOOPTIME + 52 / n ;
  while ( q-- > 0 )
  {
    sum += DELTA ;
    e = sum >> 2 & 3 ;
    for ( p = 0 ; p < n - 1 ; p++ )
      y = v[p + 1],
      z = v[p] += MX;
      y = v[0] ;
    z = v[n - 1] += MX;
  }

出0入0汤圆

发表于 2010-9-14 20:29:38 | 显示全部楼层
这有一篇关于XXTEA的C实现的文章,用了32 轮迭代

http://www.xxlinux.com/linux/article/development/soft/20070911/9687.html


代码:
1 void encrypt(unsigned long *v, unsigned long *k) {
2     unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
3     unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
4     unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
5     for (i=0; i < 32; i++) {                        /* basic cycle start */
6         sum += delta;
7         y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
8         z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
9     }
10     v[0]=y;
11     v[1]=z;
12 }
13
14 void decrypt(unsigned long *v, unsigned long *k) {
15     unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
16     unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
17     unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
18     for(i=0; i<32; i++) {                            /* basic cycle start */
19         z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
20         y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
21         sum -= delta;                                /* end cycle */
22     }
23     v[0]=y;
24     v[1]=z;
25 }

出0入0汤圆

发表于 2010-9-15 09:02:23 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-9-15 16:57:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-15 19:29:37 | 显示全部楼层
mark

PS: xmega带AES,DES加密引擎,可以达到上M的通信率,也可以考虑下。

出0入0汤圆

发表于 2010-9-15 20:26:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-15 21:19:47 | 显示全部楼层
mark  tea加密

出0入0汤圆

发表于 2010-10-26 18:57:30 | 显示全部楼层
不错的通信加密算法,速度快

出0入0汤圆

发表于 2010-10-27 09:25:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 10:28:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 10:46:08 | 显示全部楼层
战略马克。。。。

出0入0汤圆

发表于 2010-10-27 11:24:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 11:33:50 | 显示全部楼层
jh

出0入0汤圆

发表于 2010-10-27 11:38:28 | 显示全部楼层
这个要顶
很好,很强大,

出0入0汤圆

发表于 2010-10-27 12:27:31 | 显示全部楼层
记号备用

出0入0汤圆

发表于 2010-10-27 13:53:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 14:04:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 16:52:42 | 显示全部楼层
make

出0入0汤圆

发表于 2010-11-1 09:46:47 | 显示全部楼层
简单,而且效率高,值得学习学习

出0入0汤圆

发表于 2010-11-1 18:05:04 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-11-1 18:08:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-1 19:18:11 | 显示全部楼层
啊,一直用DES加密.

出0入0汤圆

发表于 2010-11-1 20:47:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-1 20:50:38 | 显示全部楼层
这个顶一下,TEA单片机加密通讯

出0入0汤圆

发表于 2010-11-1 21:54:12 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-11-1 21:58:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-1 22:01:16 | 显示全部楼层
待学~~

出0入4汤圆

发表于 2010-11-1 22:11:48 | 显示全部楼层
OK

出95入100汤圆

发表于 2010-11-2 09:18:53 | 显示全部楼层
tea加密,mark

出0入0汤圆

发表于 2010-11-2 10:50:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-3 15:47:24 | 显示全部楼层
这个是tea加密的加强版xxtea,wiki如下:
http://en.wikipedia.org/wiki/XXTEA

出0入0汤圆

发表于 2010-11-3 15:54:04 | 显示全部楼层
楼主的,就是xxtea

出0入0汤圆

发表于 2010-11-3 15:55:15 | 显示全部楼层
回复【33楼】nilxy
-----------------------------------------------------------------------
s_looptime其实控制的是加密的轮数,
q = S_LOOPTIME + 52 / n ; 改为rounds = 6 + 52/n;意思更加明了

出0入0汤圆

发表于 2010-11-12 21:51:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-12 22:36:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-13 11:48:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-30 22:44:07 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-1-30 11:15:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-30 11:33:56 | 显示全部楼层
我在一个产品中用了这个算法,跟PC的通信进行了TEA加密,呵呵

出0入0汤圆

发表于 2011-1-30 11:52:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-30 11:56:46 | 显示全部楼层
mark

TEA加密解密算法

出0入0汤圆

发表于 2011-1-30 13:42:41 | 显示全部楼层
mark.

出0入0汤圆

发表于 2011-1-30 14:47:26 | 显示全部楼层
不错,在新的作品上试下用

出0入0汤圆

发表于 2011-1-30 14:48:01 | 显示全部楼层
单片机上实现TEA加密解密算法

出0入0汤圆

发表于 2011-1-30 16:17:22 | 显示全部楼层
牛x

出0入0汤圆

发表于 2011-1-30 16:39:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-30 20:52:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-30 21:04:56 | 显示全部楼层
顶 好东西 学习了

出0入0汤圆

发表于 2011-1-30 21:53:17 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-1-30 22:48:33 | 显示全部楼层
谢谢,mark

出0入0汤圆

发表于 2011-1-31 22:08:05 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-1-31 23:12:54 | 显示全部楼层
果断mark

出0入0汤圆

发表于 2011-2-1 09:06:29 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-2-1 11:53:57 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-7-3 23:57:16 | 显示全部楼层
战略mark

出0入0汤圆

发表于 2011-7-4 09:46:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-6 16:46:10 | 显示全部楼层
现在才知道这些知识,真是太晚了!
多谢楼主的辛苦整理以及各位的补充!

出0入0汤圆

发表于 2011-7-6 18:13:48 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 03:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表