📄 zqqhash.cpp
字号:
/*-======================- Copyright (c) 2006 -======================-
程序作者:
张鲁夺(zhangluduo) : 为所有爱我的人和我爱的人努力!
联系方式:
zhangluduo@msn.com
[oopfans]群:34064264
修改时间:
2007-03-09
功能描述:
本类实现了QQ密码在发向服务器前的加密过程,有关加密过程在源码中有
详细的注释.
版权声明:
许可任何单位,个人随意使用,拷贝,修改,散布及出售这份代码,但是必须保
留此版权信息,以慰藉作者辛勤的劳动,及表明此代码的来源,如若此份代码
有任何BUG,请通知作者,以便弥补作者由于水平所限而导致的一些错误和不
足,谢谢!
-======================- Copyright (c) 2006 -======================-*/
#include "stdafx.h"
#include "ZQQHash.h"
ZQQHash::ZQQHash()
{
}
ZQQHash::~ZQQHash()
{
}
string ZQQHash::Hex2Bin(const string strHex)
{
string strBinValue;
for(int i=0;i<strHex.length();i++)
{
switch(strHex[i])
{
case '0':
strBinValue+="0000";
break;
case '1':
strBinValue+="0001";
break;
case '2':
strBinValue+="0010";
break;
case '3':
strBinValue+="0011";
break;
case '4':
strBinValue+="0100";
break;
case '5':
strBinValue+="0101";
break;
case '6':
strBinValue+="0110";
break;
case '7':
strBinValue+="0111";
break;
case '8':
strBinValue+="1000";
break;
case '9':
strBinValue+="1001";
break;
case 'a':
strBinValue+="1010";
break;
case 'b':
strBinValue+="1011";
break;
case 'c':
strBinValue+="1100";
break;
case 'd':
strBinValue+="1101";
break;
case 'e':
strBinValue+="1110";
break;
case 'f':
strBinValue+="1111";
break;
case 'A':
strBinValue+="1010";
break;
case 'B':
strBinValue+="1011";
break;
case 'C':
strBinValue+="1100";
break;
case 'D':
strBinValue+="1101";
break;
case 'E':
strBinValue+="1110";
break;
case 'F':
strBinValue+="1111";
break;
};
}
return strBinValue;
}
string ZQQHash::Bin2Hex(const string strBin4)
{
if(strBin4.length()!=4) return 0;
if(strBin4=="0000")
return "0";
if(strBin4=="0001")
return "1";
if(strBin4=="0010")
return "2";
if(strBin4=="0011")
return "3";
if(strBin4=="0100")
return "4";
if(strBin4=="0101")
return "5";
if(strBin4=="0110")
return "6";
if(strBin4=="0111")
return "7";
if(strBin4=="1000")
return "8";
if(strBin4=="1001")
return "9";
if(strBin4=="1010")
return "A";
if(strBin4=="1011")
return "B";
if(strBin4=="1100")
return "C";
if(strBin4=="1101")
return "D";
if(strBin4=="1110")
return "E";
if(strBin4=="1111")
return "F";
return "";
}
string ZQQHash::FindFromTable(const string strHex2)
{
if(strHex2=="00")
return "A";
if(strHex2=="01")
return "B";
if(strHex2=="02")
return "C";
if(strHex2=="03")
return "D";
if(strHex2=="04")
return "E";
if(strHex2=="05")
return "F";
if(strHex2=="06")
return "G";
if(strHex2=="07")
return "H";
if(strHex2=="08")
return "I";
if(strHex2=="09")
return "J";
if(strHex2=="0A")
return "K";
if(strHex2=="0B")
return "L";
if(strHex2=="0C")
return "M";
if(strHex2=="0D")
return "N";
if(strHex2=="0E")
return "O";
if(strHex2=="0F")
return "P";
if(strHex2=="10")
return "Q";
if(strHex2=="11")
return "R";
if(strHex2=="12")
return "S";
if(strHex2=="13")
return "T";
if(strHex2=="14")
return "U";
if(strHex2=="15")
return "V";
if(strHex2=="16")
return "W";
if(strHex2=="17")
return "X";
if(strHex2=="18")
return "Y";
if(strHex2=="19")
return "Z";
if(strHex2=="1A")
return "a";
if(strHex2=="1B")
return "b";
if(strHex2=="1C")
return "c";
if(strHex2=="1D")
return "d";
if(strHex2=="1E")
return "e";
if(strHex2=="1F")
return "f";
if(strHex2=="20")
return "g";
if(strHex2=="21")
return "h";
if(strHex2=="22")
return "i";
if(strHex2=="23")
return "j";
if(strHex2=="24")
return "k";
if(strHex2=="25")
return "l";
if(strHex2=="26")
return "m";
if(strHex2=="27")
return "n";
if(strHex2=="28")
return "o";
if(strHex2=="29")
return "p";
if(strHex2=="2A")
return "q";
if(strHex2=="2B")
return "r";
if(strHex2=="2C")
return "s";
if(strHex2=="2D")
return "t";
if(strHex2=="2E")
return "u";
if(strHex2=="2F")
return "v";
if(strHex2=="30")
return "w";
if(strHex2=="31")
return "x";
if(strHex2=="32")
return "y";
if(strHex2=="33")
return "z";
if(strHex2=="34")
return "0";
if(strHex2=="35")
return "1";
if(strHex2=="36")
return "2";
if(strHex2=="37")
return "3";
if(strHex2=="38")
return "4";
if(strHex2=="39")
return "5";
if(strHex2=="3A")
return "6";
if(strHex2=="3B")
return "7";
if(strHex2=="3C")
return "8";
if(strHex2=="3D")
return "9";
if(strHex2=="3E")
return "+";
if(strHex2=="3F")
return "/";
return "";
}
string ZQQHash::GetHash(const string strPassword)
{
string strResult;
//首先将原密码进行MD5加密
ZMD5EX md5;
string strMD5=md5.GetMD5OfString(strPassword,false);
//将32个十六进制字母分成12个一组,12个一组,8个一组
string strHex[]=
{
strMD5.substr(0,12),
strMD5.substr(12,12),
strMD5.substr(24,8)
};
string strBin;
for(int i=0;i<3;i++)
{
//将拆分的十六进制数组转为二进制
strBin=Hex2Bin(strHex[i]);
//将二进制串以6位拆分为一组,在前面补两个0,不足八位的在后面以0补齐
string strBinArray[8];
int Count=-1;
for(int j=0;j<strBin.length();j+=6)
{
Count++;
strBinArray[Count]=strBin.substr(j,6);
strBinArray[Count]="00"+strBinArray[Count];
string strPad;
for(int k=0;k<8-(strBinArray[Count].length());k++)
strPad+="0";
strBinArray[Count]+=strPad;
}
//以十六位形成一个新数组
string strNewArray[4];
strNewArray[0]=strBinArray[0]+strBinArray[1];
strNewArray[1]=strBinArray[2]+strBinArray[3];
strNewArray[2]=strBinArray[4]+strBinArray[5];
strNewArray[3]=strBinArray[6].empty() ? "" : strBinArray[6]+strBinArray[7];
//将二进制转为临时十六进制,以便用这个十六进制进行查表
string strTmpHex;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(!strNewArray[i].empty())
strTmpHex+=Bin2Hex(strNewArray[i].substr(j*4,4));
}
}
//利用上面得到的十六进制串查表
for(int i=0;i<strTmpHex.length();i+=2)
{
strResult+=FindFromTable(strTmpHex.substr(i,2));
}
}
return strResult+"==";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -