TEA算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。QQ使用此加密技术,加密轮数为16轮。
Tea算法是一种分组加密算法,以原文以8字节(64bite)为一组,密钥16字节(128bite)为一组,(char为1字节,int为4字节,double为8字节),该算法加密轮次可变,建议为32轮。(最低为16轮)
Tea算法的特征是存在0x9e3779b9.
加密:
#include<stdio.h>
void encode(unsigned int* v,unsigned int *k)
{
unsigned int l=v[0],r=v[1];
unsigned int k0=k[0],k1=k[1],k2=k[2],k3=k[3];
unsigned int delta=0x9e3779b9;
int i;
unsigned int sum=0;
for(i=0;i<32;i++) //核心加密算法,建议32轮,最低16轮
{
sum+=delta;
l+=((r<<4)+k0)^(r+sum)^((r>>5)+k1); //r<<4/r*16
r+=((l<<4)+k2)^(l+sum)^((l>>5)+k3);
}
v[0]=l;
v[1]=r;
}
int main()
{
unsigned int a[2]={1,2}; //明文,必须是8字节的倍数,不够需要程序补全,参考base64方法
unsigned int k[4]={2,2,3,4};//密钥随便
encode(a,k);
printf("%d %d",a[0],a[1]);
}
解密:
uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; //由加密轮数而算出
uint32_t delta=0x9e3779b9;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for (i=0; i<32; i++) { //核心解密算法
v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
sum -= delta;
}
v[0]=v0; v[1]=v1;