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

📄 safedatasetpage.cpp

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

#include "stdafx.h"
#include "minica.h"
#include "SafeDataSetPage.h"
#include "MiniMainDlg.h"
#include "Evp.h"
#include "rc.h"
#include ".\GenericClass\Language.h"
#include "minict.h"

const UINT BUFLEN = 4096;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//加密后文件格式如下
/*
------------------------------------信息头开始-------------------------------------------------
文件版本标记 - Evp20
信息颈长度 - DWORD
信息颈长度CRC码 - UINT
------------------------------------信息颈开始-------------------------------------------------
信息颈内容  处理方式 公钥加密
             包括:
			      加密方式 ENUM
				  信息体个数n INT
			      n个信息体CDataSafe

---------------------------------对于数字信封:这里还要附加-------------------------------------
			------------------------EVP信息头开始----------------------------------
//			加密后EVP信息颈长度	DWORD
//			加密后EVP信息颈长度 CRC校验码	UINT
//			加密后EVP信息颈
//			-------------------------------EVP信息颈开始---------------------------
//			公钥个数n
//			n个
//				公钥加密的对称密钥长度
//				公钥加密的对称密钥内容
//			向量IV
//			-------------------------------EVP信息颈结束---------------------------
------------------------------------------------------------------------------------------------
------------------------------------n个加密文件内容开始------------------------------------------------
************************************************************************************************
************************************************************************************************
************************************************************************************************
************************************************************************************************
************************************************************************************************
------------------------------------n个加密文件内容结束------------------------------------------------


*/

/////////////////////////////////////////////////////////////////////////////
// CSafeDataSetPage property page
const char m_sHeadMark[6] = "Evp20";
CProgressCtrlST * CSafeDataSetPage::m_pProgOne = NULL;

IMPLEMENT_DYNCREATE(CSafeDataSetPage, CPropertyPage)

CSafeDataSetPage::CSafeDataSetPage() : CPropertyPage(CSafeDataSetPage::IDD)
{
	//{{AFX_DATA_INIT(CSafeDataSetPage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_uIndex = 0;
	m_EncType = NONE;
	m_bIsEnc = TRUE;
	m_pParent = NULL;
	m_pPageCdb = NULL;
}

CSafeDataSetPage::~CSafeDataSetPage()
{
	m_Image.Detach();
}

void CSafeDataSetPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSafeDataSetPage)
//	DDX_Control(pDX, IDC_EDIT_PWD, m_XpEditPwd);
	DDX_Control(pDX, IDC_B_ENC, m_BEnc);
	DDX_Control(pDX, IDC_PROGRESS_ALL, m_ProgAll);
	DDX_Control(pDX, IDC_PROGRESS_ONE, m_ProgOne);
	DDX_Control(pDX, IDC_LIST_DATASET, m_DataSetList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSafeDataSetPage, CPropertyPage)
	//{{AFX_MSG_MAP(CSafeDataSetPage)
	ON_NOTIFY(NM_RCLICK, IDC_LIST_DATASET, OnRclickListDataset)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_DATASET, OnDblclkListDataset)
	ON_BN_CLICKED(IDC_B_ENC, OnBEnc)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
	ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
	ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_DATASET, OnKeydownListDataset)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_NOTIFY(HDN_BEGINDRAG, IDC_LIST_DATASET, OnBegindragListDataset)
	ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_DATASET, OnBegindragListDataset)
	//}}AFX_MSG_MAP
	ON_MESSAGE(DROPM_DROPOK, OnDropOk)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSafeDataSetPage message handlers
