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

📄 regpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// RegPage.cpp : implementation file
//

#include "stdafx.h"
#include "minica.h"
#include "RegPage.h"
#include "MiniMainDlg.h"
#include "mapi.h"                     
#include "Evp.h"
#include ".\GenericClass\Language.h"
#include "minicT.h"
#include ".\Control\Smtp\Smtp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRegPage property page

IMPLEMENT_DYNCREATE(CRegPage, CPropertyPage)

CRegPage::CRegPage() : CPropertyPage(CRegPage::IDD)
{
	//{{AFX_DATA_INIT(CRegPage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

CRegPage::~CRegPage()
{
}

void CRegPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRegPage)
//	DDX_Control(pDX, IDC_EDIT_USER, m_XpEditUser);
//	DDX_Control(pDX, IDC_EDIT_REGCODE, m_XpEditReg);
	DDX_Control(pDX, IDC_STATICTHANK, m_ThankStatic);
	DDX_Control(pDX, IDC_BREG, m_Breg);
	DDX_Control(pDX, IDC_BGET_REG, m_Bgetreg);
	DDX_Control(pDX, IDC_BGET_CHECK, m_Bgetcheck);
	DDX_Control(pDX, IDC_B_SELECT, m_Bselect);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRegPage, CPropertyPage)
	//{{AFX_MSG_MAP(CRegPage)
	ON_BN_CLICKED(IDC_BGET_CHECK, OnBgetCheck)
	ON_BN_CLICKED(IDC_BGET_REG, OnBgetReg)
	ON_BN_CLICKED(IDC_BREG, OnBreg)
	ON_BN_CLICKED(IDC_B_SELECT, OnBSelect)
	ON_BN_CLICKED(IDC_REG_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_REG_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_BPOST, OnBpost)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRegPage message handlers

BOOL CRegPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();

	if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
	{
		ClassXP(GetDlgItem(IDC_REG_RADIO1)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_REG_RADIO2)->m_hWnd,TRUE);
	}

	CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
	m_Breg.SetIcon(IDI_ICON10);
	m_Breg.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

	m_Bgetreg.SetIcon(IDI_ICON10);
	m_Bgetreg.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

	m_Bgetcheck.SetIcon(IDI_ICON_SELECTDIR);
	m_Bgetcheck.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

	m_Bselect.SetIcon(IDI_ICON_SELECTDIR);
	m_Bselect.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

//	m_ThankStatic.SetTextColor(RGB(128,87,28));


	((CButton * )GetDlgItem(IDC_REG_RADIO1))->SetCheck(1); //是否注册
	((CButton * )GetDlgItem(IDC_RADIO_E))->SetCheck(1); //企业版

	
	if(((CMiniCaApp * )AfxGetApp())->IsHpxs())//后门
	{
		GetDlgItem(IDC_BGET_CHECK)->ShowWindow(SW_SHOW);
		GetDlgItem(IDC_BGET_REG)->ShowWindow(SW_SHOW);
//		GetDlgItem(IDC_STATIC11)->EnableWindow(1);
		GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(1);
		GetDlgItem(IDC_B_SELECT)->EnableWindow(1);
	}
	else
	{
		GetDlgItem(IDC_BGET_CHECK)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_BGET_REG)->ShowWindow(SW_HIDE);
	}
	// TODO: Add extra initialization here
	// CG: The following block was added by the ToolTips component.	{		// Create the ToolTip control.		m_toolTip.Create(this);		m_toolTip.AddTool(GetDlgItem(IDC_REG_RADIO1), "生成注册请求");
		m_toolTip.AddTool(GetDlgItem(IDC_REG_RADIO2), "注册系统\r必须持有注册应答");
		m_toolTip.AddTool(GetDlgItem(IDC_EDIT_REGCODE), "注册应答存储路径");
		m_toolTip.AddTool(GetDlgItem(IDC_B_SELECT), "选择注册应答文件");
		m_toolTip.AddTool(GetDlgItem(IDC_EDIT_USER), "要注册的用户名");
		m_toolTip.AddTool(GetDlgItem(IDC_BREG), "生成注册请求");
		m_toolTip.AddTool(GetDlgItem(IDC_EDIT_USER2), "用户邮箱\rMiniCA通过此邮箱向用户发送注册应答");
		m_toolTip.AddTool(GetDlgItem(IDC_BPOST), "发送邮件进行注册\r用户邮箱必须真实\n 否则收不到答复");
		// TODO: Use one of the following forms to add controls:		// m_toolTip.AddTool(GetDlgItem(IDC_<name>), <string-table-id>);		// m_toolTip.AddTool(GetDlgItem(IDC_<name>), "<text>");	}


	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

CString CRegPage::GetMachineCode()//得到机器码
{
	return ((CMiniCaApp *)AfxGetApp())->GetMachineCode();
}

CString CRegPage::GetSelfCode(CString filePath)//计算文件验证吗
{
	//首先对文件摘要,然后用私钥签名
	CString mdname("sha1");
	char outMsg[100]="";
	unsigned char md_value[MAX_MD_SIZE]="";
	char buf[1024*2]="";
	unsigned int md_len;
	UCHAR bufsign[1024]={0};
	UINT lensign=0;
		
	if(!CEvp::Digest(mdname.GetBuffer(0),filePath.GetBuffer(0),0,//文件
		md_value,&md_len, outMsg))//消息摘要
	{
		AddMsg(outMsg,M_ERROR);
		return "Error";
	}

	/*私钥*/
	HRSRC hRsrc = NULL;
	DWORD lenKey = 0;
	HGLOBAL hgKey = NULL;
	LPSTR lpKey;

	hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_VERIFY_KEY),"CERT");
	if(hRsrc)
	{
		lenKey = SizeofResource(NULL, hRsrc); 
		hgKey=LoadResource(NULL,hRsrc);
		if(hgKey)
			lpKey=(LPSTR)LockResource(hgKey);
	}
	else
	{
		AddMsg("生成验证码错误",M_ERROR);
		return "Error";
	}
	
	if(!CEvp::Sign(lpKey,lenKey,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//表示内存
		(char *)bufsign,lensign,/*表示内存*/outMsg))
	{
		AddMsg(outMsg,M_ERROR);
		return "Error";
	}
	 
	for(UINT i=0;i<lensign;i++)
	{
		sprintf((char *)&buf[i*2],"%02X",bufsign[i]);//02x标示1个16进制变为2个字符,空补零
	}
	CString str(buf);
	return str;
}

BOOL CRegPage::CheckRegCode(CString username,CString regcode,BOOL type)//检验注册码
{
	//首先根据用户名sha1
	CString mdname("sha1");
	char outMsg[100]="";
	unsigned char md_value[MAX_MD_SIZE]="";
	char buf[1024*2]="";
	unsigned int md_len;
	UCHAR bufsign[1024]={0};
	int lensign=0;
	char lm[257]={0};//保存乱码
	char temp[3]={0};//临时变量
	
	username += GetMachineCode();

	CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
//	strADD.LoadString(IDS_STR_MINICA);
	username += strADD;
	
	if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
		md_value,&md_len, outMsg))//消息摘要
	{
		//	AddMsg(outMsg,M_ERROR);
		return FALSE;
	}
	
	char * Cert = 0;
	if(type)
	{
		Cert = MAKEINTRESOURCE(IDR_REGE_CERT);//企业
	}
	else
		Cert = MAKEINTRESOURCE(IDR_REGI_CERT);//个人

	HRSRC hRsrc=FindResource(NULL,Cert,"CERT");
	DWORD lenCert = SizeofResource(NULL, hRsrc); 
	HGLOBAL hgCert=LoadResource(NULL,hRsrc);
	LPSTR lpCert=(LPSTR)LockResource(hgCert);
	
	//regcode 保存16进制数据 类似B5C3 D6F8->对应2个乱码汉字
	//取出B5转换成10进制,存入乱码的一个位置
	for(int j=0;j<regcode.GetLength();j+=2)
	{
		strncpy(temp,regcode.GetBuffer(0)+j,2);
		lm[j/2] = CMiniCaApp::HexToTen(temp);
	}
	if(CEvp::VerifySign(lpCert,lenCert,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//内存区域
		lm/*签名结果,注册表->转换*/,outMsg))
	{
		return TRUE;
	}
	else
		return FALSE;
	
}

