📄 qqhash.cpp
字号:
/*
Copyright 2006 - 2008, All Rights Reserved.
QQ密码加密算法实现
作者 - 张鲁夺(zhangluduo)
MSN - zhangluduo@msn.com
QQ群 - 34064264
为所有爱我的人和我爱的人努力!
*/
#include "stdafx.h"
#include "QQHash.h"
QQHash::QQHash()
{
}
QQHash::~QQHash()
{
}
string QQHash::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 QQHash::Bin2Hex(const string strBin4)
{
if(strBin4.length() != 4)
return "";
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 QQHash::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 QQHash::GetHash(const string strPassword)
{
string strResult = "";
//首先将原密码进行MD5加密
MD5 md5;
MD5::MD5_CTX context;
unsigned char digest[16];
string strMD5;
md5.MD5Init (&context);
md5.MD5Update (&context, (unsigned char *)strPassword.c_str(), strPassword.length());
md5.MD5Final (digest, &context);
for(int i = 0 ; i < 16; i++)
{
char buf[3] = {0};
sprintf(buf, "%.2X", digest[i]);
strMD5 += buf;
}
//将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 + -