极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1399|回复: 0

LGT8F328 在 Arduino 下使TEA加密解密

[复制链接]
发表于 2020-4-15 15:45:39 | 显示全部楼层 |阅读模式
在網上看到一篇很好的 TEA 加密文章,把它移植到Arduino上跟大家分享。
  1. /*******************
  2.   TEA加密解密演算法
  3.   Refeerence: http://www.51hei.com/bbs/dpj-137887-1.html
  4. *******************/
  5. #define DATA_LEN 32

  6. #define MX (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z)
  7. #define DELTA 0x9e3779b9
  8. #define S_LOOPTIME   1           //5
  9. #define BLOCK_SIZE   DATA_LEN    //PAGE_SIZE,根據你所要加密的資料包長度修改此參數(單位:位元組)

  10. unsigned char TEA_key[16] =
  11. {
  12.   0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  13.   0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
  14. };

  15. //數據緩衝區
  16. unsigned char TX_buffer[DATA_LEN];
  17. unsigned char RX_buffer[DATA_LEN];


  18. /*加密時使用函數, buf裡面的內容就是加密後的資料,key是加密金鑰*/
  19. void btea_encrypt( unsigned char* buf, unsigned char* key )
  20. {
  21.   unsigned char  n = BLOCK_SIZE / 4;
  22.   unsigned long *v = (unsigned long *)buf;
  23.   unsigned long *k = (unsigned long *)key;
  24.   unsigned long z = v[n - 1], y = v[0], sum = 0, e ;
  25.   unsigned char p, q ;
  26.   // Coding Part

  27.   q = S_LOOPTIME + 52 / n ;
  28.   while ( q-- > 0 )
  29.   {
  30.     sum += DELTA ;
  31.     e = sum >> 2 & 3 ;
  32.     for ( p = 0 ; p < n - 1 ; p++ )
  33.     {
  34.       y = v[p + 1];
  35.       z = v[p] += MX;
  36.     }
  37.     y = v[0] ;
  38.     z = v[n - 1] += MX;
  39.   }
  40. }

  41. /*解密時使用函數, buf裡面的內容就是解密後的資料,key是解密金鑰*/
  42. void btea_decrpyt( unsigned char* buf, unsigned char* key )
  43. {
  44.   unsigned char n = BLOCK_SIZE / 4;
  45.   unsigned long *v = (unsigned long *)buf;
  46.   unsigned long *k = (unsigned long *)key;
  47.   unsigned long z = v[n - 1], y = v[0], sum = 0, e ;
  48.   unsigned char  p, q ;

  49.   //Decoding Part...
  50.   q = S_LOOPTIME + 52 / n ;
  51.   sum = q * DELTA ;
  52.   while ( sum != 0 )
  53.   {
  54.     e = sum >> 2 & 3 ;
  55.     for ( p = n - 1 ; p > 0 ; p-- )
  56.     {
  57.       z = v[p - 1];
  58.       y = v[p] -= MX;
  59.     }
  60.     z = v[n - 1] ;
  61.     y = v[0] -= MX;
  62.     sum -= DELTA ;
  63.   }
  64. }
  65. /************************************************************************************************************/
  66. void CreateBUF(unsigned char *buf)
  67. {
  68.   int i = 0;

  69.   for (i = 0; i < DATA_LEN; i++)
  70.   {
  71.     buf[i] = rand() % 255;
  72.   }
  73. }

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

  77.   for (i = 0; i < DATA_LEN; i++)
  78.   {
  79.     buf2[i] = buf1[i];
  80.   }
  81. }

  82. void DIS(unsigned char sts, unsigned char*buf)
  83. {
  84.   int i = 0;

  85.   Serial.print("\n");
  86.   switch (sts)
  87.   {
  88.     case 0:        Serial.print("實際發送陣列:");        break;
  89.     case 1:        Serial.print("加密資料陣列:");        break;
  90.     case 2:        Serial.print("實際接收陣列:");        break;
  91.     default:        break;
  92.   }
  93.   for (i = 0; i < DATA_LEN; i++)
  94.   {
  95.     Serial.print(buf[i]);
  96.   }
  97.   Serial.print("\n");
  98. }



  99. void setup() {
  100.   // put your setup code here, to run once:
  101.   Serial.begin(57600);

  102. }

  103. void loop() {
  104.   // put your main code here, to run repeatedly:
  105.   //srand((time(NULL)));
  106.   CreateBUF(TX_buffer);                    //生成一組亂數
  107.   DIS(0, TX_buffer);                       //顯示實際資料

  108.   btea_encrypt(TX_buffer, TEA_key);        //發送陣列加密
  109.   DIS(1, TX_buffer);                       //顯示加密後的資料

  110.   Trans(TX_buffer, RX_buffer);             //類比通道
  111.   btea_decrpyt(RX_buffer, TEA_key);        //接收陣列解密
  112.   DIS(2, RX_buffer);                       //顯示接收資料
  113.   //  return 0;

  114. while(1){};
  115. }
复制代码



輸出的結果
TEA_EncryptionAndDiscryption_Result.JPG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-10-2 04:19 , Processed in 0.047853 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表