各位大侠在做数据传输时, 有没有考虑过把数据加密起来进行传输, 若在串口或者无线中把所要传的数据加密起来, 岂不是增加了通信的安全性. 常用的加密解密算法比如 DES,RSA 等, 受限于单片机的内存和运算速度, 实现起来比较困难, 但一种叫 TEA 的加密算法特别适合单片机使用.
TEA(Tiny Encryption Algorithm) 是一种简单高效的加密算法, 以加密解密速度快, 实现简单著称. 算法很简单, TEA 算法每一次可以操作 64-bit(8-byte), 采用 128-bit(16-byte) 作为 key, 算法采用迭代的形式, 推荐的迭代轮数是 64 轮, 最少 32 轮. 目前我只知道 QQ 一直用的是 16 轮 TEA.
我之前做过一个数字的无线对讲机, 把语音数据加密后发送, 双方事先规定好公共的密钥, 就可以进行加密和解密了. 至于 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 ;
- }
- }
- #ifndef __TEA_h__
- #define __TEA_h__
- //TEA 加密函数
- void btea_encrypt( unsigned char* buf, unsigned char* key );
- //TEA 解密函数
- void btea_decrpyt( unsigned char* buf, unsigned char* key );
- #endif
来源: http://www.bubuko.com/infodetail-2851345.html