作者在 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的密钥是一个有趣的结构,是随机生成的,后面我会进一步说明,大家期待一下吧:)
该函数已经通过验证,如果你也在研究的话,可以直接跳过密码算法这个关。
#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的密钥是一个有趣的结构,是随机生成的,后面我会进一步说明,大家期待一下吧:)