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

📄 chaogedlg.cpp

📁 编写一个电子签名的小程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    bi.hwndOwner = this->m_hWnd;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = displayname;
    bi.lpszTitle = "请选择要保存接收数据的文件夹";
    bi.ulFlags = BIF_EDITBOX ;
    bi.lpfn = NULL;
	
    pidlBrowse=SHBrowseForFolder( &bi);
    if(pidlBrowse!=NULL)
    {
        SHGetPathFromIDList(pidlBrowse,path);
    }
	
    CString str=path;	//得到路径
    if(str.IsEmpty()) 
		return;			//如果没有选择,就返回
	
    m_strCurPath=str;   //接收路径编辑框对应变量
    UpdateData(FALSE);    
	
}

/*------------------------------------------------------------------*/
/*  日期:      2008-6-5                                            */
/*                                                                  */
/*  用途与描述:选择文件,获得文件的路径								*/
/*------------------------------------------------------------------*/
void CChaogeDlg::OnButtonOpenfile() 
{	
	CFileDialog fileDlg(TRUE, "*.hex", "*.hex"); 
	if (fileDlg.DoModal() != IDOK) 
	{ 
		return; 
	} 
	SetDlgItemText(IDC_EDIT1_FILEADDR, fileDlg.GetPathName()); 
	
	free(fileDlg);
}
void CChaogeDlg::OnButtonExit() 
{
	CDialog::OnOK();
}

