1、TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,这里也可以根据自己需要设置加密轮数。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0x9e3779b9)。
2、加密核心函数void tea_encode(int* v, const int* k){ unsigned int y=v[0],z=v[1], sum=0, delta=0x9e3779b9, // 神秘常数δ作为倍数 n=16 ; // 这里设置加密轮数,与下面解密轮数对应 while (n-->0) { // 循环加密 sum += delta ; y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ; z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; } v[0]=y ; v[1]=z ;}
3、解密核心函数void tea_decode(int* v, const int* k){ unsigned int y = v[0], z = v[1], sum = 0, delta = 0x9e3779b9, // 神秘常数δ作为倍数 n = 16; // 这里设置加密轮数,与下面解密轮数对应 while (n-- > 0) { // 循环加密 z-= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; y-= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ; sum-=delta ; } v[0]=y ; v[1]=z ;}
4、上面的代码实现了一个64位分组的加密算法。但对于一串数据来说,还要处理少于9字节(64位)的数据加解密void tea_encode_byte(char* v, const int* k, int p){ char y[] = "Guo$Tea"; // 这是固定写的一个字符串,只要与解密相同即可,7字节长度 *v = *v^y[p]^(char)(k[p%4]%0xFF);}void tea_decode_byte(char* v, const int* k, int p){ char y[] = "Guo$Tea"; *v = *v^(char)(k[p%4]%0xFF)^y[p];}
5、接下来是要把加密数据分组运算// in_bu酆璁冻嘌ffer=加密的数据,in_size=数据长度,key=128位密阵鹤闷黥钥,cipherRemains=是否加密8字节整数陪之外的数据void tea_encode_buffer(char* in_buffer, unsigned int in_size, const int* key, int cipherRemains){ char *p; unsigned int remain = in_size % 8; // 计算出数据8字节整数陪之外的数据 unsigned int align_size = in_size - remain; // 分组加密长度 for (p = in_buffer; p < in_buffer + align_size; p += 8) tea_encode( (int*)p, key); // 8字节分组加密 // 处理超出8字节整数陪的数据 if( remain > 0 && cipherRemains ) for (p = in_buffer + align_size; p < in_buffer + in_size; p += 1) tea_encode_byte( p, key, --remain );}
6、接下来是要把解密数据分组运算void tea娄多骋能_decode_buffer(char* in_buffer, unsigned int in_size, const int* key, int 艘早祓胂cipherRemains){ char *p; unsigned int remain = in_size % 8; // 计算出数据8字节整数陪之外的数据 unsigned int align_size = in_size - remain; // 分组加密长度 for (p = in_buffer; p < in_buffer + align_size; p += 8) tea_decode( (int*)p, key); // 8字节分组加密 // 处理超出8字节整数陪的数据 if( remain > 0 && cipherRemains ) for (p = in_buffer + align_size; p < in_buffer + in_size; p += 1) tea_decode_byte( p, key, --remain );}
7、测试加密/解密int main(){ const int ENCRYPT_ARRAY[] = { 1,2,5,1 }; // 128位密钥 char* pTestStr = "这是测试代码字符串,也可以从文件或其他地方来的数据块"; int nlen = strlen(pTestStr) + 1; char* pData = new char[nlen]; memcpy(pData, pTestStr, nlen); // 加密数据块,加密后的数据存入pData中 tea_decode_buffer((char*)pData, nlen, ENCRYPT_ARRAY, 1); // 解密数据块,解密后的数据存入pData中 tea_encode_buffer(pData, nlen, ENCRYPT_ARRAY, 1); return 0;}