TEA,XXTEA介紹,對稱加密


總結:在使用加密的時候,我們可以加入隨機數,這樣相同的明文,每次加密后得到不同的密文,同時可以在密文中加入密文有效期,控制密文的有效時間長度。

針對有的功能擴展使用,很好的思想。

TEA對 64 位數據加密密鑰長達 128 位,安全性相當好。其可靠性是通過加密輪數而不是算法的復雜度來保證的。從中可以看到TEA 算法主要運用了移位和異或運算。密鑰在加密過程中始終不變。

TEA(Tiny Encryption Algorithm)是一種小型的對稱加密解密算法,支持128位密碼,與BlowFish一樣TEA每次只能加密/解密8字節數據。TEA特點是速度快、效率高,實現也非常簡單。由於針對TEA的攻擊不斷出現,所以TEA也發展出幾個版本,分別是XTEA、Block TEA和XXTEA。

TEA使用64位一組加密,128長度的秘鑰,加密的到結果。相對XXTEA其加密可靠性低。

void encrypt(unsigned long *v, unsigned long *k) {
 2     unsigned long y=v[0], z=v[1], sum=0, i;         /* set up */
 3     unsigned long delta=0x9e3779b9;                 /* a key schedule constant */
 4     unsigned long a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
 5     for (i=0; i < 32; i++) {                        /* basic cycle start */
 6         sum += delta;
 7         y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
 8         z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
 9     }
10     v[0]=y;
11     v[1]=z;
12 }
13 
14 void decrypt(unsigned long *v, unsigned long *k) {
15     unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
16     unsigned long delta=0x9e3779b9;                  /* a key schedule constant */
17     unsigned long a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
18     for(i=0; i<32; i++) {                            /* basic cycle start */
19         z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
20         y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
21         sum -= delta;                                /* end cycle */
22     }
23     v[0]=y;
24     v[1]=z;
25 }

XXTEA加密字符串長度不是 4 的整數倍,則這些實現的在加密后無法真正還原,還原以后的字符串實際上與原字符串不相等,而是后面多了一些 \0 的字符,或者少了一些 \0 的字符。原因在於 XXTEA 算法只定義了如何對 32 位的信息塊數組(實際上是 32 位無符號整數數組)進行加密,而並沒有定義如何來將字符串編碼為這種數組。而現有的實現中在將字符串編碼為整數數組時,都丟失了字符串長度信息,因此還原出現了問題。

 

  #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);
 
  long btea(long* v, long n, long* k) {
    unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
    long p, q ;
    if (n > 1) {         
      q = 6 + 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;
      }
      return 0 ;
    } else if (n < -1) { 
      n = -n;
      q = 6 + 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;
      }
      return 0;
    }
    return 1;
  }

 

 long btea(long* v, long n, long* k)

v是要加密的組元的起始地址,以32bit為單位,這里用long來實現。

n是要加密的組元個數,正數是加密,負數是解密。

k是密鑰的起始地址,長度為4個組元,4*32=128bit。

返回值為0或1(對應n=0,沒有計算)。

加密的結果會直接寫回到v中。

 

經過試驗,我還有一點要補充的,XXTEA的計算是空間相關的,也就是說,在一個組元中,4個字節是不能斷章取義的,即密文的一部分,並不能還原成明文的一部分。所以,當數據不能被4個字節整除時,要做好字節的填充和對其等輔助工作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM