您的位置首页生活百科

TEA加密算法详解

TEA加密算法详解

的有关信息介绍如下:

TEA加密算法详解

TEA(Tiny Encryption Algorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。

TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,这里也可以根据自己需要设置加密轮数。

该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0x9e3779b9)。

加密核心函数

void tea_encode(int* v, const int* k)

{

unsigned int y=v,z=v, sum=0,

delta=0x9e3779b9, // 神秘常数δ作为倍数

n=16 ; // 这里设置加密轮数,与下面解密轮数对应

while (n-->0) { // 循环加密

sum += delta ;

y += (z<<4)+k ^ z+sum ^ (z>>5)+k ;

z += (y<<4)+k ^ y+sum ^ (y>>5)+k ;

}

v=y ; v=z ;

}

解密核心函数

void tea_decode(int* v, const int* k)

{

unsigned int y = v, z = v, sum = 0,

delta = 0x9e3779b9, // 神秘常数δ作为倍数

n = 16; // 这里设置加密轮数,与下面解密轮数对应

while (n-- > 0) { // 循环加密

z-= (y<<4)+k ^ y+sum ^ (y>>5)+k ;

y-= (z<<4)+k ^ z+sum ^ (z>>5)+k ;

sum-=delta ;

}

v=y ; v=z ;

}

上面的代码实现了一个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];}

接下来是要把加密数据分组运算

// in_buffer=加密的数据,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 );}

接下来是要把解密数据分组运算

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 );

}

测试加密/解密

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;

}