预览加载中,请您耐心等待几秒...
1/3
2/3
3/3

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

网上找到的qq协议的TEA加密和解密说明如下:也有很多源代码,但是感觉上代码比较复杂,不容易看。我用HYPERLINK"http://www.hake.cc/a/biancheng/ruanjian/cs/"C#重写了下。基于2008协议 *HYPERLINK"http://www.hake.cc/qq/"QQ消息的加密算法是一个16次的迭代过程,并且是反馈的,每一个加密单元是8字节,输出也是8字节,密钥是16字节 *我们以prePlain表示前一个明文块,plain表示当前明文块,crypt表示当前明文块加密得到的密文块,preCrypt表示前一个密文块*f表示加密算法,d表示解密算法那么从plain得到crypt的过程是:*crypt=f(plain^preCrypt)^prePlain*所以,从crypt得到plain的过程自然是*plain=d(crypt^prePlain)^preCrypt*此外,算法有它的填充机制,其会在明文前和明文后分别填充一定的字节数,以保证明文长度是8字节的倍数*填充的字节数与原始明文长度有关,填充的方法是:**-------消息填充算法-----------*a=(明文长度+10)mod8*if(a不等于0)a=8-a;*b=随机数&amp;0xF8|a;这个的作用是把a的值保存了下来*plain[0]=b;然后把b做为明文的第0个字节,这样第0个字节就保存了a的信息,这个信息在解密时就要用来找到真正明文的起始位置*plain[1至a+2]=随机数&amp;0xFF;这里用随机数填充明文的第1到第a+2个字节*plain[a+3至a+3+明文长度-1]=明文;从a+3字节开始才是真正的明文*plain[a+3+明文长度,最后]=0;在最后,填充0,填充到总长度为8的整数为止。到此为止,结束了,这就是最后得到的要加密的明文内容 *-------消息填充算法------------ ///<summary>///加密解密QQ消息包的工具类.///</summary>publicstaticclassQQCrypter{privatestaticvoidcode(byte[]In,intinOffset,intinPos,byte[]Out,intoutOffset,intoutPos,byte[]key){if(outPos>0){for(inti=0;i<8;i++){In[outOffset+outPos+i]=(byte)(In[inOffset+inPos+i]^Out[outOffset+outPos+i-8]);}}uint[]formattedKey=FormatKey(key);uinty=ConvertByteArrayToUInt(In,outOffset+outPos);uintz=ConvertByteArrayToUInt(In,outOffset+outPos+4);uintsum=0;uintdelta=0x9e3779b9;uintn=16;while(n-->0){sum+=delta;y+=((z<<4)+formattedKey[0])^(z+sum)^((z>>5)+formattedKey[1]);z+=((y<<4)+formattedKey[2])^(y+sum)^((y>>5)+formattedKey[3]);}Array.Copy(ConvertUIntToByteArray(y),0,Out,outOffset+outPos,4);Array.Copy(ConvertUIntToByteArray(z),0,Out,outOffset+outPos+4,4);if(inPos>0){for(inti=0;i<8;i++){Out[outOffset+outPos+i]=(byte)(Out[outOffset+outPos+i]^In[inOffset+inPos+i-8]);}}}privatestaticvoiddecode(byte[]In,intinOffset,intinPos,byte[]Out,intoutOffset,intoutPos,byte[]key){if(outPos>0){for(inti=0;i<8;i++){Out[outOffset+outPos+i]=(byte)(In[inOffset+inPos+i]^Out[outOffset+outPos+i-8]);}}else{Array.Copy(In,inOffset,Out,outOffset,8);}uint[]formattedKey=FormatKey(key);uinty=ConvertByteArrayToUInt(Ou