找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7572|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

TEA加密解密C語言源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:410427 發(fā)表于 2018-10-16 17:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
加密函數(shù):
btea_encrypt(T_buffer, TEA_key );
TX_buffer是需要發(fā)送的數(shù)據(jù),經(jīng)過該函數(shù)后,TX_buffer便是加密后的數(shù)據(jù)。

解密函數(shù):
btea_decrpyt(RX_buffer, TEA_key);
RX_buffer是接收到的加密數(shù)據(jù),經(jīng)過該函數(shù),RX_buffer便是解密后的數(shù)據(jù)(即實際傳輸數(shù)據(jù))

BLOCK_SIZE 要和數(shù)據(jù)長度相等

單片機源程序如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. /*******************
  5.   TEA加密解密算法
  6. *******************/
  7. #define DATA_LEN 32

  8. #define MX (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z)
  9. #define DELTA 0x9e3779b9
  10. #define S_LOOPTIME   1                                //5
  11. #define BLOCK_SIZE   DATA_LEN                //PAGE_SIZE,根據(jù)你所要加密的數(shù)據(jù)包長度修改此參數(shù)(單位:字節(jié))

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

  17. //數(shù)據(jù)緩沖區(qū)
  18. unsigned char TX_buffer[DATA_LEN];
  19. unsigned char RX_buffer[DATA_LEN];


  20. /*加密時使用函數(shù), buf里面的內(nèi)容就是加密后的數(shù)據(jù),key是加密密鑰*/
  21. void btea_encrypt( unsigned char* buf, unsigned char* key )
  22. {
  23.   unsigned char  n=BLOCK_SIZE/4;
  24.   unsigned long *v=(unsigned long *)buf;
  25.   unsigned long *k=(unsigned long *)key;
  26.   unsigned long z = v[n - 1],y = v[0],sum = 0,e ;
  27.   unsigned char p,q ;
  28.   // Coding Part

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

  41. /*解密時使用函數(shù), buf里面的內(nèi)容就是解密后的數(shù)據(jù),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.       z = v[p - 1],
  57.       y = v[p] -= MX;
  58.       z = v[n - 1] ;
  59.     y = v[0] -= MX;
  60.             sum -= DELTA ;
  61.   }
  62. }
  63. /************************************************************************************************************/
  64. void CreateBUF(unsigned char *buf)
  65. {
  66.         int i = 0;

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

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

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

  80. void DIS(unsigned char sts, unsigned char*buf)
  81. {
  82.         int i = 0;
  83.        
  84.         printf("\n");
  85.         switch (sts)
  86.         {
  87.                 case 0:        printf("實際發(fā)送數(shù)組:");        break;
  88.                 case 1:        printf("加密數(shù)據(jù)數(shù)組:");        break;
  89.                 case 2:        printf("實際接收數(shù)組:");        break;
  90.                 default:        break;
  91.         }
  92.         for (i = 0;i < DATA_LEN; i++)
  93.         {
  94.                 printf("%d ", buf[i]);
  95.         }
  96.         printf("\n");
  97. }

  98. int main(void)
  99. {
  100.         srand((time(NULL)));
  101.         CreateBUF(TX_buffer);                                //生成一組隨機數(shù)
  102.         DIS(0,TX_buffer);                                        //顯示實際數(shù)據(jù)

  103.         btea_encrypt(TX_buffer, TEA_key);        //發(fā)送數(shù)組加密
  104.         DIS(1,TX_buffer);                                        //顯示加密后的數(shù)據(jù)

  105.         Trans(TX_buffer, RX_buffer);                //模擬信道
  106.         btea_decrpyt(RX_buffer, TEA_key);        //接收數(shù)組解密
  107.         DIS(2, RX_buffer);                                        //顯示接收數(shù)據(jù)
  108.         return 0;
  109. }       
復(fù)制代碼

所有資料51hei提供下載:
TEA加密解密.zip (209.98 KB, 下載次數(shù): 73)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:576869 發(fā)表于 2019-7-3 10:57 | 只看該作者
能不能下載啊
回復(fù)

使用道具 舉報

板凳
ID:367273 發(fā)表于 2021-8-21 16:28 | 只看該作者
大哥,你這個加密算法,看著和標(biāo)準的TEA加密算法不大一樣啊,你這個是不是可以實現(xiàn)任意字節(jié)數(shù)量加密啊
回復(fù)

使用道具 舉報

地板
ID:614295 發(fā)表于 2022-8-13 15:40 來自觸屏版 | 只看該作者
在其他網(wǎng)站看到一個只能加密7byte以上的簡化版tea加密,本貼這個不知道能否任意個數(shù)據(jù)加密。
回復(fù)

使用道具 舉報

5#
ID:1044553 發(fā)表于 2022-9-12 16:23 | 只看該作者
前來學(xué)習(xí)。不太懂怎么使用的
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表