"TEA"的全称为"TinyEncryptionAlgorithm"是1994年由英国剑桥大学的Davidj.wheeler发明的。
TEA算法也算是一种微型加密算法的。
在安全学领域,TEA(TinyEncryptionAlgorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。
TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行64轮迭代,但是作者认为32轮已经足够了,所以32轮迭代加密后最后得到的密文就是64位。
简单的说就是,TEA加密解密是以原文以8字节(64位bit)为一组,密钥16字节(128位bit)为一组,(char为1字节,int为4字节,double为8字节),该算法加密轮次可变,作者建议为32轮,因为被加密的明文为64位,所以最终加密的结果也是64位。
TEA算法的图解如下图所示
从图解中可以看到运算有加法运算,位运算,异或运算。
流程1:
1、首先TEA加密解密是以原文以8字节,所以从两边各自传入四个字节
2、右边传入的4个字节,这里将这4个字节称呼为M,M进行了三个部分的操作,M左移4位与密钥[0]相加,M右移5位与密钥[1]相加,M与δ相加,最后这三个算出的值再异或
3、左边传入的4个字节,这里将这4个字节称呼为N,N=N+M流程2:
接着就到了下面这个部分,这里的话M和N交换了位置,
2、右边传入的4个字节,N进行了三个部分的操作,N左移4位与密钥[2]相加,N右移5位与密钥[3]相加,N与δ相加,最后这三个算出的值再异或
3、左边传入的4个字节,M=M+N
4、此时拿到的M和N就是加密过后的M和N
1、tea算法的特征就是DELTA值和十六个字节的密钥(也就是128位)。
2、在逆向程序的时候,可以利用ida的插件findcypto识别tea算法
3、x-=0x61c88647和x+=0x9e3779b9,这两个值是等价的,可能会在反汇编中看到
这里将上面测试的代码编译好拖入IDA中进行观察
可以看到δ就被反编译为v4-=1640531527;
但是反汇编中就是0x9e3779b9,如下图所示
我们这里用findcypto插件来进行识别测试,0x9e3779b9特征码被识别,如下图所示
前面有提到关于"但δ的精确值似乎并不重要",所以δ的值不一定需要0x9E3779B9,所以这里的话在加密解密的时候可以改变这个δ的值,改了之后就会导致部分识别加密的工具失效来达到算法魔改的目的。
测试代码,改变其中的δ的值
这里将上面测试的代码编译好拖入IDA中进行观察,可以看到这个插件就无法识别出TEA算法了,因为改了0x9E3779B9特征码
每次处理64位数据,使用128位密钥。数据和密钥都分割成32为无符号整型处理。
不同点:TEA标准中使用的32轮加密,而腾讯只用了16轮。
可以看到其他都一样的,就是迭代次数为16次
#include
XTEA是TEA的升级版,增加了更多的密钥表,移位和异或操作等等,设计者是RogerNeedham,DavidWheeler
之后TEA算法被发现存在缺陷,作为回应,设计者提出了一个TEA的升级版本——XTEA(有时也被称为"tean")。XTEA跟TEA使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原128位的密钥被拆分为4个32位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。