【轉】TEA、XTEA、XXTEA加密解密算法(C語言實現)


ref : https://blog.csdn.net/gsls200808/article/details/48243019


 

在密碼學中,微型加密算法(Tiny Encryption Algorithm,TEA)是一種易於描述和執行的塊密碼,通常只需要很少的代碼就可實現。其設計者是劍橋大學計算機實驗室的大衛·惠勒與羅傑·尼達姆。這項技術最初於1994年提交給魯汶的快速軟件加密的研討會上,並在該研討會上演講中首次發表。

在給出的代碼中:加密使用的數據為2個32位無符號整數,密鑰為4個32位無符號整數即密鑰長度為128位

加密過程:

 

算法實現:

示例代碼:
C語言代碼(需支持C99)

  1. #include <stdio.h>
  2.  
  3. //加密函數
  4. void encrypt (uint32_t* v, uint32_t* k) {
  5. uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */
  6. uint32_t delta=0x9e3779b9; /* a key schedule constant */
  7. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  8. for (i=0; i < 32; i++) { /* basic cycle start */
  9. sum += delta;
  10. v0 += ((v1<< 4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  11. v1 += ((v0<< 4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  12. } /* end cycle */
  13. v[ 0]=v0; v[1]=v1;
  14. }
  15. //解密函數
  16. void decrypt (uint32_t* v, uint32_t* k) {
  17. uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */
  18. uint32_t delta=0x9e3779b9; /* a key schedule constant */
  19. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  20. for (i=0; i<32; i++) { /* basic cycle start */
  21. v1 -= ((v0<< 4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  22. v0 -= ((v1<< 4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  23. sum -= delta;
  24. } /* end cycle */
  25. v[ 0]=v0; v[1]=v1;
  26. }
  27.  
  28. int main()
  29. {
  30. uint32_t v[2]={1,2},k[4]={2,2,3,4};
  31. // v為要加密的數據是兩個32位無符號整數
  32. // k為加密解密密鑰,為4個32位無符號整數,即密鑰長度為128位
  33. printf("加密前原始數據:%u %u\n",v[0],v[1]);
  34. encrypt(v, k);
  35. printf("加密后的數據:%u %u\n",v[0],v[1]);
  36. decrypt(v, k);
  37. printf("解密后的數據:%u %u\n",v[0],v[1]);
  38. return 0;
  39. }

執行結果:

http://write.blog.csdn.net/postedithttp://write.blog.csdn.net/postedit

加密前原始數據:1 2 加密后的數據:1347371722 925494771 解密后的數據:1 2 Process returned 0 (0x0) execution time : 0.020 s Press any key to continue. 


XTEA是TEA的升級版,增加了更多的密鑰表,移位和異或操作等等,設計者是Roger Needham, David Wheeler

加密過程:

算法實現:

示例代碼:

  1. #include <stdio.h>
  2.  
  3. /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */
  4.  
  5. void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
  6. unsigned int i;
  7. uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
  8. for (i=0; i < num_rounds; i++) {
  9. v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
  10. sum += delta;
  11. v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
  12. }
  13. v[ 0]=v0; v[1]=v1;
  14. }
  15.  
  16. void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
  17. unsigned int i;
  18. uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
  19. for (i=0; i < num_rounds; i++) {
  20. v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
  21. sum -= delta;
  22. v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
  23. }
  24. v[ 0]=v0; v[1]=v1;
  25. }
  26.  
  27. int main()
  28. {
  29. uint32_t v[2]={1,2};
  30. uint32_t const k[4]={2,2,3,4};
  31. unsigned int r=32;//num_rounds建議取值為32
  32. // v為要加密的數據是兩個32位無符號整數
  33. // k為加密解密密鑰,為4個32位無符號整數,即密鑰長度為128位
  34. printf("加密前原始數據:%u %u\n",v[0],v[1]);
  35. encipher(r, v, k);
  36. printf("加密后的數據:%u %u\n",v[0],v[1]);
  37. decipher(r, v, k);
  38. printf("解密后的數據:%u %u\n",v[0],v[1]);
  39. return 0;
  40. }

加密前原始數據:1 2 加密后的數據:1345390024 2801624574 解密后的數據:1 2 Process returned 0 (0x0) execution time : 0.034 s Press any key to continue. 


XXTEA,又稱Corrected Block TEA,是XTEA的升級版,設計者是Roger Needham, David Wheeler
加密過程:

算法實現:

示例代碼:

  1. #include <stdio.h>
  2. #define DELTA 0x9e3779b9
  3. #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
  4.  
  5. void btea(uint32_t *v, int n, uint32_t const key[4])
  6. {
  7. uint32_t y, z, sum;
  8. unsigned p, rounds, e;
  9. if (n > 1) /* Coding Part */
  10. {
  11. rounds = 6 + 52/n;
  12. sum = 0;
  13. z = v[n -1];
  14. do
  15. {
  16. sum += DELTA;
  17. e = (sum >> 2) & 3;
  18. for (p=0; p<n-1; p++)
  19. {
  20. y = v[p+ 1];
  21. z = v[p] += MX;
  22. }
  23. y = v[ 0];
  24. z = v[n -1] += MX;
  25. }
  26. while (--rounds);
  27. }
  28. else if (n < -1) /* Decoding Part */
  29. {
  30. n = -n;
  31. rounds = 6 + 52/n;
  32. sum = rounds*DELTA;
  33. y = v[ 0];
  34. do
  35. {
  36. e = (sum >> 2) & 3;
  37. for (p=n-1; p>0; p--)
  38. {
  39. z = v[p -1];
  40. y = v[p] -= MX;
  41. }
  42. z = v[n -1];
  43. y = v[ 0] -= MX;
  44. sum -= DELTA;
  45. }
  46. while (--rounds);
  47. }
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53. uint32_t v[2]= {1,2};
  54. uint32_t const k[4]= {2,2,3,4};
  55. int n= 2; //n的絕對值表示v的長度,取正表示加密,取負表示解密
  56. // v為要加密的數據是兩個32位無符號整數
  57. // k為加密解密密鑰,為4個32位無符號整數,即密鑰長度為128位
  58. printf("加密前原始數據:%u %u\n",v[0],v[1]);
  59. btea(v, n, k);
  60. printf("加密后的數據:%u %u\n",v[0],v[1]);
  61. btea(v, -n, k);
  62. printf("解密后的數據:%u %u\n",v[0],v[1]);
  63. return 0;
  64. }


加密前原始數據:1 2 加密后的數據:3238569099 2059193138 解密后的數據:1 2 Process returned 0 (0x0) execution time : 0.369 s Press any key to continue. 


免責聲明!

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



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