CWinThread	* pThreadEvpSet = NULL;		
UINT _EvpSetThread(LPVOID lparam)
{
	CSafeDataSetPage * p=(CSafeDataSetPage *)lparam;
	((CMiniMainDlg *)p->GetParentWnd())->SetItemIcon(MiniCT_0002,16);
	
	
	//解决XP进度条不刷新问题
	//解决方法,刷新父窗口
	p->m_ProgOne.SetPos(0);
	//得到进度条控件区域
	CRect rectProg;
	p->m_ProgOne.GetWindowRect(&rectProg);
	p->ScreenToClient(rectProg);//
	
	  //指定父窗口刷新区域
	p->InvalidateRect(rectProg, TRUE);

	if(p->GetIsEnc())//加密
	{
		switch(p->m_EncType)
		{
		case CSafeDataSetPage::NONE:
			break;
		case CSafeDataSetPage::CRYPT:
			p->DoCrypt();
			break;
		case CSafeDataSetPage::DIGEST:
			break;
		case CSafeDataSetPage::SIGN:
			p->DoSign();
			break;
		case CSafeDataSetPage::SEAL:
			p->DoSeal();
			break;
		case CSafeDataSetPage::PubEnc:
			p->DoRSAPubEnc();
			break;
		case CSafeDataSetPage::PrivEnc:
			p->DoRSAPrivEnc();
			break;
		default:
			break;
		}
	}
	else	//解密
	{
		switch(p->m_EncType)
		{
		case CSafeDataSetPage::NONE:
			break;
		case CSafeDataSetPage::CRYPT:
			p->DoDecCrypt();
			break;
		case CSafeDataSetPage::DIGEST:
			break;
		case CSafeDataSetPage::SIGN:
			break;
		case CSafeDataSetPage::SEAL:
			p->DoOpenSeal();
			break;
		case CSafeDataSetPage::PubEnc:
			p->DoRSAPriDec();
			break;
		case CSafeDataSetPage::PrivEnc:
			p->DoRSAPubDec();
			break;
		default:
			break;
		}
	}
	
	((CMiniMainDlg *)p->GetParentWnd())->SetItemIcon(MiniCT_0002, 4);
	return 0;
}

