|
在網上看到一篇很好的 TEA 加密文章,把它移植到Arduino上跟大家分享。 - /*******************
- TEA加密解密演算法
- Refeerence: http://www.51hei.com/bbs/dpj-137887-1.html
- *******************/
- #define DATA_LEN 32
- #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 DATA_LEN //PAGE_SIZE,根據你所要加密的資料包長度修改此參數(單位:位元組)
- 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[DATA_LEN];
- unsigned char RX_buffer[DATA_LEN];
- /*加密時使用函數, buf裡面的內容就是加密後的資料,key是加密金鑰*/
- 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;
- }
- }
- /*解密時使用函數, buf裡面的內容就是解密後的資料,key是解密金鑰*/
- 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 ;
- }
- }
- /************************************************************************************************************/
- void CreateBUF(unsigned char *buf)
- {
- int i = 0;
- for (i = 0; i < DATA_LEN; i++)
- {
- buf[i] = rand() % 255;
- }
- }
- void Trans(unsigned char *buf1, unsigned char *buf2)
- {
- int i = 0;
- for (i = 0; i < DATA_LEN; i++)
- {
- buf2[i] = buf1[i];
- }
- }
- void DIS(unsigned char sts, unsigned char*buf)
- {
- int i = 0;
- Serial.print("\n");
- switch (sts)
- {
- case 0: Serial.print("實際發送陣列:"); break;
- case 1: Serial.print("加密資料陣列:"); break;
- case 2: Serial.print("實際接收陣列:"); break;
- default: break;
- }
- for (i = 0; i < DATA_LEN; i++)
- {
- Serial.print(buf[i]);
- }
- Serial.print("\n");
- }
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(57600);
- }
- void loop() {
- // put your main code here, to run repeatedly:
- //srand((time(NULL)));
- CreateBUF(TX_buffer); //生成一組亂數
- DIS(0, TX_buffer); //顯示實際資料
- btea_encrypt(TX_buffer, TEA_key); //發送陣列加密
- DIS(1, TX_buffer); //顯示加密後的資料
- Trans(TX_buffer, RX_buffer); //類比通道
- btea_decrpyt(RX_buffer, TEA_key); //接收陣列解密
- DIS(2, RX_buffer); //顯示接收資料
- // return 0;
- while(1){};
- }
复制代码
輸出的結果
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|