void CChaogeDlg::OnButtonComputecheck() 
{
	// TODO: Add your control notification handler code here
	UpdateData();  
	
    int LengthAll =0;
	
	LengthAll	= m_strCurPath.GetLength() * m_BeginAdd.GetLength() * m_BeginAdd.GetLength() * m_InsertAdd.GetLength();
	if(LengthAll == 0)
	{		
		MessageBox("请将信息填写完整!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}	 
	if ((m_BeginAdd.GetLength() != 4)
		||	(m_EndAdd.GetLength()   != 4)
		||	(m_InsertAdd.GetLength()!= 4)		
		)
	{		
		MessageBox("地址信息错误!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}
	ulBeginAddr = Os_ComputeAddr(m_BeginAdd)*2;
	ulEndAddr   = Os_ComputeAddr(m_EndAdd)*2;
	ulSignAddr  = Os_ComputeAddr(m_InsertAdd)*2;
	if (ulBeginAddr > ulEndAddr)
	{
		MessageBox("起始地址大于终止地址!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}
	// 0. 打开文件
	int ucRst=0;
	ucRst = Os_CheckFileExist(m_strCurPath);
	if(ucRst)
	{
		MessageBox("文件不存在!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}
	else
	{
		//按照行来读取数据:比较数据中的地址,符合条件取出数据;		
		ucRst = Os_ReadFileByString(m_strCurPath);
	}
	if(ucRst == 0XFE)
	{
		MessageBox("满足条件的数据为空!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}
	else
	if(ucRst)
	{
		MessageBox("文件打开失败!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}


	// 1. 把HEX文件中的部分或者全部代码用做一次SHA-1运算
	ulCmpLen = ulEndAddr - ulBeginAddr;	
	iSignFileLen = csSignFileBuff.GetLength();
	if (ulEndAddr >(unsigned  int) iSignFileLen)
	{
		ulCmpLen = iSignFileLen-ulBeginAddr;
	}
	
	unsigned char aucCompBuf[FILE_MAX_LEN],aucSHA1_Rst[25];
	UCHAR aucMidBuf[FILE_MAX_LEN];
	unsigned char Midtes[42];
	
	memset(Midtes,0,sizeof(Midtes));
	memset(aucMidBuf,0,sizeof(aucMidBuf));
	memset(aucCompBuf,0,sizeof(aucCompBuf));
	memset(aucSHA1_Rst,0,sizeof(aucSHA1_Rst));
	int uiII=0;
	for (uiII=0; uiII<csSignFileBuff.GetLength(); uiII++)
	{
		aucMidBuf[uiII] = (csSignFileBuff.GetBuffer(0))[uiII];
	}
	//memcpy(aucMidBuf,csSignFileBuff.GetBuffer(0), iSignFileLen);
	//strcpy(aucMidBuf, csSignFileBuff.GetBuffer());   
	//memcpy(aucCompBuf,&aucMidBuf[ulBeginAddr], ulCmpLen);
	asc_hex(aucCompBuf,ulCmpLen/2,(UCHAR*)&aucMidBuf[ulBeginAddr],ulCmpLen);
	SHA1_Compute(aucCompBuf,ulCmpLen/2,aucSHA1_Rst);
	hex_asc(Midtes,aucSHA1_Rst,40);
	m_Sha1Data = Midtes;   //接收路径编辑框对应变量	
	// 2. 把运算结果使用RSA加密得到一个签名	
/*-------------------------------------------------------------------------------
	unsigned char RSA_PublicDecrypt(
					unsigned char *pucPublicKey,unsigned int uiPublicKeyLen,
					unsigned char *pucPublicKeyExp,unsigned int uiPublicKeyExpLen,
					unsigned char *pucIn,unsigned int uiInLen,
					unsigned char *pucOut)
-------------------------------------------------------------------------------*/
	
	
	m_SignData = csSignFileBuff;
	csSignFileBuff.ReleaseBuffer();

    UpdateData(FALSE);   
}

void CChaogeDlg::OnButtonCreatesignfile() 
{
	// TODO: Add your control notification handler code here	
	CString SignName;
	char aucSignName[256],aucMid[64];
	int uiI=0,uiJ=0;


	UpdateData();
	int LengthAll = m_Sha1Data.GetLength();
	if(LengthAll == 0)
	{
		MessageBox("请计算电子签名!","警告:", MB_ICONWARNING | MB_OK);	 
		return;
	}

	memset(aucSignName,0,sizeof(aucSignName));
	memcpy(aucSignName,m_strCurPath.GetBuffer(0),m_strCurPath.GetLength());
	for (uiI=m_strCurPath.GetLength();  uiI > 0 ;  uiI--)
	{
		if (aucSignName[uiI] == '\\')
		{
			break;
		}
		uiJ++;
	}
	uiI++;
	// 将文件名前面增加:Sign_
	memset(aucMid,0,sizeof(aucMid));
	memcpy(aucMid,&aucSignName[uiI],uiJ);
	memcpy(&aucSignName[uiI],(char*)"Sign_",5);
	memcpy(&aucSignName[uiI+5],aucMid,uiJ);
	SignName=aucSignName;
	// 检查文件是否存在,如果存在则删除
	int iRst=Os_CheckFileExist(SignName);
	if(iRst == 0)
	{
		DeleteFile(SignName); 
	}
	// 打包签名文件
	UCHAR aucSignFileBuff[128];

	memcpy(&aucSignFileBuff[iSignFileLen],m_Sha1Data.GetBuffer(0),m_Sha1Data.GetLength());
	iSignFileLen = iSignFileLen+m_Sha1Data.GetLength();
	// 创建签名文件
	iRst = Os_CreatFile(SignName);
	if(iRst == 0)
	{
		iRst = Os_WriteFile(SignName, aucSignFileBuff,iSignFileLen);
	}
	if (iRst != 0)
	{
		MessageBox("电子签名失败!","提示:",MB_ICONWARNING | MB_OK);
		return;		
	}
	MessageBox("电子签名成功!","恭喜:",MB_ICONINFORMATION | MB_OK);	
	UpdateData(FALSE);
}

void CChaogeDlg::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_strCurPath = _T("");
	m_BeginAdd = _T("");
	m_EndAdd = _T("");
	m_InsertAdd = _T("");
	m_Sha1Data = _T("");
	m_SignData = _T("");

	m_RSAData= _T("");
	m_Mod= _T("");
	m_Key= _T("");
	
	UpdateData(FALSE);
}
/*-------------------------------------------------------------------------------
	unsigned char RSA_PublicDecrypt(
					unsigned char *pucPublicKey,unsigned int uiPublicKeyLen,
					unsigned char *pucPublicKeyExp,unsigned int uiPublicKeyExpLen,
					unsigned char *pucIn,unsigned int uiInLen,
					unsigned char *pucOut)
-------------------------------------------------------------------------------*/
void CChaogeDlg::OnButtonRsa() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	
	//获得KEY 和 MOD
	UCHAR aucModBuf[1024];
	UCHAR aucKeyBuf[128];
	UCHAR aucInDataBuf[40];
	UINT uiModLen,uiKeyLen;

	uiModLen = m_Mod.GetLength();
	uiKeyLen = m_Key.GetLength();
	if(uiKeyLen == 0 
	||uiModLen == 0)
	{
		MessageBox("KEY or Mod 数据为空!","提示:",MB_ICONWARNING | MB_OK);
		return;
	}
	if(uiModLen%128 != 0)
	{
		MessageBox("Mod 长度错误!","提示:",MB_ICONWARNING | MB_OK);
		return;
	}
	if((uiModLen%2 != 0)||(uiKeyLen%2 != 0))
	{
		MessageBox("KEY or Mod 长度错误!","提示:",MB_ICONWARNING | MB_OK);
		return;
	}
	//memcpy(aucModBuf,m_Mod.GetBuffer(0), uiModLen);
	//memcpy(aucKeyBuf,m_Key.GetBuffer(0), uiKeyLen);
	asc_hex(aucInDataBuf,20,(UCHAR*)m_Sha1Data.GetBuffer(0),40);
	asc_hex(aucModBuf,uiModLen/2,(UCHAR*)m_Mod.GetBuffer(0),uiModLen);
	asc_hex(aucKeyBuf,uiKeyLen/2,(UCHAR*)m_Key.GetBuffer(0),uiKeyLen);
	uiModLen = uiModLen/2;
	uiKeyLen = uiKeyLen/2;

	//获得加密解密数据
	UCHAR aucOutBuf[128],aucOutMid[257];
	UINT  uiInDataLen=0;

	memset(aucOutBuf,0,sizeof(aucOutBuf));
	memset(aucInDataBuf,0,sizeof(aucInDataBuf));
	memset(aucOutMid,0,sizeof(aucOutMid));
	//memcpy(aucInDataBuf,m_RSAData.GetBuffer(0),20)
	asc_hex(aucInDataBuf,20,(UCHAR*)m_Sha1Data.GetBuffer(0),40);
	uiInDataLen = 20;
	
	//RSA加密解密
	RSA_PublicDecrypt(aucModBuf,   uiModLen,
					aucKeyBuf,   uiKeyLen,  					
					aucInDataBuf,  uiInDataLen,
					aucOutBuf);
	UINT len;
	len = 256;
	hex_asc(aucOutMid,aucOutBuf,len);
	m_RSAData = aucOutMid;	
	UpdateData(FALSE);
}

⌨️ 快捷键说明

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