【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

时间:2023-03-08 17:32:10

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


在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室的大卫·惠勒与罗杰·尼达姆。这项技术最初于1994年提交给鲁汶的快速软件加密的研讨会上,并在该研讨会上演讲中首次发表。

在给出的代码中:加密使用的数据为2个32位无符号整数,密钥为4个32位无符号整数即密钥长度为128位

加密过程:

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

算法实现:

示例代码:
C语言代码(需支持C99)

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

执行结果:

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)http://write.blog.****.net/postedithttp://write.blog.****.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

加密过程:

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

算法实现:

示例代码:

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

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

加密前原始数据: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
加密过程:

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

算法实现:

示例代码:

  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. void btea(uint32_t *v, int n, uint32_t const key[4])
  5. {
  6. uint32_t y, z, sum;
  7. unsigned p, rounds, e;
  8. if (n > 1) /* Coding Part */
  9. {
  10. rounds = 6 + 52/n;
  11. sum = 0;
  12. z = v[n-1];
  13. do
  14. {
  15. sum += DELTA;
  16. e = (sum >> 2) & 3;
  17. for (p=0; p<n-1; p++)
  18. {
  19. y = v[p+1];
  20. z = v[p] += MX;
  21. }
  22. y = v[0];
  23. z = v[n-1] += MX;
  24. }
  25. while (--rounds);
  26. }
  27. else if (n < -1) /* Decoding Part */
  28. {
  29. n = -n;
  30. rounds = 6 + 52/n;
  31. sum = rounds*DELTA;
  32. y = v[0];
  33. do
  34. {
  35. e = (sum >> 2) & 3;
  36. for (p=n-1; p>0; p--)
  37. {
  38. z = v[p-1];
  39. y = v[p] -= MX;
  40. }
  41. z = v[n-1];
  42. y = v[0] -= MX;
  43. sum -= DELTA;
  44. }
  45. while (--rounds);
  46. }
  47. }
  48. int main()
  49. {
  50. uint32_t v[2]= {1,2};
  51. uint32_t const k[4]= {2,2,3,4};
  52. int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
  53. // v为要加密的数据是两个32位无符号整数
  54. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  55. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  56. btea(v, n, k);
  57. printf("加密后的数据:%u %u\n",v[0],v[1]);
  58. btea(v, -n, k);
  59. printf("解密后的数据:%u %u\n",v[0],v[1]);
  60. return 0;
  61. }

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

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