/*--------------------------------------------------------------------------------------------------------- 在数据的加解密领域,算法分为对称密钥与非对称密钥两种。对称密钥与非对称密钥由于各自的特点,所应用的领域是不尽相 同的。对称密钥加密算法由于其速度快,一般用于整体数据的加密,而非对称密钥加密算法的安全性能佳,在数字签名领域得到广 泛的应用。 TEA算法是由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明,TEA是Tiny Encryption Algorithm的缩写, 以加密解密速度快,实现简单著称。TEA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式, 推荐的迭代轮数是64轮,最少32轮。为解决TEA算法密钥表攻击的问题,TEA算法先后经历了几次改进,从XTEA到BLOCK TEA,直至 最新的XXTEA。XTEA也称做TEAN,它使用与TEA相同的简单运算,但四个子密钥采取不正规的方式进行混合以阻止密钥表攻击。 Block TEA算法可以对32位的任意整数倍长度的变量块进行加解密的操作,该算法将XTEA轮循函数依次应用于块中的每个字,并且 将它附加于被应用字的邻字。XXTEA使用跟Block TEA相似的结构,但在处理块中每个字时利用了相邻字,且用拥有两个输入量的 MX函数代替了XTEA轮循函数。本文所描述的安全机制采用的加密算法就是TEA算法中安全性能最佳的改进版本-XXTEA算法。 XXTEA算法的结构非常简单,只需要执行加法、异或和寄存的硬件即可,且软件实现的代码非常短小,具有可移植性,非常适合 嵌入式系统应用。由于XXTEA算法的以上优点,可以很好地应用于嵌入式RFID系统当中。 ---------------------------------------------------------------------------------------------------------*/ #include #include //#define MX ((z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z)) #define MX (((z>>5)^(y<<2)) + ((y>>3)^(z<<4)^(sum^y)) + (k[(p&3)^e]^z)) //注意:delta的取值是随机的,但是为了避免不良的取值,采取的是 //黄金分割数(根号5-2)/2与2的32次方的乘积。为0x9e3779b9。 //在解密中,sum=delta×round,如:delta×32=13C6EF3720 //v表示为运算的长整型数据的首地址 //k为长整型的密钥的首地址 //n表示以32bit为基本单位的要运算的组元个数,正表示加密,负表示解密 unsigned char xxtea(unsigned int *v, unsigned int n, unsigned int *k, unsigned int en); unsigned char xxtea(unsigned int *v, unsigned int n, unsigned int *k, unsigned int en) { unsigned int z = v[n - 1], y = v[0], sum = 0, e, DELTA = 0x9e3779b9; unsigned int p, q; if(en) { /* 加密过程 */ q = 6 + 52 / n; while(q-- > 0) { sum += DELTA; e = (sum >> 2) & 3; for (p = 0; p < n - 1; p++) y = v[p + 1], z = v[p] += MX; y = v[0]; z = v[n - 1] += MX; } return 0; } else // if(n < -1) { /* 解密过程 */ /*n = -n;*/ q = 6 + 52 / n; sum = q * DELTA; while(sum != 0) { e = (sum >> 2) & 3; for (p = n - 1; p > 0; p--) z = v[p - 1], y = v[p] -= MX; z = v[n - 1]; y = v[0] -= MX; sum -= DELTA; } return 0; } // return 1; } //void xxtea_test(void) //{ // int buff[4]; // int test[4]={0x11223344,0x55667788,0x99AABBCC,0xDDEEFF00}; // int keys[4]={0x12345678,0x9ABCDEF0,0x12345678,0x9ABCDEF0}; // // printf("\n\rxxtea test begin: \n\r"); // memcpy(buff,test,16); printf("0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // xxtea( buff, 4,keys); printf("0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // xxtea( buff,-4,keys); printf("0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // printf("\n\rxxtea test finish: \n\r"); // // unsigned char cmd1[16]={0x55,0xAA,0x01,0x00,0x96,0x00,0x96,0x00,0x00,0x00,0x5D,0x0C,0x00,0x50,0x33,0xCC}; // unsigned char cmd2[16]={0x55,0xAA,0x00,0x01,0x96,0x00,0x96,0x00,0x00,0x00,0x5D,0x0C,0x00,0x50,0x33,0xCC}; // memcpy(buff,cmd1,16); printf("cmd1:0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // xxtea( buff, 4,keys); printf("cmd1:0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // memcpy(buff,cmd2,16); printf("cmd2:0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // xxtea( buff, 4,keys); printf("cmd2:0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]); // //}