适用于单片机的数据加密算法:xxtea
轉(zhuǎn):https://www.cnblogs.com/LittleTiger/p/4384741.html
各位大俠在做數(shù)據(jù)傳輸時,有沒有考慮過把數(shù)據(jù)加密起來進行傳輸,若在串口或者無線中把所要傳的數(shù)據(jù)加密起來,豈不是增加了通信的安全性。常用的加密解密算法比如DES、RSA等,受限于單片機的內(nèi)存和運算速度,實現(xiàn)起來比較困難,但一種叫TEA的加密算法特別適合單片機使用。
TEA(Tiny Encryption Algorithm)是一種簡單高效的加密算法,以加密解密速度快,實現(xiàn)簡單著稱。算法很簡單,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作為key,算法采用迭代的形式,推薦的迭代輪數(shù)是64輪,最少32輪。目前我只知道QQ一直用的是16輪TEA。
我之前做過一個數(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ù)組里面的
加密時使用函數(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解密
就能得到之前的明文。
?
/*XXTEA,又稱Corrected Block TEA,是XTEA的升級版,設(shè)計者是Roger Needham, David Wheeler */ #include <stdio.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))void btea(uint32_t *v, int n, uint32_t const key[4]) {uint32_t y, z, sum;unsigned p, rounds, e;if (n > 1) /* Coding Part */{rounds = 6 + 52/n;sum = 0;z = v[n-1];do{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;}while (--rounds);}else if (n < -1) /* Decoding Part */{n = -n;rounds = 6 + 52/n;sum = rounds*DELTA;y = v[0];do{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;}while (--rounds);} }int main() {uint32_t v[2]= {1,2};uint32_t const k[4]= {2,2,3,4};int n= 2; //n的絕對值表示v的長度,取正表示加密,取負(fù)表示解密// v為要加密的數(shù)據(jù)是兩個32位無符號整數(shù)// k為加密解密密鑰,為4個32位無符號整數(shù),即密鑰長度為128位printf("加密前原始數(shù)據(jù):%u %u\n",v[0],v[1]);btea(v, n, k);printf("加密后的數(shù)據(jù):%u %u\n",v[0],v[1]);btea(v, -n, k);printf("解密后的數(shù)據(jù):%u %u\n",v[0],v[1]);return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/schips/p/10762245.html
總結(jié)
以上是生活随笔為你收集整理的适用于单片机的数据加密算法:xxtea的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]linux下TCP连接占用的资源
- 下一篇: 在乌班图中将py3设置为默认解释器