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

📄 zqqhash.cpp

📁 QQ密码加密算法实现,
💻 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 + -