上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比特的字,记为K0~K3,层密钥为2个字,第i层密钥记为Ki0、Ki1:
TEA加密算法还要用到一个常数C,用十六进制表示为:
C=9e3779b9=(-1)×231
C来自黄金分割数,由C生成各层所用常数C1~Cr,即
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加密算法存在等价密钥,当K0和K1的最高位同时取反时等价,同样当K2和K3的最高位同时取反时也等价,所以至少有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]为密文。