void CRegPage::OnBgetCheck() //得到验证码
{
	// TODO: Add your control notification handler code here
	CString file;
	GetDlgItemText(IDC_EDIT_REGCODE,file);
	file.TrimLeft();
	file.TrimRight();
	if(file.IsEmpty())
	{
		AddMsg("文件名不能为空",M_ERROR);
		return;
	}
	//拷贝到注册表
	CString code = GetSelfCode(file);
	SetDlgItemText(IDC_EDIT_USER,code);
	//put your text in source
	if(OpenClipboard())
	{
		HGLOBAL clipbuffer;
		char * buffer;
		EmptyClipboard();
		clipbuffer = GlobalAlloc(GMEM_DDESHARE, code.GetLength()+1);
		buffer = (char*)GlobalLock(clipbuffer);
		strcpy(buffer, LPCSTR(code.GetBuffer(0)));
		GlobalUnlock(clipbuffer);
		SetClipboardData(CF_TEXT,clipbuffer);
		CloseClipboard();
	}

}

CString CRegPage::GetRegCode(CString username,BOOL bRegE)//得到注册码
{
	//首先根据用户名sha1
	CString mdname("sha1");
	char outMsg[100]="";
	unsigned char md_value[MAX_MD_SIZE]="";
	char buf[1024*2]="";
	unsigned int md_len;
	UCHAR bufsign[1024]={0};
	UINT lensign=0;

	CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
//	strADD.LoadString(IDS_STR_MINICA);
	username += strADD;

	if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
		md_value,&md_len, outMsg))//消息摘要
	{
		AddMsg(outMsg,M_ERROR);
		return "";
	}
	char * Key = 0;
	if(bRegE)
	{
		Key = MAKEINTRESOURCE(IDR_REGE_KEY);//企业
	}
	else
		Key = MAKEINTRESOURCE(IDR_REGI_KEY);//个人
	/*私钥*/
	HRSRC hRsrc = FindResource(NULL,Key,"CERT");
	DWORD lenKey = SizeofResource(NULL, hRsrc); 
	HGLOBAL hgKey = LoadResource(NULL,hRsrc);
	LPSTR lpKey = (LPSTR)LockResource(hgKey);

	if(!CEvp::Sign(lpKey,lenKey,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//表示内存
		(char *)bufsign,lensign,/*表示内存*/outMsg))
	{
		AddMsg(outMsg,M_ERROR);
		return "";
	}
	 
	for(UINT i=0;i<lensign;i++)
	{
		sprintf((char *)&buf[i*2],"%02X",bufsign[i]);//02x标示1个16进制变为2个字符,空补零
	}
	CString str512(buf);
	return str512;
}

void CRegPage::OnBgetReg() //生成mres文件
{
	// TODO: Add your control notification handler code here
	CString mci;
	GetDlgItemText(IDC_EDIT_REGCODE,mci);
	if(mci.IsEmpty())
	{
		AddMsg("请选择*.mreq文件",M_ERROR);
		return;
	}
	CFile MciFile;
	MciFile.Open(mci,CFile::typeBinary|CFile::modeRead);
	DWORD len = MciFile.GetLength();
	char * info = new char[len+1];
	memset(info,0,len+1);
	MciFile.Read(info,len);
	MciFile.Close();

	//16 -> LM
	char strLm[2048] = {0};
	char outMsg[100];
	UINT uLm = CMiniCaApp::HTextToLm(info,strLm);

	delete [] info;
	/*私钥*/
	HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_REGI_KEY),"CERT");
	DWORD dlenKey = SizeofResource(NULL, hRsrc); 
	HGLOBAL hgKey=LoadResource(NULL,hRsrc);
	LPSTR Key=(LPSTR)LockResource(hgKey);
	
	RegReq regReq;
	//私钥解密注册请求
	len = sizeof(RegReq);
	if(CEvp::RSAPrivDec((BYTE *)Key,dlenKey,"",(BYTE *)strLm,uLm, 
		(BYTE *)&regReq,len ,outMsg))
	{
		//通过用户名和机器码生成序列号
		//把类别,用户名,机器码,注册码,通过私钥加密写入MCR文件中
		//用户方面 通过公钥解密 ,验证 机器吗,写入注册表
		RegRes regRes;
		regRes.UserInfo = regReq;
		CString sName,
			    sMac,
				sVer,
				sTemp;

		sName.Format("%s",regReq.UserName);
		sTemp.Format("UserName: %s",sName);
		AddMsg(sTemp,M_WARING);

		sMac.Format("%s",regReq.Mac);
		sTemp.Format("HardCode: %s",sMac);
		AddMsg(sTemp,M_WARING);

		sVer = sName + sMac;
		strcpy(regRes.RegCode,GetRegCode(sVer,regReq.RegType));
		
		//私钥加密
		char McR[20480] = {0};
		len = 20480;
		if(!CEvp::RSAPrivEnc((BYTE *)Key,dlenKey,"",
				(BYTE *)&regRes,sizeof(regRes),(BYTE *)McR,len,outMsg))
		{
			AddMsg(outMsg,M_ERROR);
		}
		else
		{
			CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
			CFile McrFile;
			CString strFielName = sName + ".mres";
			strFielName = "\\" + strFielName;
			CString strRes = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + strFielName;
			McrFile.Open(strRes,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite);
			McrFile.Write(strReg.GetBuffer(0),strReg.GetLength());
			McrFile.Close();
			strRes += MiniCT_1900;//"  生成成功"
			AddMsg(strRes);
		}

	}
	else
	{
		AddMsg(MiniCT_1901, M_ERROR); //应答文件生成错误
	}

