📄 safedatasetpage.cpp
字号:
//创建信息颈
if(!MadeFileNeck(&DataList, File, SEAL, nCount, dFileInfoLen, outMsg))
{
File.Close();
CEvp::CleanSeal2(eCtx);
CleanList(&DataList);
return FALSE;
}
File.Close();
CEvp::CleanSeal2(eCtx);
CleanList(&DataList);
return TRUE;
}
//拆封数字信封
BOOL CSafeDataSetPage::OpenSeal(char * pKey, UINT ukeyLen, char * pwd, CString strCpName,
CString strEvpFile, CString & outStr)
{
//解密信息
DWORD dOutLen = -1;
BOOL bRet = TRUE;
CFile File;
if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
{
outStr.Format("%s%s", MiniCT_1320, strEvpFile);//"打开文件%s失败"
return FALSE;
}
// 文件版本标记 - Evp20
// 信息颈长度 - DWORD
// 信息颈长度CRC码 - UINT
File.Seek(strlen(m_sHeadMark), CFile::begin);
DWORD dFileInfoLen = 0;
File.Read(&dFileInfoLen, sizeof(DWORD));
File.Seek(sizeof(UINT), CFile::current);
File.Seek(dFileInfoLen, CFile::current);
EVP_CIPHER_CTX Ctx, CtxTemp;
if(!CEvp::InitOpenSeal2(pKey, ukeyLen, pwd, strCpName, File, Ctx, outStr))
{
File.Close();
outStr.Format(MiniCT_1314);//"初始化加密结构失败"
return FALSE;
}
CString strPathName;
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
EnumList(&DataList, &DirList);
POSITION pos = DataList.GetHeadPosition();
int iCount = DataList.GetCount();
m_ProgAll.SetRange(0, iCount);
int iFinish = 0;
while(pos != NULL)
{
CDataSafe* pDataSafe = DataList.GetNext(pos);
if(pDataSafe)
{
strPathName = GetPathName(pDataSafe, &DirList);
if(pDataSafe->bIsFile) //文件
{
//结构中加密起始位置赋值
CtxTemp = Ctx;
File.Seek(pDataSafe->dBeginSeek, CFile::begin);
dOutLen = CEvp::OpenSeal2(CtxTemp, File, pDataSafe->dNewLen, strPathName, outStr);
if(-1 == dOutLen)
{
bRet = FALSE;
break;
}
else if(dOutLen != pDataSafe->dOldLen)
{
outStr.Format("%s%s", MiniCT_1321, strPathName);//文件%s大小校验失败
bRet = FALSE;
break;
}
}
else//目录 ->建立目录
{
if(!Mdir(strPathName, outStr))
{
bRet = FALSE;
break;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
CleanList(&DataList);
File.Close();
CEvp::CleanOpenSeal2(Ctx);
return bRet;
}
//公钥加密
BOOL CSafeDataSetPage::RSAPubEnc(const BYTE * pCertBuf, const UINT nCertLen,
CString strOutName, CString & outStr)
{
RSA * pRsa = NULL;
if(!CEvp::GetPubRsa(pCertBuf, nCertLen,pRsa))
{
outStr.Format("%s", MiniCT_1326); //取得公钥RSA结构失败
return FALSE;
}
CFile File;//文件头加版本信息
if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
{
outStr.Format("%s%s", MiniCT_1313, strOutName);//创建文件失败%s
return FALSE;
}
int nCount = m_DataSetList.GetCount();
DWORD dFileInfoLen = 0;
//创建信息头
if(!MadeFileHead(File, nCount, dFileInfoLen, outStr))
{
File.Close();
return FALSE;
}
DWORD dOutLen = -1;
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList;
EnumList(&DataList);
POSITION pos = DataList.GetHeadPosition();
int iCount = DataList.GetCount();
m_ProgAll.SetRange(0, iCount);
int iFinish = 0;
CString strInfo;
while(pos != NULL)
{
CDataSafe* pDataSafe = DataList.GetNext(pos);
if(pDataSafe)
{
if(pDataSafe->bIsFile) //文件则加密
{
//结构中加密起始位置赋值
strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
// strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
AddOnceMsg(strInfo);
pDataSafe->dBeginSeek = File.GetPosition();
dOutLen = CEvp::RSAPubEnc2(pRsa, pDataSafe->cPathName, File, outStr);
if(dOutLen == -1)
{
CString str;
str.Format("%s%s%s%s", MiniCT_1327, pDataSafe->cName, MiniCT_1319, outStr); //公钥加密文件失败%s,失败原因:%s
outStr = str;
File.Close();
CleanList(&DataList);
return FALSE;
}
else//结构赋值
{
pDataSafe->dNewLen = dOutLen;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
//创建信息颈
if(!MadeFileNeck(&DataList, File, PubEnc, nCount, dFileInfoLen, outStr))
{
CleanList(&DataList);
File.Close();
CEvp::FreeRsa(pRsa);
return FALSE;
}
CEvp::FreeRsa(pRsa);
CleanList(&DataList);
File.Close();
return TRUE;
}
//私钥解密
BOOL CSafeDataSetPage::RSAPriDec(const BYTE * pCertBuf, const UINT nCertLen, CString strPwd, CString strEvpFile,
CString & outStr)
{
RSA * pRsa = NULL;
if(!CEvp::GetPrivRsa(pCertBuf, nCertLen, strPwd, pRsa))
{
outStr.Format("%s", MiniCT_1326);//"取得私钥RSA结构失败"
return FALSE;
}
DWORD dOutLen = -1;
BOOL bRet = TRUE;
CFile File;
if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
{
outStr.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败%s
return FALSE;
}
CString strPathName;
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
EnumList(&DataList, &DirList);
POSITION pos = DataList.GetHeadPosition();
int iCount = DataList.GetCount();
m_ProgAll.SetRange(0, iCount);
int iFinish = 0;
while(pos != NULL)
{
CDataSafe* pDataSafe = DataList.GetNext(pos);
if(pDataSafe)
{
strPathName = GetPathName(pDataSafe, &DirList);
if(pDataSafe->bIsFile) //文件
{
File.Seek(pDataSafe->dBeginSeek, CFile::begin);
dOutLen = CEvp::RSAPrivDec2(pRsa, File, pDataSafe->dNewLen, strPathName, outStr);
if(-1 == dOutLen)
{
bRet = FALSE;
break;
}
else if(dOutLen != pDataSafe->dOldLen)
{
outStr.Format("%s%s", MiniCT_1321, strPathName);
bRet = FALSE;
break;
}
}
else//目录 ->建立目录
{
if(!Mdir(strPathName, outStr))
{
bRet = FALSE;
break;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
CleanList(&DataList);
CEvp::FreeRsa(pRsa);
File.Close();
return bRet;
}
//私钥加密
BOOL CSafeDataSetPage::RSAPrivEnc(const BYTE * pCertBuf, const UINT nCertLen, CString strPwd,
CString strOutName, CString & outStr)//私钥加密
{
RSA * pRsa = NULL;
if(!CEvp::GetPrivRsa(pCertBuf, nCertLen, strPwd, pRsa))
{
outStr.Format("%s", MiniCT_1326);//"取得私钥RSA结构失败"
return FALSE;
}
CFile File;//文件头加版本信息
if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
{
outStr.Format("%s%s", MiniCT_1313, strOutName);
return FALSE;
}
int nCount = m_DataSetList.GetCount();
DWORD dFileInfoLen = 0;
//创建信息头
if(!MadeFileHead(File, nCount, dFileInfoLen, outStr))
{
File.Close();
return FALSE;
}
DWORD dOutLen = -1;
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList;
EnumList(&DataList);
POSITION pos = DataList.GetHeadPosition();
int iCount = DataList.GetCount();
m_ProgAll.SetRange(0, iCount);
int iFinish = 0;
CString strInfo;
while(pos != NULL)
{
CDataSafe* pDataSafe = DataList.GetNext(pos);
if(pDataSafe)
{
if(pDataSafe->bIsFile) //文件则加密
{
//结构中加密起始位置赋值
strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
// strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
AddOnceMsg(strInfo);
pDataSafe->dBeginSeek = File.GetPosition();
dOutLen = CEvp::RSAPrivEnc2(pRsa, pDataSafe->cPathName, File, outStr);
if(dOutLen == -1)
{
CString str;
str.Format("%s%s%s%s", MiniCT_1328, pDataSafe->cName, MiniCT_1319, outStr);//私钥加密文件失败%s, 失败原因:%s
outStr = str;
File.Close();
CleanList(&DataList);
return FALSE;
}
else//结构赋值
{
pDataSafe->dNewLen = dOutLen;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
//创建信息颈
if(!MadeFileNeck(&DataList, File, PrivEnc, nCount, dFileInfoLen, outStr))
{
File.Close();
CleanList(&DataList);
CEvp::FreeRsa(pRsa);
return FALSE;
}
CEvp::FreeRsa(pRsa);
File.Close();
CleanList(&DataList);
return TRUE;
}
//公钥解密
BOOL CSafeDataSetPage::RSAPubDec(const BYTE * pCertBuf, const UINT nCertLen, CString strEvpFile,
CString & outStr)
{
RSA * pRsa = NULL;
if(!CEvp::GetPubRsa(pCertBuf, nCertLen, pRsa))
{
outStr.Format("%s", MiniCT_1326);
return FALSE;
}
DWORD dOutLen = -1;
BOOL bRet = TRUE;
CFile File;
if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
{
outStr.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败%s
return FALSE;
}
CString strPathName;
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
EnumList(&DataList, &DirList);
POSITION pos = DataList.GetHeadPosition();
int iCount = DataList.GetCount();
m_ProgAll.SetRange(0, iCount);
int iFinish = 0;
while(pos != NULL)
{
CDataSafe* pDataSafe = DataList.GetNext(pos);
if(pDataSafe)
{
strPathName = GetPathName(pDataSafe, &DirList);
if(pDataSafe->bIsFile) //文件
{
File.Seek(pDataSafe->dBeginSeek, CFile::begin);
dOutLen = CEvp::RSAPubDec2(pRsa, File, pDataSafe->dNewLen, strPathName, outStr);
if(-1 == dOutLen)
{
CString str;
str.Format("%s%s%s%s", MiniCT_1329, pDataSafe->cPathName, MiniCT_1319, outStr);//公钥解密文件失败%s, 失败原因:%s
outStr = str;
bRet = FALSE;
break;
}
else if(dOutLen != pDataSafe->dOldLen)
{
outStr.Format("%s%s", MiniCT_1321, strPathName);
bRet = FALSE;
break;
}
}
else//目录 ->建立目录
{
if(!Mdir(strPathName, outStr))
{
bRet = FALSE;
break;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
CleanList(&DataList);
CEvp::FreeRsa(pRsa);
File.Close();
return bRet;
}
////////////////////////////////////////////////加密部分结束///////////////////////////////////////////////////
void CSafeDataSetPage::OnDblclkListDataset(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
//双击,如果是未加密的,则打开LIST中目录,文件则打开文件
//如果是加密的,就解密到临时目录,并打开
int nIndex = m_DataSetList.GetSelectedItem();
if(nIndex == -1)
return;
CSuperGridCtrl::CTreeItem * pItem = m_DataSetList.GetTreeItem(nIndex);
if(!pItem)
return;
CItemInfo * pInfo = m_DataSetList.GetData(pItem );
const CDataSafe * pDataSafe = pInfo->GetDataSafe();
if(pDataSafe == NULL)
return;
if(pDataSafe->bIsFile) //执行
{
CString strOut;
CString strPathName;
BOOL bSucceed = TRUE;
if(m_bIsEnc) //未加密文件
{
strPathName.Format("%s", pDataSafe->cPathName);
}
else //解密到临时目录
{
//取得临时路径
TCHAR szTempPath[MAX_PATH];
DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath);
ASSERT (dwResult);
//创建临时文件
// TCHAR szTempFile[MAX_PATH];
// UINT nResult = GetTempFileName (szTempPath, _T ("~mc"), 0, szTempFile);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -