前言根据网上的众多分析来看,很多QQTEA算法要么是反编译分析的,要么是根据其他版本改写的,很少有直接根据源码分析改写的,而且很多分析体现在源码里,梳理性的内容不多。后面的人去看又要重新梳理。 一、寻找函数这里根据腾讯公开的JS文件分析,比反编译简单一些,至少能直接看到源码,JS文件:c_login_2.js 首先,看到这个JS很多人可能无从下手,首先要做的就是下载下来然后格式化 需要注意的是,网上大多数在线格式化网站不能正确的处理自执行函数,建议使用eclipse或者webstorm eclipse格式化之后,有5639行,那么怎么才能找到TEA算法所在函数呢,搜索即可,不过我已经找好了 在notepad 下,Alt 0折叠所有,找到带一个参数的自执行函数,展开就可以了,注意:这个js文件一共有两个自执行函数,找不准的搜索关键字tea吧 找到之后,我们把这个函数单独拷贝出来调试,具体内容这里就不贴了,太长了 二、调用函数接下来我们来看一下这个函数的加密解密效果,可能有人不知道怎么调,这里介绍两种方法 F12控制台法:Chrome或者Firefox打开一个空页面,复制这个函数,直接粘贴到控制台,回车, 然后复制如下语句
JS文件法:新建一个js文件如tea.js,复制前面那个函数,然后在函数结束的分号后面再加一段
<script src='qqtea.js'></script> 三、分析函数(加密篇)上面只是演示这个函数的效果,下面才是重头戏,分析这个js的加密解密过程 加密方法:
(一)填充算法参考这张图说明一下:
QQ在填充后的数据长度=原始数据长度 a 10 其中a的算法: 如果(B 10) % 8=0,则a=0,如果(B 10) % 8=!0则a=8-((B 10) % 8) 整个数据区概况:1个字节标识a的长度(低位填充a,高位填充随机数) a个字节的随机数填充 2位随机数填充 原始数据 7个字节0填充 数据区每取到8个字节就用r()函数加密一次 (二)、QQCBC交织算法r()函数采用类似CBC模式 为什么是类似CBC,因为QQ的CBC模式比标准多了一步异或 QQCBC模式是这样的 与标准CBC多出来的异或在下图用红框标注出来了 QQCBC对应的代码如下:
图中的加密器使用的是16轮标准TEA加密,这个QQ没有改 (三)、TEA算法标准TEA算法的图可以参考我之前写过的:TEA、XTEA、XXTEA加密解密算法 为了文章的完整性,这里也贴一下,图是一轮加密的描述 QQ的TEA用的16轮加密,标准用的32轮,常数delta=0x9e3779b9十进制就是2654435769,存储加密结果的时候使用的是网络序,代码如下
(四)、常见问题1.加密同一个明文结果不一样
QQ在实现加密的时候用了随机数填充,填充之后的数据区不一样,加密的明文自然不一样,填充用到的f()产生随机数,部分网上的实现可能为了比较算法结果固定了这个随机数,这时候密文结果就唯一了。密文解密时这些填充进去的随机数不影响解密
2.末尾填充7个字节0的作用
解密时校验解密的字符串是否正确
3.tea算法里的delta,tea解密算法里的sum取值
delta=(2^32)*黄金分割数0.618
sum = delta << 3; //32轮运算,是2的5次方,delta左移4位;16轮运算,是2的4次方,delta左移3位;8轮运算,是2的3次方,delta左移2位
4.自匿名函数中几个全局变量的作用
TEA.initkey('111')可以改写为window.TEA.initkey('111'),其他以此类推。因为自匿名函数传了window参数进去,所以这些方法也是window对象的函数。 |
|