数据的加密传输——单片机上实现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) mark 不错不错,是个好东西。 mark 强贴!MARK!!! 好贴,mark。 QQ2008之前的协议就是TEA加密的,现在没去研究过就不清楚了
代码确实较为简单,适合MCU用的 好东西,mark mark mark 试了一下!
请问楼主下面这个参数的含义
#define S_LOOPTIME 1 //5
BLOCK_SIZE为什么是31,而不是32呢????
#define BLOCK_SIZE 31 //PAGE_SIZE,根据你所要加密的数据包长度修改此参数(单位:字节) 好东西,收下了,谢谢 半夜睡不着,顶帖 拜读。 mark mark 标 记 M A R K 强帖!!! mark 关注 不错 真不错,比AES简单多了
顺便提一下
XXX.plg
XXX.ncb
XXX.opt
/debug 下所有的文件
可以不发出来,以便节约网络带宽. mark 不错,试一试 mark 关注下 刚才查了下资料说 TEA (包括其扩展 XXTEA) 在对抗差分明文攻击时,无法得到预期的128bit安全特性,
不过要是给 IAP 加密(传密文进IAP程序,解开后烧写Flash)应该没事.
点击此处下载 ourdev_582838F1ICM8.pdf(文件大小:319K) (原文件名:254.pdf) mark 看了下 不错。。我也搞差不多的 有比这更好的其他不多说 有需要学习的可以联系 我有DES 单片机方面应用 呵呵 不方便发出来 有时间可以讨论下 回复【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无论填多少,生成的密文是不一样的,但是解密后数据都是对的。 mark 马克 nilxy可不可以留个Q讨论下 有点想法请教下 比如 我有数
密钥 KEY[]={0xAB,0X54,0XA9,0X8C,0XEB,0X1F,0X0A,0XD2};
需要加密的数据就是明文 是吗?
那明文 OP【】={0x00,0x00,0x00,0x7B,0xEE,0xEE,0xEE,0xEE}
烦请楼主算下 我想看下结果,和DES的比较下 。。
谢谢 mark TEA,AES,DES 刚才测试了一下,如果加密数据的长度小于8,也就是 BLOCK_SIZE 如果小于8,加密解密失败,确认一下是否存在这个问题,谢谢 y = v,和z = v,这两句有问题吗 mark! 回复【39楼】Trylin
刚才测试了一下,如果加密数据的长度小于8,也就是 block_size 如果小于8,加密解密失败,确认一下是否存在这个问题,谢谢
-----------------------------------------------------------------------
百度百科上搜到了TEA的相关资料http://baike.baidu.com/view/3368021.html
我查过,TEA原始算法使用128位的密钥为64位的信息块进行加密,也就是说密钥长度16字节、数据长度8字节是不能改变的。上传的这个算法是TEA的变种,数据长度可以自定,但要大于8字节,可能就是这个原因 回复【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内存是不是有这么回事?为何不贴出来给大家分享呢。。。 回复【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;
} 这有一篇关于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 } 看看 mark mark
PS: xmega带AES,DES加密引擎,可以达到上M的通信率,也可以考虑下。 mark marktea加密 不错的通信加密算法,速度快 mark mark 战略马克。。。。 mark jh 这个要顶
很好,很强大, 记号备用 mark mark make 简单,而且效率高,值得学习学习 mark! mark 啊,一直用DES加密. mark 这个顶一下,TEA单片机加密通讯 标记 mark 待学~~ OK tea加密,mark mark 这个是tea加密的加强版xxtea,wiki如下:
http://en.wikipedia.org/wiki/XXTEA 楼主的,就是xxtea 回复【33楼】nilxy
-----------------------------------------------------------------------
s_looptime其实控制的是加密的轮数,
q = S_LOOPTIME + 52 / n ; 改为rounds = 6 + 52/n;意思更加明了 mark mark mark Mark mark 我在一个产品中用了这个算法,跟PC的通信进行了TEA加密,呵呵 mark mark
TEA加密解密算法 mark. 不错,在新的作品上试下用 单片机上实现TEA加密解密算法 牛x mark mark 顶 好东西 学习了 Mark 谢谢,mark mark!! 果断mark mark! mark! 战略mark mark 现在才知道这些知识,真是太晚了!
多谢楼主的辛苦整理以及各位的补充! mark
页:
[1]
2