TEA对称加密算法

  今天在看《Distributed Systems Concepts and Design》这本书的时候,在讲到分布式系统的安全性的时候,给出了TEA算法,书本上有现成的代码,所以摘录下来以备后用。下面摘自百度百科的简短介绍:

  TEA算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明[3]。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。

  加密算法代码如下:

 1 void encrypt(unsigned long k[], unsigned long text[])
 2 {
 3     unsigned long y = text[0];
 4     unsigned long z = text[1];
 5     unsigned long delta = 0X9E3779B9;
 6     unsigned long sum = 0;
 7     int n;
 8     
 9     for(n = 0; n < 32; n++)
10     {
11         sum += delta;
12         y += ((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1]);
13         z += ((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3]);
14     }
15     
16     text[0] = y;
17     text[1] = z;
18 }

  解密算法代码如下:

 1 void decrypt(unsigned long k[], unsigned long text[])
 2 {
 3     unsigned long y = text[0];
 4     unsigned long z = text[1];
 5     unsigned long delta = 0X9E3779B9;
 6     unsigned long sum = delta << 5; 
 7     
 8     int n;
 9     for (n= 0; n < 32; n++) 
10     {
11         z -=((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3]);
12         y -=((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1]);
13         sum -=delta;
14     }
15     text[0] = y; 
16     text[1] = z;     
17 }

  测试用例代码如下:

 1 #include    <iostream>
 2 int main()
 3 {
 4     char key[16] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6, 0xA7, 0xB8, 0xC9, 0xD1, 0xE2, 0xF3, 0xA4, 0xB5, 0xC6, 0xD7};
 5     char text[8] = {'A','B',' ','C','D', 0, 0, 0};
 6     
 7     std::cout << "origin:" << text << std::endl;
 8     encrypt((unsigned long*)key, (unsigned long*)text);
 9     std::cout << "Encrypt:[" << std::endl;
10     std::cout << text << std::endl;
11     std::cout << "]" << std::endl;
12     decrypt((unsigned long*)key, (unsigned long*)text);
13     std::cout << "Decrypt:" << text << std::endl;
14     return 0;
15 }

  测试时,将以上三段代码复制到TEA.c文件中,然后编译执行。我运行的过程和结果如下:

[kiven@localhost encode]$ g++ -o TEA TEA.c
[kiven@localhost encode]$ ./TEA
origin:AB CD
Encrypt:[
ô·Kñ
y0:k¡²ÃÔåö§¸ÉÑâó¤µÆ×
]
Decrypt:AB CD
[kiven@localhost encode]$

  我从书中看到说,该算法运行效率很高,而且比较难破解,所以用在自己的网络项目中应该很合适。实现简单,效率高。但具体效率如何,还需要进一步测试。书中提供了一个对文件加密解密的函数,提供如下:

 1 void tea(char mode, FILE *infile, FILE *outfile, unsigned long k[]) 
 2 {
 3     /* mode is 'e' for encrypt, 'd' for decrypt, k[] is the key.*/
 4     char ch, Text[8]; int i;
 5     while(!feof(infile)) 
 6     {
 7         i = fread(Text, 1, 8, infile); /* read 8 bytes from infile into Text */
 8         if (i <= 0) break;
 9         while (i < 8) { Text[i++] = ' ';} /*pad last block with spaces */
10         switch (mode) 
11         {
12             case 'e':
13             encrypt(k, (unsigned long*) Text); break;
14             case 'd':
15             decrypt(k, (unsigned long*) Text); break;
16         }
17         fwrite(Text, 1, 8, outfile); /* write 8 bytes from Text to outfile */
18     }
19 }

 

posted @ 2013-11-30 17:21  kiven.li  阅读(1000)  评论(1编辑  收藏  举报