⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qqhash.cpp

📁 QQ自动登陆器, 同时支持TM, 利用QQ可以从命令行接收参数登陆的特点制做, 源码中有QQ密码加密的完整算法, 开发环境, VC++6.0
💻 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 + -