📄 safedatasetpage.cpp
字号:
BOOL bRet = TRUE;
CFile File;
if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
{
outMsg.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败
return FALSE;
}
EVP_CIPHER_CTX Ctx, CtxTemp;
if(!CEvp::InitCrypt2(strCpName, strPwd, 0, Ctx))
{
outMsg = MiniCT_1314;//"初始化加密结构失败";
File.Close();
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::Crypt2(&CtxTemp, strPathName,
File, pDataSafe->dNewLen, outMsg);
if(-1 == dOutLen)
{
bRet = FALSE;
break;
}
else if(dOutLen != pDataSafe->dOldLen)
{
outMsg.Format("%s%s", strPathName, MiniCT_1321); //文件大小校验失败
bRet = FALSE;
break;
}
}
else//目录 ->建立目录
{
if(!Mdir(strPathName, outMsg))
{
bRet = FALSE;
break;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
File.Close();
CleanList(&DataList);
CEvp::CleanCrypt2(Ctx);
return bRet;
}
//数集摘要
//参数: strMdName - 摘要算法名称
// strOutName - 保存结果的EVP文件名称
// outMsg - 返回操作信息
BOOL CSafeDataSetPage::Digest(CString strMdName, CString strOutName, CString & outMsg)
{
//输入检查
if(strMdName.IsEmpty() || strOutName.IsEmpty())
{
outMsg = MiniCT_1322;//"算法名称或输出文件非法";
return FALSE;
}
CFile File;//文件头加版本信息
if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
{
outMsg = MiniCT_1313;//"创建文件失败";
return FALSE;
}
int nCount = m_DataSetList.GetCount();
DWORD dFileInfoLen = 0;
//创建信息头
if(!MadeFileHead(File, nCount, dFileInfoLen, outMsg))
return FALSE;
DWORD dOutLen = -1;
EVP_MD_CTX mdCtx, mdCtxTemp;
//初始化CTX
CEvp::InitDigest2(strMdName, mdCtx);
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList;
EnumList(&DataList);
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)
{
if(pDataSafe->bIsFile) //文件则加密
{
mdCtxTemp = mdCtx;
//结构中加密起始位置赋值
pDataSafe->dBeginSeek = File.GetPosition();
dOutLen = CEvp::Digest2(&mdCtxTemp, pDataSafe->cPathName, File, outMsg);
if(dOutLen == -1)
{
CString str;
str.Format("%s%s", MiniCT_1323, pDataSafe->cName); //摘要文件失败
outMsg = str;
File.Close();
CleanList(&DataList);
return FALSE;
}
else//结构赋值
{
pDataSafe->dNewLen = dOutLen;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
//创建信息颈
if(!MadeFileNeck(&DataList, File, DIGEST, nCount, dFileInfoLen, outMsg))
{
File.Close();
CEvp::CleanDigest2(mdCtx);
CleanList(&DataList);
return FALSE;
}
File.Close();
CEvp::CleanDigest2(mdCtx);
CleanList(&DataList);
return TRUE;
}
//摘要验证
BOOL CSafeDataSetPage::VerifyDigest(CString strMdName, CString strEvpFile, CString & outStr)
{
EVP_MD_CTX mdCtx, mdCtxTemp;
//解密信息
BOOL bRet = TRUE;
CFile File;
if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
{
outStr.Format("%s%s", MiniCT_1320, strEvpFile); //打开文件失败
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);
//初始化CTX
CEvp::InitDigest2(strMdName, mdCtx);
{
File.Close();
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) //文件
{
//结构中加密起始位置赋值
mdCtxTemp = mdCtx;
File.Seek(pDataSafe->dBeginSeek, CFile::begin);
bRet = CEvp::VerifyDigest2(&mdCtxTemp, strPathName, File, pDataSafe->dNewLen, outStr);
}
m_ProgAll.SetPos(++iFinish);
}
}
CleanList(&DataList);
File.Close();
CEvp::CleanDigest2(mdCtx);
return bRet;
}
//数字签名
BOOL CSafeDataSetPage::Sign(CString strMdName, const BYTE * pCertBuf, const UINT nCertLen, CString strPwd,
CString strOutName, CString & outStr)
{
EVP_MD_CTX md_Ctx = {0};
EVP_PKEY * pkey = NULL;
X509 * px509 = NULL;
CEvp::InitSign2(strMdName, md_Ctx, (char *)pCertBuf, nCertLen, strPwd, px509, pkey);
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 ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
AddOnceMsg(strInfo);
pDataSafe->dBeginSeek = File.GetPosition();
dOutLen = CEvp::Sign2(&md_Ctx, pkey, pDataSafe->cPathName, File, outStr);
if(dOutLen == -1)
{
CString str;
str.Format("%s%s, %s%s", MiniCT_1324, 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, SIGN, nCount, dFileInfoLen, outStr))
{
File.Close();
CleanList(&DataList);
CEvp::CleanSign2(md_Ctx, px509, pkey);
return FALSE;
}
CEvp::CleanSign2(md_Ctx, px509, pkey);
File.Close();
CleanList(&DataList);
return TRUE;
}
//验证数字签名
BOOL CSafeDataSetPage::VerifySign(CString strMdName, const BYTE * pCertBuf, const UINT nCertLen,
CString strEvpFile, CString & outStr)
{
EVP_MD_CTX mdCtx = {0},
mdCtxTemp = {0};
EVP_PKEY * pkey = NULL;
X509 * px509 = NULL;
BOOL bRet = TRUE;
CFile File;
if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
{
outStr.Format("%s%s", MiniCT_1320, strEvpFile);//"打开文件失败%s"
return FALSE;
}
CEvp::InitSign2(strMdName, mdCtx, (char *)pCertBuf, nCertLen, NULL, px509, pkey);
// 文件版本标记 - 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);
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) //文件
{
//结构中加密起始位置赋值
mdCtxTemp = mdCtx;
File.Seek(pDataSafe->dBeginSeek, CFile::begin);
bRet = CEvp::VerifySign2(&mdCtxTemp, pkey, strPathName, File, pDataSafe->dNewLen, outStr);
}
m_ProgAll.SetPos(++iFinish);
}
}
CleanList(&DataList);
File.Close();
CEvp::CleanDigest2(mdCtx);
return TRUE;
}
//功能:多证书数字信封
//参数:
// pCERT -- [in]合法用户公钥链
// strCpName -- 算法名称
// outMsg -- [OUT]返回错误信息
BOOL CSafeDataSetPage::Seal(CEvp::stuCertLink * pCERT, CString strCpName,
CString strOutName, CString & outMsg)
{
CFile File;//文件头加版本信息
if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
{
outMsg.Format("%s%s", MiniCT_1313, strOutName);//"创建文件失败%s"
return FALSE;
}
int nCount = m_DataSetList.GetCount();
DWORD dFileInfoLen = 0;
//创建信息头
if(!MadeFileHead(File, nCount, dFileInfoLen, outMsg))
{
File.Close();
return FALSE;
}
DWORD dOutLen = -1;
EVP_CIPHER_CTX eCtx, eCtxTemp;
//初始化CTX
if(!CEvp::InitSeal2(pCERT, strCpName, File, eCtx, outMsg))
{
File.Close();
return FALSE;
}
//枚举目录列表加密信息
CList<CDataSafe *, CDataSafe *> DataList;
EnumList(&DataList);
POSITION pos = DataList.GetHeadPosition();
int iCount = DataList.GetCount();
m_ProgAll.SetRange(0, iCount);
int iFinish = 0;
CString strInfo;
// CDC* pDC = m_DataSetList.GetDC();
while(pos != NULL)
{
// m_DataSetList.DrawProgressBar(pDC, 0, 2);
CDataSafe* pDataSafe = DataList.GetNext(pos);
if(pDataSafe)
{
if(pDataSafe->bIsFile) //文件则加密
{
//初始化CTX
// strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
AddOnceMsg(strInfo);
eCtxTemp = eCtx;
//结构中加密起始位置赋值
pDataSafe->dBeginSeek = File.GetPosition();
dOutLen = CEvp::Seal2(&eCtxTemp, pDataSafe->cPathName, File, outMsg);
if(dOutLen == -1)
{
CString str;
str.Format("%s%s, %s%s", MiniCT_1325, pDataSafe->cName, MiniCT_1319, outMsg);//"封装文件失败%s, 失败原因:%s"
outMsg = str;
File.Close();
CleanList(&DataList);
return FALSE;
}
else//结构赋值
{
pDataSafe->dNewLen = dOutLen;
}
}
m_ProgAll.SetPos(++iFinish);
}
}
// m_DataSetList.ReleaseDC(pDC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -