1. 程式人生 > >資料的加密傳輸——微控制器上實現TEA加密解密演算法

資料的加密傳輸——微控制器上實現TEA加密解密演算法

http://www.eeworld.com.cn/mcu/article_2016121632367.html

各位大俠在做資料傳輸時,有沒有考慮過把資料加密起來進行傳輸,若在串列埠或者無線中把所要傳的資料加密起來,豈不是增加了通訊的安全性。常用的加密解密演算法比如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