QQ网络数据包的加密和解密函数[ZT]

作者在 2007-08-19 22:56:00 发布以下内容
//Binny
QQ用于网络数据包的加密和解密函数如下:
该函数已经通过验证,如果你也在研究的话,可以直接跳过密码算法这个关。

#include "stdafx.h"
#include <winsock.h>
#define ROUNDS 16
#define DELTA 0x9e3779b9 

void QQEncrypt(long* v, long* k, long* out);
void QQDecrypt(long* v, long* k, long* out);

int main(int argc, char* argv[])
{
  long v[2], k[4], out[2];
  v[0]=0x97849FC5;//举个例子说明一下
  v[1]=0xC663ADEA;
  //这是用来解密的密钥,QQ的Tea加密全用这个
  k[0]=0x3A9DAA0A;
  k[1]=0xCE16881A;
  k[2]=0xFD045661;
  k[3]=0xBCF5C5D4;

  QQEncrypt(v,k,out);
  QQDecrypt(out,k,out);
  return 0;
}

void QQEncrypt(long* v, long* k, long* out)
{
unsigned long y=v[0],z=v[1],x[4],sum=0;
long limit=ROUNDS;
long test1;

y=ntohl(y);
z=ntohl(z);

for (int i=0;i<4;i++)
  x= ntohl(k);
while (limit-->0)
{
  sum += DELTA ;
  test1=(z>>5);
  y += (z<<4)+x[0] ^ z+sum ^ (z>>5)+x[1] ;
  z += (y<<4)+x[2] ^ y+sum ^ (y>>5)+x[3] ; 
}
out[0]=ntohl(y) ;
out[1]=ntohl(z) ;
}

void QQDecrypt(long* v, long* k, long* out)
{
unsigned long y=v[0],z=v[1],x[4],sum=0xe3779b90; 
long limit=ROUNDS;

y=ntohl(y);
z=ntohl(z);

for (int i=0;i<4;i++)
  x= ntohl(k);
while (limit-->0)
{
  z -= (y<<4)+x[2] ^ y+sum ^ (y>>5)+x[3] ;
  y -= (z<<4)+x[0] ^ z+sum ^ (z>>5)+x[1] ; 
  sum -= DELTA ;
}
out[0]=ntohl(y) ;
out[1]=ntohl(z) ;
}
QQ的密钥是一个有趣的结构,是随机生成的,后面我会进一步说明,大家期待一下吧:)
QQ相关 | 阅读 6657 次
文章评论,共2条
Knocker(作者)
2007-11-18 22:20
1
[emot]9[/emot]
p8x8x8
2011-06-01 14:16
2
谢谢了 今天晚上回去继续 看
游客请输入验证码