📄 safedatasetpage.cpp
字号:
// 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 + -