📄 chaogedlg.cpp
字号:
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 + -