BOOL CSafeDataSetPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// TODO: Add extra initialization here
	CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
	m_BEnc.SetIcon(IDI_ICON_DENC);
	m_BEnc.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

	if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
	{
//		m_Progress.SetBitmap(IDB_BITMAP_PROG);
		ClassXP(GetDlgItem(IDC_COMBO_CRYPT)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_RADIO1)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_RADIO2)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_RADIO3)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_RADIO4)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_RADIO5)->m_hWnd,TRUE);
		ClassXP(GetDlgItem(IDC_RADIO6)->m_hWnd,TRUE);
	}


	//初始化图像列表
	SHFILEINFO shfi = {0};

	HIMAGELIST m_hImlIcons = (HIMAGELIST)SHGetFileInfo(NULL, 0, 
			&shfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
	//得到系统ImageList
	//以后通过得到文件的图标索引添加图标

	m_Image.Attach(m_hImlIcons);

	m_DataSetList.SetImageList(&m_Image, LVSIL_SMALL);

	m_DataSetList.SetExtendedStyle(LVS_EX_GRIDLINES);

	m_DataSetList.InsertColumn(0, MiniCT_1300, LVCFMT_LEFT, 150);
	m_DataSetList.InsertColumn(1, MiniCT_1301, LVCFMT_LEFT, 75);
	m_DataSetList.InsertColumn(2, MiniCT_1302, LVCFMT_LEFT, 70);
	m_DataSetList.InsertColumn(3, MiniCT_1303, LVCFMT_LEFT, 70);
	m_DataSetList.InsertColumn(4, MiniCT_1304, LVCFMT_LEFT, 100);
//	m_DataSetList.InsertColumn(3, "进度", LVCFMT_LEFT, 100);

	SetDlgItemText(IDC_COMBO_CRYPT,"idea-cbc");
	SetDlgItemText(IDC_EDIT_PWD,"MiniCA");
	((CComboBox *)GetDlgItem(IDC_COMBO_CRYPT))->SetCurSel(16);
	((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(1);

	m_pParent = AfxGetMainWnd();

	CSafeDataSetPage::m_pProgOne = &m_ProgOne;
	
	m_Target.Reg(this, "SafeData");

	CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
	if(pMain)
	{
		CWinEvpSheet * pSheet = (CWinEvpSheet *)(pMain->GetPage("CWinEvpSheet"));
		if(pSheet)
			m_pPageCdb = (CSafeDataCdbPage*)pSheet->GetPage("CSafeDataCdbPage");
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

/*
函数功能:向列表中添加记录
strDataSet - 记录名称
strFileLen - 记录大小
strDate - 修改时间
uImage - 显示的图像索引
pParent - 父节点句柄,NULL表示添加为根节点
*/
CSuperGridCtrl::CTreeItem * CSafeDataSetPage::AddDataSet(const CDataSafe * pDataSafe,
														 const CString strDataSet, 
														 const UINT uImage,
														 const DWORD & dOldLen, 
														 const DWORD dNewLen, 
														 CString strType,
														 CString strTime,
														 CSuperGridCtrl::CTreeItem * pParent)
{
	CString strOldLen(""), strNewLen("");
	strOldLen.Format("%d", dOldLen);
	if(dNewLen != 0 )
		strNewLen.Format("%d", dNewLen);

	CItemInfo* lpItemInfo = new CItemInfo();
	lpItemInfo->SetDataSafe(pDataSafe);
	lpItemInfo->SetImage(uImage);
	lpItemInfo->SetItemText(strDataSet);
	lpItemInfo->AddSubItemText(strOldLen);		//原始大小
	lpItemInfo->AddSubItemText(strNewLen);		//加密后大小
	lpItemInfo->AddSubItemText(strType);	//类型说明
	lpItemInfo->AddSubItemText(strTime);	//修改时间

	if(!pParent)
	{
//		lpRoot->m_uIndex = m_uIndex + 1;
		return m_DataSetList.InsertRootItem(lpItemInfo);//previous on N.Y.P.D we call it CreateTreeCtrl(lp)
	}
	else
	{
//		lpItemInfo->m_uIndex = m_uIndex + 1;
		return m_DataSetList.InsertItem(pParent, lpItemInfo, FALSE);
	}
}

//添加文件到结构MAP
//枚举到文件时候的操作
void CSafeDataSetPage::AddFileList(const WIN32_FIND_DATA & FileData, 
								   CSuperGridCtrl::CTreeItem * hPitem,
								   const UINT uTempParent,
								   CString sFile,
								   DWORD & dFileLen)
{

	SHFILEINFO sfi = {0};
	SHGetFileInfo(FileData.cFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
		sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
	
	//ftLastWriteTime
	
	SYSTEMTIME stime;
	FILETIME ftime; 
	FileTimeToLocalFileTime(&FileData.ftLastWriteTime, &ftime); // 转换成本地时间 
	FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
	
	//文件大小
  //  StrFormatByteSize(rFind.nFileSizeLow, szFileLen, 64 );

	dFileLen = (FileData.nFileSizeHigh * (MAXDWORD+1)) + FileData.nFileSizeLow;
	
	//时间
	CString strTime;
	strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);

	CDataSafe DataSafe(FileData.cFileName, dFileLen, 
		FileData.ftLastWriteTime, TRUE, uTempParent, sFile.GetBuffer(0));

	AddDataSet(&DataSafe, FileData.cFileName, sfi.iIcon, dFileLen, 0, sfi.szTypeName, strTime, hPitem);
	
//	++m_uIndex; 
	
}

BOOL CSafeDataSetPage::AddList(CString sLocalDir, UINT uPid, 
							   CSuperGridCtrl::CTreeItem * hPitem)
{
    POSITION pos = m_DirName.GetHeadPosition();
    while ( NULL != pos )
    {
		if(m_DirName.GetNext(pos).Compare(sLocalDir) == 0)//重复
			return TRUE;
    }
	m_DirName.AddHead(sLocalDir);
	//判断是否为磁盘,如果为磁盘,则后面添加*.*
	if(sLocalDir.GetLength() == 3 && sLocalDir.Find(":") != -1)
		sLocalDir += "*.*";
	return EnumDir(sLocalDir, uPid, hPitem);
}

/*BOOL CSafeDataSetPage::GetDirTime(CString DirName, FILETIME &ftime, CString & strTime)
{
	FILETIME lpCreationTime; // 文件夹的创建时间 
	FILETIME lpLastAccessTime; // 对文件夹的最近访问时间 
	FILETIME lpLastWriteTime; // 文件夹的最近修改时间 
	// 打开文件夹
	HANDLE hDir = CreateFile (DirName, GENERIC_READ, 
		FILE_SHARE_READ|FILE_SHARE_DELETE, 
		NULL, OPEN_EXISTING, 
		FILE_FLAG_BACKUP_SEMANTICS, NULL); 

	if(INVALID_HANDLE_VALUE == hDir)
		return FALSE;
	// 获取文件夹时间属性信息
	SYSTEMTIME stime;

	if (GetFileTime(hDir, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime))
	{ 
		FileTimeToLocalFileTime(&lpLastWriteTime, &ftime); // 转换成本地时间 
		FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
	} 
	CloseHandle(hDir); // 关闭打开过的文件夹

	strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);

	return TRUE;
}*/


//枚举目录,如果是文件,直接添加到列表中
BOOL CSafeDataSetPage::EnumDir(CString strPath, UINT uPid, 
							   CSuperGridCtrl::CTreeItem * hPitem)
{
	DWORD dDirLen = 0;
	WIN32_FIND_DATA wfd = {0};

	HANDLE hFind = FindFirstFile (strPath, &wfd);
	BOOL bResult = (hFind == INVALID_HANDLE_VALUE) ? FALSE : TRUE;

	CSuperGridCtrl::CTreeItem *  pItem = NULL;
	UINT uTempParent = 0;

	CString strTime;
	SYSTEMTIME stime;
	FILETIME ftime; 

	while (bResult)
	{
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && wfd.cFileName[0] != '.' && wfd.cFileName[0] != '..')	// folder
		{
			SHFILEINFO sfi = {0};
			SHGetFileInfo (NULL, FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO),
						SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);

			FileTimeToLocalFileTime(&wfd.ftLastWriteTime, &ftime); // 转换成本地时间 
			FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式

			strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);

			CString strFileName = strPath;
			strFileName.Replace("*.*", wfd.cFileName);

			CDataSafe DataSafe(wfd.cFileName, 0, wfd.ftLastWriteTime, FALSE, uPid, strFileName);

			pItem = AddDataSet(&DataSafe, wfd.cFileName, sfi.iIcon, 0, 0, sfi.szTypeName, strTime, hPitem);

			uTempParent = ++m_uIndex;

			//进入目录
			CString strPathName = strPath;	//枚举此文件夹下面的所有内容
			strPathName.Replace("*.*", wfd.cFileName);
			strPathName += "\\*.*";
			EnumDir(strPathName, uTempParent, pItem);
		}
		bResult = FindNextFile (hFind, &wfd);
	}
	FindClose (hFind);

	// read files
	hFind = FindFirstFile (strPath, &wfd);
	bResult = (hFind == INVALID_HANDLE_VALUE) ? FALSE : TRUE;

	while (bResult)
	{
		if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && wfd.cFileName[0] != '.' && wfd.cFileName[0] != '\0')		// no folder or parent folder
		{
			CString strFileName = strPath;
			strFileName.Replace("*.*", wfd.cFileName);
			DWORD dFileLen = 0;
			AddFileList(wfd, hPitem, uPid, strFileName, dFileLen);
			dDirLen += dFileLen;
			//累加所有文件长度,然后显示在列表中,并修改父结构长度
		}
		bResult = FindNextFile (hFind, &wfd);
	}
	FindClose (hFind);
	CString str;
	str.Format("%d", dDirLen);
	if(hPitem)
	{
		int index = m_DataSetList.GetCurIndex(hPitem);
		if(index != -1)
			m_DataSetList.SetItemText(index, 1, str);
	}


	return bResult;
}


void CSafeDataSetPage::OnRclickListDataset(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int i = m_DataSetList.GetSelectedItem();
	if(i == -1)
		return;
	CSuperGridCtrl::CTreeItem * pItem = m_DataSetList.GetTreeItem(i);
	CItemInfo * pInfo = m_DataSetList.GetData(pItem ); 
	
	const CDataSafe * pDataSafe = pInfo->GetDataSafe();
	

	CString str;
	str.Format("文件名%s 偏移%d 长度%d", pDataSafe->cName, pDataSafe->dBeginSeek, pDataSafe->dNewLen);
	AfxMessageBox(str);
	*pResult = 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -