eddiewwm 发表于 2020-4-15 15:45:39

LGT8F328 在 Arduino 下使TEA加密解密

在網上看到一篇很好的 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^z)
#define DELTA 0x9e3779b9
#define S_LOOPTIME   1         //5
#define BLOCK_SIZE   DATA_LEN    //PAGE_SIZE,根據你所要加密的資料包長度修改此參數(單位:位元組)

unsigned char TEA_key =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
};

//數據緩衝區
unsigned char TX_buffer;
unsigned char RX_buffer;


/*加密時使用函數, buf裡面的內容就是加密後的資料,key是加密金鑰*/
void btea_encrypt( unsigned char* buf, unsigned char* key )
{
unsigned charn = BLOCK_SIZE / 4;
unsigned long *v = (unsigned long *)buf;
unsigned long *k = (unsigned long *)key;
unsigned long z = v, y = v, 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;
      z = v += MX;
    }
    y = v ;
    z = v += 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, y = v, sum = 0, e ;
unsigned charp, 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;
      y = v -= MX;
    }
    z = v ;
    y = v -= MX;
    sum -= DELTA ;
}
}
/************************************************************************************************************/
void CreateBUF(unsigned char *buf)
{
int i = 0;

for (i = 0; i < DATA_LEN; i++)
{
    buf = rand() % 255;
}
}

void Trans(unsigned char *buf1, unsigned char *buf2)
{
int i = 0;

for (i = 0; i < DATA_LEN; i++)
{
    buf2 = buf1;
}
}

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);
}
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){};
}



輸出的結果
页: [1]
查看完整版本: LGT8F328 在 Arduino 下使TEA加密解密