密码算法应用实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.13 TEA加密算法

TEA是一种小型的加密算法,是由英国剑桥大学计算机实验室的D.J.Wheeler和R.M.Needham于1994年提出的。

TEA是DES型多层迭代分组加密算法,迭代层数r=2n,分组长度为64比特,密钥长度为128比特。TEA加密算法是一个很简单的程序,设置时间极短,不需要预置非线性代替表。TEA加密算法的每层变换都很简单,是一个弱非线性变换,经过足够层数的迭代,可以使算法达到安全、保密的目的,所以迭代层数比较多,建议使用64层。

128比特的密钥分成4个32比特的字,记为K0K3,层密钥为2个字,第i层密钥记为Ki0Ki1

TEA加密算法还要用到一个常数C,用十六进制表示为:

C=9e3779b9=(-1)×231

C来自黄金分割数,由C生成各层所用常数C1Cr,即

C2i-1=C2i=i×C mod 232, i=1, …, n

输入明文记为(X0, X1),计算

Xi+1=[(Xi<<4+Ki0)⊕(Xi+Ci)⊕(Xi>>5+Ki1)]+Xi-1

式中,“+”为模232加。

TEA加密算法由交替使用模2加和模232加来提供非线性,由相反方向的移位使密钥比特和数据比特反复混合。TEA加密算法没有设置非线性代替表,使初始设置时间极短。

TEA加密算法存在等价密钥,当K0K1的最高位同时取反时等价,同样当K2K3的最高位同时取反时也等价,所以至少有3个等价的密钥。

下面给出r=64时TEA加密算法C语言的描述。64层迭代可以看成32个循环,每次循环为2层。密钥为4个字,放在k[0]~k[1],明文放在k[0]~k[1]。C语言程序如下:

void code (unsigned long*p, unsigned long*k)
{
    unsigned long y=p[0], z=p[1], sum=0,     /*置初值*/
    delta=0x9e3779b9,                       /*常数*/
    n=32;
    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]); n--;
    }
    p[0]=y; p[1]=z;
}

经上述运算后,p[0]和p[1]为密文。