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 }

 

你可能感兴趣的:(对称加密)