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

📄 safedatasetpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	//创建信息颈
	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 + -