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

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

加密过程:

c语言实现dES加密算法 c语言实现加密解密_c语言实现dES加密算法

 

算法实现:

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

1. 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. 4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
11. 4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
12. /* end cycle */
13. 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. 4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
22. 4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
23.         sum -= delta;
24. /* end cycle */
25. 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. }

执行结果:

c语言实现dES加密算法 c语言实现加密解密_原始数据_02

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

加密过程:

c语言实现dES加密算法 c语言实现加密解密_无符号整数_03

算法实现:

示例代码:

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. 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
10.         sum += delta;
11. 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
12.     }
13. 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. 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
21.         sum -= delta;
22. 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
23.     }
24. 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. }

c语言实现dES加密算法 c语言实现加密解密_数据_04

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

c语言实现dES加密算法 c语言实现加密解密_原始数据_05

算法实现:

示例代码:

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. 6 + 52/n;
12. 0;
13. -1];
14. do
15.         {
16.             sum += DELTA;
17. 2) & 3;
18. for (p=0; p<n-1; p++)
19.             {
20. 1];
21.                 z = v[p] += MX;
22.             }
23. 0];
24. -1] += MX;
25.         }
26. while (--rounds);
27.     }
28. else if (n < -1)      /* Decoding Part */
29.     {
30.         n = -n;
31. 6 + 52/n;
32.         sum = rounds*DELTA;
33. 0];
34. do
35.         {
36. 2) & 3;
37. for (p=n-1; p>0; p--)
38.             {
39. -1];
40.                 y = v[p] -= MX;
41.             }
42. -1];
43. 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. }

c语言实现dES加密算法 c语言实现加密解密_原始数据_06

加密前原始数据:1 2
加密后的数据:3238569099 2059193138
解密后的数据:1 2

Process returned 0 (0x0)   execution time : 0.369 s
Press any key to continue.

如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。