博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TEA对称加密算法
阅读量:4496 次
发布时间:2019-06-08

本文共 2855 字,大约阅读时间需要 9 分钟。

  今天在看这本书的时候,在讲到分布式系统的安全性的时候,给出了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    
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]$ ./TEAorigin:AB CDEncrypt:[ô·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 }

 

转载于:https://www.cnblogs.com/kiven-code/p/3451267.html

你可能感兴趣的文章
JFrame面板
查看>>
Android自动化压力测试之Monkey Test 异常解读(五)
查看>>
Compressing Convolutional Neural Networks in the Frequency Domain 论文笔记
查看>>
设计模式:单例和多例
查看>>
Myslq 之修改数据库
查看>>
maven工程转为web工程时没有add web project capabilities选项的解决办法
查看>>
[BZOJ1192][HNOI2006]鬼谷子的钱袋
查看>>
正则表达式之 数据验证 与 文本替换
查看>>
CLR via C#:CLR的执行模型
查看>>
JS获取服务器时间
查看>>
如何对数据排序和拆分文件
查看>>
数据解析01-15
查看>>
linux 安装mysql数据库——yum安装法
查看>>
Several ports (8005, 80, 8009) required by Tomcat v6.0 Server at localhost are already in use
查看>>
事件监听器
查看>>
设计模式之单例设计模式
查看>>
异常的基本概念
查看>>
vue 在发送axios请求时数据渲染问题
查看>>
动态链接库dll
查看>>
2018 Multi-University Training Contest 3 - HDU Contest
查看>>