nilxy 发表于 2010-9-13 19:52:53

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

各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性。常用的加密解密算法比如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=
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10
};

//数据缓冲区
unsigned char TX_buffer;
unsigned char RX_buffer;

加密时使用函数:
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^z)
#define DELTA 0x9e3779b9
#define S_LOOPTIME   1    //5
#define BLOCK_SIZE   31   //PAGE_SIZE,根据你所要加密的数据包长度修改此参数(单位:字节)

/*
*keymaybe 128bit =16 Bytes.
*bufmaybe BLOCK_SIZE
*/

void btea_encrypt( unsigned char* buf, unsigned char* key )
{
unsigned charn=BLOCK_SIZE/4;
unsigned long *v=(unsigned long *)buf;
unsigned long *k=(unsigned long *)key;
unsigned long z = v,y = v,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,
      z = v += MX;
      y = v ;
    z = v += MX;
}
}

/*
*keymaybe 128bit =16Bytes.
*bufmaybe 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,y = v,sum = 0,e ;
unsigned charp,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,
      y = v -= MX;
      z = v ;
    y = v -= MX;
            sum -= DELTA ;
}
}

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

dianzidog 发表于 2010-9-13 20:01:33

mark

90999 发表于 2010-9-13 20:10:43

不错不错,是个好东西。

haigerl 发表于 2010-9-13 21:34:53

mark

plc_avr 发表于 2010-9-13 21:41:40

强贴!MARK!!!

exploer 发表于 2010-9-13 21:53:03

好贴,mark。

lysoft 发表于 2010-9-13 22:09:31

QQ2008之前的协议就是TEA加密的,现在没去研究过就不清楚了
代码确实较为简单,适合MCU用的

kebaojun305 发表于 2010-9-13 22:14:15

好东西,mark

xuejianhua1986 发表于 2010-9-13 22:36:13

mark

xk376632352 发表于 2010-9-13 22:54:03

mark

jackielau 发表于 2010-9-13 23:04:59

试了一下!

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



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

ljqlaq 发表于 2010-9-13 23:18:18

好东西,收下了,谢谢

lou0908 发表于 2010-9-14 01:32:10

半夜睡不着,顶帖

STM8L103 发表于 2010-9-14 07:40:18

拜读。

Trylin 发表于 2010-9-14 07:59:55

mark

Trylin 发表于 2010-9-14 08:02:36

mark

XQGG 发表于 2010-9-14 08:20:15

标 记

chengluoran 发表于 2010-9-14 08:44:17

M A R K

kms2hh 发表于 2010-9-14 08:49:02

强帖!!!

418425051 发表于 2010-9-14 08:53:52

mark

yajira 发表于 2010-9-14 09:13:37

关注

wmm20031015 发表于 2010-9-14 09:17:21

不错

mengxin 发表于 2010-9-14 09:25:14

真不错,比AES简单多了
顺便提一下
XXX.plg
XXX.ncb
XXX.opt
/debug 下所有的文件
可以不发出来,以便节约网络带宽.

hy317 发表于 2010-9-14 09:26:11

mark

lee345 发表于 2010-9-14 09:46:32

不错,试一试

pujing 发表于 2010-9-14 10:18:51

mark

catzl7 发表于 2010-9-14 10:45:58

关注下

mengxin 发表于 2010-9-14 10:47:06

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

jpchen 发表于 2010-9-14 10:48:29

mark

ql1007 发表于 2010-9-14 11:03:54

看了下 不错。。我也搞差不多的 有比这更好的其他不多说 有需要学习的可以联系

ql1007 发表于 2010-9-14 11:10:39

我有DES 单片机方面应用 呵呵 不方便发出来 有时间可以讨论下

nilxy 发表于 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无论填多少,生成的密文是不一样的,但是解密后数据都是对的。

jerryzheng 发表于 2010-9-14 11:18:33

mark

gloryzkl 发表于 2010-9-14 12:26:14

马克

ql1007 发表于 2010-9-14 13:10:17

nilxy可不可以留个Q讨论下 有点想法请教下

ql1007 发表于 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的比较下 。。
谢谢

boycn 发表于 2010-9-14 14:40:31

mark TEA,AES,DES

Trylin 发表于 2010-9-14 14:55:01

刚才测试了一下,如果加密数据的长度小于8,也就是 BLOCK_SIZE 如果小于8,加密解密失败,确认一下是否存在这个问题,谢谢

Eiman 发表于 2010-9-14 15:49:41

y = v,和z = v,这两句有问题吗

anning 发表于 2010-9-14 16:11:11

mark!

nilxy 发表于 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字节,可能就是这个原因

nilxy 发表于 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内存是不是有这么回事?为何不贴出来给大家分享呢。。。

jackielau 发表于 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,
      z = v += MX;
      y = v ;
    z = v += MX;
}

jackielau 发表于 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, z=v, sum=0, i;         /* set up */
3   unsigned long delta=0x9e3779b9;               /* a key schedule constant */
4   unsigned long a=k, b=k, c=k, d=k;   /* 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=y;
11   v=z;
12 }
13
14 void decrypt(unsigned long *v, unsigned long *k) {
15   unsigned long y=v, z=v, sum=0xC6EF3720, i; /* set up */
16   unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
17   unsigned long a=k, b=k, c=k, d=k;    /* 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=y;
24   v=z;
25 }

huatuizh 发表于 2010-9-15 09:02:23

看看

swustlx86 发表于 2010-9-15 16:57:04

mark

shdzbsl 发表于 2010-9-15 19:29:37

mark

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

ringan865 发表于 2010-9-15 20:26:47

mark

czhxp 发表于 2010-9-15 21:19:47

marktea加密

feng200808 发表于 2010-10-26 18:57:30

不错的通信加密算法,速度快

duolunwei 发表于 2010-10-27 09:25:44

mark

leifeng 发表于 2010-10-27 10:28:43

mark

mail2li 发表于 2010-10-27 10:46:08

战略马克。。。。

avrwoo 发表于 2010-10-27 11:24:04

mark

ndust 发表于 2010-10-27 11:33:50

jh

wanyou132 发表于 2010-10-27 11:38:28

这个要顶
很好,很强大,

lljme 发表于 2010-10-27 12:27:31

记号备用

pujing 发表于 2010-10-27 13:53:16

mark

zylaputa 发表于 2010-10-27 14:04:20

mark

john_8 发表于 2010-10-27 16:52:42

make

feng200808 发表于 2010-11-1 09:46:47

简单,而且效率高,值得学习学习

charlie2008 发表于 2010-11-1 18:05:04

mark!

flotox 发表于 2010-11-1 18:08:46

mark

wisebaby 发表于 2010-11-1 19:18:11

啊,一直用DES加密.

joni 发表于 2010-11-1 20:47:42

mark

GuDaoFan 发表于 2010-11-1 20:50:38

这个顶一下,TEA单片机加密通讯

hubeilcsun2 发表于 2010-11-1 21:54:12

标记

www1519 发表于 2010-11-1 21:58:09

mark

zforce 发表于 2010-11-1 22:01:16

待学~~

xymxym 发表于 2010-11-1 22:11:48

OK

lhj200304 发表于 2010-11-2 09:18:53

tea加密,mark

idle 发表于 2010-11-2 10:50:40

mark

feng200808 发表于 2010-11-3 15:47:24

这个是tea加密的加强版xxtea,wiki如下:
http://en.wikipedia.org/wiki/XXTEA

zhifeng 发表于 2010-11-3 15:54:04

楼主的,就是xxtea

feng200808 发表于 2010-11-3 15:55:15

回复【33楼】nilxy
-----------------------------------------------------------------------
s_looptime其实控制的是加密的轮数,
q = S_LOOPTIME + 52 / n ; 改为rounds = 6 + 52/n;意思更加明了

adszmc 发表于 2010-11-12 21:51:39

mark

zprs 发表于 2010-11-12 22:36:54

mark

fanwt 发表于 2010-11-13 11:48:59

mark

logers 发表于 2010-11-30 22:44:07

Mark

jason_more 发表于 2011-1-30 11:15:20

mark

jackielau 发表于 2011-1-30 11:33:56

我在一个产品中用了这个算法,跟PC的通信进行了TEA加密,呵呵

zhizheyuren 发表于 2011-1-30 11:52:37

mark

cu_ice 发表于 2011-1-30 11:56:46

mark

TEA加密解密算法

alasika 发表于 2011-1-30 13:42:41

mark.

lee345 发表于 2011-1-30 14:47:26

不错,在新的作品上试下用

huanggua 发表于 2011-1-30 14:48:01

单片机上实现TEA加密解密算法

flyingcys 发表于 2011-1-30 16:17:22

牛x

rafd 发表于 2011-1-30 16:39:12

mark

cyberjok 发表于 2011-1-30 20:52:46

mark

angg 发表于 2011-1-30 21:04:56

顶 好东西 学习了

yy945 发表于 2011-1-30 21:53:17

Mark

zlutian 发表于 2011-1-30 22:48:33

谢谢,mark

junmark 发表于 2011-1-31 22:08:05

mark!!

lukeunderwood 发表于 2011-1-31 23:12:54

果断mark

qhdz 发表于 2011-2-1 09:06:29

mark!

jack_yu 发表于 2011-2-1 11:53:57

mark!

kevin_ares 发表于 2011-7-3 23:57:16

战略mark

52avr 发表于 2011-7-4 09:46:39

mark

yanrz 发表于 2011-7-6 16:46:10

现在才知道这些知识,真是太晚了!
多谢楼主的辛苦整理以及各位的补充!

sanbin 发表于 2011-7-6 18:13:48

mark
页: [1] 2
查看完整版本: 数据的加密传输——单片机上实现TEA加密解密算法