//	SetDlgItemText(IDC_EDIT_REGCODE,);
}

void CRegPage::OnBreg() //注册
{
	// TODO: Add your control notification handler code here
	CString username,regcode,resfile;

	int iStateM = ((CButton * )GetDlgItem(IDC_REG_RADIO1))->GetCheck(); //是否生成请求
	int iStateR = ((CButton * )GetDlgItem(IDC_REG_RADIO2))->GetCheck(); //是否注册

	/*公钥*/
	HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_REGI_CERT),"CERT");
	DWORD dlenKey = SizeofResource(NULL, hRsrc); 
	HGLOBAL hgKey=LoadResource(NULL,hRsrc);
	LPSTR Key=(LPSTR)LockResource(hgKey);

	BOOL bE = TRUE;//指定为企业版本FALSE;//是否为企业版用户

	if(iStateM)//生成注册文件
	{
		GetDlgItemText(IDC_EDIT_USER,username);
		if(username.IsEmpty())
		{
			AddMsg(MiniCT_1902, M_ERROR); //请输入用户名
			return;
		}
		int iStateE = ((CButton * )GetDlgItem(IDC_RADIO_E))->GetCheck();
		int iStateI = ((CButton * )GetDlgItem(IDC_RADIO_I))->GetCheck();
/*		if(iStateE == 0 && iStateI == 0)
		{
			AddMsg("请选择一种注册方式",M_ERROR);
			return;
		}
		CString sInfo;
		if(iStateE == 1)
		{
			sInfo.Format("您确信要注册为企业版用户吗?");
			bE = TRUE;
		}
		else if(iStateI == 1)
		{
			sInfo.Format("您确信要注册为个人版用户吗?");
			bE = FALSE;
		}
*/		
		if(MessageBox(MiniCT_1903, //您确信要注册吗?
			MiniCT_1904,MB_ICONQUESTION | MB_YESNO) == IDYES ) //注册提示
		{
			//生成注册文件
			RegReq regReq;
			regReq.RegType = bE;
			strncpy(regReq.UserName,username,18);

			CString strHard = GetMachineCode();
			strncpy(regReq.Mac, strHard, 42);
//			strHard = "机器码:" + strHard;
//			AddMsg(strHard);

			//加载公要(个人版)
			char outMsg[100] = {0};
			char McR[2048] ={0};
			DWORD len = 2048;
			if(!CEvp::RSAPubEnc((BYTE *)Key,dlenKey,"",
				(BYTE *)&regReq,sizeof(regReq),(BYTE *)McR,len,outMsg))
			{
				AddMsg(outMsg,M_ERROR);
			}
			else
			{
				CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
				CFile MciFile; //注册请求 *.mci
				CString strReq;
				strReq.Format("%s\\%s.mreq", ((CMiniCaApp *)AfxGetApp())->GetAppPath(), username);
				if(MciFile.Open(strReq,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite))
				{
					MciFile.Write(strReg.GetBuffer(0),strReg.GetLength());
					MciFile.Close();
				}
				else
					AddMsg("保存文件失败");
				//保存注册文件,在邮寄时候检测是否有此文件
				m_ReqFile = strReq;

				strReq += MiniCT_1900;
				AddMsg(strReq);
				//发送
			//	SendMail();
			}
			return;
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -