日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

适用于单片机的数据加密算法:xxtea

發(fā)布時(shí)間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适用于单片机的数据加密算法:xxtea 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn):https://www.cnblogs.com/LittleTiger/p/4384741.html


  各位大俠在做數(shù)據(jù)傳輸時(shí),有沒有考慮過把數(shù)據(jù)加密起來進(jìn)行傳輸,若在串口或者無線中把所要傳的數(shù)據(jù)加密起來,豈不是增加了通信的安全性。常用的加密解密算法比如DES、RSA等,受限于單片機(jī)的內(nèi)存和運(yùn)算速度,實(shí)現(xiàn)起來比較困難,但一種叫TEA的加密算法特別適合單片機(jī)使用。
  TEA(Tiny Encryption Algorithm)是一種簡(jiǎn)單高效的加密算法,以加密解密速度快,實(shí)現(xiàn)簡(jiǎn)單著稱。算法很簡(jiǎn)單,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作為key,算法采用迭代的形式,推薦的迭代輪數(shù)是64輪,最少32輪。目前我只知道QQ一直用的是16輪TEA。
  我之前做過一個(gè)數(shù)字的無線對(duì)講機(jī),把語音數(shù)據(jù)加密后發(fā)送,雙方事先規(guī)定好公共的密鑰,就可以進(jìn)行加密和解密了。至于TEA算法速度,在我看來確實(shí)很快,我當(dāng)時(shí)用的是16位的msp430單片機(jī),晶振只有6M,每秒鐘大概可以進(jìn)行兩三百次加密和解密的操作(一次加密和解密32字節(jié))。
  說到加密,最簡(jiǎn)單的方式就是把要發(fā)送的數(shù)據(jù)和同樣長(zhǎng)度的密碼進(jìn)行異或運(yùn)算,得到新的數(shù)據(jù)就是加密后的數(shù)據(jù),然后,接收方把加密數(shù)據(jù)和密碼進(jìn)行異或就能得到原始數(shù)據(jù)。但這種異或的方法安全性如何,我也說不清楚。
  下面上傳了c++實(shí)現(xiàn)的TEA算法,可以在vc里面調(diào)試看看。我把它改了改,讓它適合單片機(jī)使用,下面的TEA.h和TEA.c可以包含在你的工程里面。使用時(shí),根據(jù)你所要加密的數(shù)據(jù)包長(zhǎng)度修改宏定義BLOCK_SIZE密鑰的長(zhǎng)度是16字節(jié)。數(shù)據(jù)和密鑰都是存放在數(shù)組里面的

加密時(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的升級(jí)版,設(shè)計(jì)者是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的絕對(duì)值表示v的長(zhǎng)度,取正表示加密,取負(fù)表示解密// v為要加密的數(shù)據(jù)是兩個(gè)32位無符號(hào)整數(shù)// k為加密解密密鑰,為4個(gè)32位無符號(hào)整數(shù),即密鑰長(zhǎng)度為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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。