【樓主位】 nilxy 積分:36 派別: 等級:------ 來自:南國
|
各位大俠在做數(shù)據(jù)傳輸時,,有沒有考慮過把數(shù)據(jù)加密起來進行傳輸,若在串口或者無線中把所要傳的數(shù)據(jù)加密起來,,豈不是增加了通信的安全性,。常用的加密解密算法比如DES、RSA等,,受限于單片機的內(nèi)存和運算速度,,實現(xiàn)起來比較困難,但一種叫TEA的加密算法特別適合單片機使用,,我搜了一下,,發(fā)現(xiàn)壇子里沒有相關(guān)資料,嘿嘿,,鉆了個空,,補充之~~
TEA(Tiny Encryption Algorithm)是一種簡單高效的加密算法,以加密解密速度快,,實現(xiàn)簡單著稱,。算法很簡單,TEA算法每一次可以操作64-bit(8-byte),,采用128-bit(16-byte)作為key,,算法采用迭代的形式,推薦的迭代輪數(shù)是64輪,,最少32輪,。目前我只知道QQ一直用的是16輪TEA。--摘自CSDN博客
我之前做過一個數(shù)字的無線對講機,,把語音數(shù)據(jù)加密后發(fā)送,,雙方事先規(guī)定好公共的密鑰,就可以進行加密和解密了,。至于TEA算法速度,,在我看來確實很快,我當(dāng)時用的是16位的msp430單片機,,晶振只有6M,,每秒鐘大概可以進行兩三百次加密和解密的操作(一次加密和解密32字節(jié))。 說到加密,,最簡單的方式就是把要發(fā)送的數(shù)據(jù)和同樣長度的密碼進行異或運算,,得到新的數(shù)據(jù)就是加密后的數(shù)據(jù),然后,,接收方把加密數(shù)據(jù)和密碼進行異或就能得到原始數(shù)據(jù),。但這種異或的方法安全性如何,,我也說不清楚。
下面上傳了c++實現(xiàn)的TEA算法,,可以在vc里面調(diào)試看看,。我把它改了改,讓它適合單片機使用,,下面的TEA.h和TEA.c可以包含在你的工程里面,。 使用時,根據(jù)你所要加密的數(shù)據(jù)包長度修改宏定義BLOCK_SIZE,,密鑰的長度是16字節(jié),。數(shù)據(jù)和密鑰都是存放在數(shù)組里面的,比如:
//TEA密鑰 unsigned char TEA_key[16]= { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10 };
//數(shù)據(jù)緩沖區(qū) unsigned char TX_buffer[32]; unsigned char RX_buffer[32];
加密時使用函數(shù): btea_encrypt(TX_buffer,TEA_key); //TEA加密 這樣,,數(shù)組TX_buffer里面的新內(nèi)容就是加密后的數(shù)據(jù),。
接收到的密文數(shù)據(jù)存放在RX_buffer里面,調(diào)用下面函數(shù): 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 控制的是加密的輪數(shù),,q = S_LOOPTIME + 52 / n ; // 改為 round s = 6 + 52/n; 意思更加明了 #define BLOCK_SIZE 32 //PAGE_SIZE,根據(jù)你所要加密的數(shù)據(jù)包長度修改此參數(shù)(單位:字節(jié))
/* *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 ; } }
|