从密码学角度看腾讯常用的TEA加密算法

免责声明:此文档的目的是为了分析腾讯常用的TEA算法,参考信息全部根据网上公开的资料,关键信息也做了过滤,不存在任何攻击和泄密。

TEA这个简单加密算法在中国如此有名,大概主要因为腾讯在大量协议,本地数据中使用这个算法。网上很多人甚至直接将腾讯的加密算法称为TEA算法。

腾讯的算法,数据分块的加密的确采用的是TEA(第一代)算法,密钥16个字节,每次处理的分块数据是8个字节(2个32位整数),但标准的TEA算法推荐处理的轮数是32轮甚至64轮,而腾讯使用的是16轮。应该是为了加快速度。

腾讯的加密算法,是于一个数据流(BUFFER)的处理,采用的的是改进CBC的算法(看见一片blog称这个是交织算法,很贴切)。你可以这样认为TEA这类对称加密算法是针ECB的(Electroniccodebook),是处理一个定长的数据块的。但如果如果对于流数据只采用ECB算法是有巨大风险的,因为对称加密算法的本质是相同的原文和密钥,得到的密文肯定一致,如果对于流数据,单纯的分块处理,很容易让人伪造密文数据(维基上都有人针对某个图片做ECB预算,对比原图和加密后的图像,你仍然可以从密文图片上看出很多信息)。CBC算法对于这个问题的改造是在密文前面加入一个随机数生成的初始化向量IV(Initialization Vector),通过ECB算法得到的密文半成品要和前一个密文,(包括IV)进行异或预算预算得到密文,因为随机数每次都不一致。这样你可以认为密文是永远不会重复的,而且这样伪造的难度大大提升。另外CBC的算法是在ECB的基础上的,所以如果你的长度不足以填充一个块,会进行补齐。

下图来自维基




腾讯CBC算法的大致思路是,1个字节补齐长度 + N个补齐的字节(随机数填充)+M个字节的SALT(随机数)+ 数据内容+K个字节的校验0。补齐长度=TEA算法的块大小8 -(非补齐数据区长度模除 % 8),而非补齐数据区长度(1字节的补齐长度+数据内容长度+0校验长度之和)。对于解密的校验,在在解密后,检查K个0的校验字段都是0,可以认为在不知道密钥的情况下,进行伪造密文还是有不少麻烦。要说明的是这个算法的第一个BLOCK里面是可能有原文数据的,而其算法对于第一个BLOCK也进行了加密处理,这个和标准算法并不太一致(标准算法IV是无意义的),而且由于N可能为0,其加盐的处理是也是必须的。

先抛开加密算法的安全性不谈,吹毛求疵的说,这个实现在性能上的考虑有点欠缺。

首先这个算法没有考虑原文数据区字节对齐的问题,(假如补齐的长度是2)可能会导致原文的数据每次处理都不是在对齐位置,这多少会影响一些计算性能。

另外,TEA算法是针对2个4字节整数的算法,并没有规定字节序。而腾讯的实现为了考虑多平台的一致性,实现内部计算时都是使用网络序。这的确严谨一点,但考虑到代码99.99%的时候服务场景仍然是X86平台,而且X86的小头在整数转换上的优势,反而不如直接要求所有环境统一成小头字节序运算(就是要求在大头字节序的环境转换为小头字节序运算)。这样就避免了大部分时候转换网络序的消耗。

另外在每次异或的时候,是对每个字节进行的异或处理,上面的这些问题,稍微改进一下,提高20%的速度应该是有可能的。

还有一个的确有点安全性小问题,这个算法在某些时候,在第一个BLOCK

最后还是YY一下这个算法的安全性,TEA算法其实足够满足大部分要求。虽然TEA是一个简单加密算法,腾讯使用的算法,早已被破解了,源代码也漫天飞了。但对称加密的最主要安全性在于每人不同的的动态密钥,不在算法本身,而且我们要搞明白加密算法主要用于网上的协议加密,存储数据的简单加密,他真正能防范的是第三方模拟,和中间点截获报文分析。而对于木马,不是加密算法对抗的范畴。形象的举例说密码学的应用范畴是二战潜伏在敌占区的英国特工向本土发报的报文处理,它能让德军截获电报时也无法破译,而木马是可能潜伏在发报员身边的德国间谍,对抗方法当然不一致。

 

参考资料:

《应用密码学》 当年密码学的红宝书,据说当年此书是管制书籍,禁止向我国出口,个人感觉翻译有点乱。

《密码编码学与网络安全》 这本书在一些细节上写的更清晰一些。

《维基:块密码的工作模式》  好文,强烈推荐。

《看雪论坛:RTX(腾讯通)本地保存密码TEA变形算法及还原器》 看算法的说明感觉根据DLL反出来的接口

《TEA和QQTEA》这哥们应该也是通过反编译

pudn 上有很多是实现的源代码,比如QQTea,应该也是一些破解实现,但下载要收费。

 

【本文作者是fullsail(雁渡寒潭),本着自由的精神,你可以在无盈利的情况完整转载此文档,转载时请附上BLOG链接:http://blog.csdn.net/fullsail/,否则每字一元不讲价。对Baidu文库,360doc加价一倍】

posted @ 2013-04-30 18:15  javawebsoa  Views(875)  Comments(0Edit  收藏  举报