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

📄 safedatasetpage.cpp

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

	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 + -