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

📄 ecfiledlg.cpp

📁 简单的文件加解密程序。可以对整个文件夹进行加密和解密。
💻 CPP
字号:
// ecfileDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ecfile.h"
#include "ecfileDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEcfileDlg dialog

CEcfileDlg::CEcfileDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CEcfileDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CEcfileDlg)
	m_path = _T("");
	m_pass = _T("");
	m_List = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CEcfileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CEcfileDlg)
	DDX_Control(pDX, IDC_EDT_LIST, m_FileList);
	DDX_Text(pDX, IDC_PASSWORD, m_path);
	DDX_Text(pDX, IDC_PASS1, m_pass);
	DDX_Text(pDX, IDC_EDT_LIST, m_List);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CEcfileDlg, CDialog)
	//{{AFX_MSG_MAP(CEcfileDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_E, OnE)
	ON_BN_CLICKED(IDC_D, OnD)
	ON_BN_CLICKED(IDC_BROW, OnBrow)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CEcfileDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);
	SetIcon(m_hIcon, FALSE);
/*
	LPITEMIDLIST pmdl;
	char path[MAX_PATH];
	if(TRUE==::SHGetPathFromIDList(pmdl,path))
	{
		UpdateData(TRUE);
		m_path = path;
		UpdateData(FALSE);
	}
*/
	return TRUE;
}

void CEcfileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CEcfileDlg::OnPaint() 
{
	CDialog::OnPaint();
}

HCURSOR CEcfileDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CEcfileDlg::OnE() 
{
	UpdateData(TRUE);
	if(m_path == "")
	{
		AfxMessageBox("怎么没有选择要加密的文件就开始加密啊?");
		return;
	}

	UpdateData(TRUE);
	if(m_pass == "")
	{
		AfxMessageBox("没有写上密码");
		return;
	}
	m_FileList.SetWindowText(" ");
	sa.RemoveAll();
	UpdateData(TRUE);
	int type=IsFileorPath(m_path);
	if(type==1)
		sa.Add(m_path);
	else if(type==2)
		GetFile(m_path);
	DWORD m_filecount=sa.GetSize();
	for(DWORD cnt=0;cnt<m_filecount;cnt++)
	{
		CString sFileName =sa.GetAt(cnt);
		m_FileList.SetSel(-1,-1);
		m_FileList.ReplaceSel(sFileName);
		if(ecfile(sFileName))
		{
			m_FileList.SetSel(-1,-1);
			m_FileList.ReplaceSel("....加密成功!\r\n");
		}
		else
		{
			m_FileList.SetSel(-1,-1);
			m_FileList.ReplaceSel("....加密失败!\r\n");
		}
	}
	sa.RemoveAll();
	CString str_disp;
	str_disp.Format("%d",m_filecount);
	str_disp.Insert(0,"总共有");
	str_disp +="个文件";
	m_FileList.SetSel(-1,-1);
	m_FileList.ReplaceSel(str_disp);
}
//检验字符串是文件名还是文件夹
//文件名则返回1,文件夹返回2,否则返回0
int CEcfileDlg::IsFileorPath(CString str)
{
	CFileFind ff;
	CFile f;
	if(ff.FindFile(str+"\\*.*"))
	{
		ff.Close();
		return 2;	//文件夹
	}
	else if(f.Open(str, CFile::shareDenyNone|CFile::modeReadWrite))
	{
		f.Close();
		return 1;
	}
	return 0;
}
//遍历目录下面的所有文件,并把它保存于字符串陈列sa中。
void CEcfileDlg::GetFile(CString sDir)
{
#if	1
	CFileFind ff;
	BOOL bContinue = ff.FindFile(sDir+"\\*.*");   //把*.*改成别的扩展名,就实现了文件的过滤   
	while(bContinue)   
	{   
		bContinue   =   ff.FindNextFile();   
		if(ff.IsDots())//这是   .   和   ..   
			continue;   
		if(ff.IsDirectory())//这是目录,遍历这个目录   
			GetFile(ff.GetFilePath());   
		else//这是文件,可以往数据库里存了
		{
			CString sFileName = ff.GetFilePath();
			sa.Add(sFileName);
		}
	}
	ff.Close();
#endif
}

void CEcfileDlg::OnD()
{
	UpdateData(TRUE);
	if(m_path == "")
	{
		AfxMessageBox("怎么没有选择要加密的文件就开始解密啊?");
		return;
	}

	UpdateData(TRUE);
	if(m_pass == "")
	{
		AfxMessageBox("没有写上密码");
		return;
	}
	m_FileList.SetWindowText(" ");
	sa.RemoveAll();
	UpdateData(TRUE);
	int type=IsFileorPath(m_path);
	if(type==1)
		sa.Add(m_path);
	else if(type==2)
		GetFile(m_path);
	DWORD m_filecount=sa.GetSize();
	for(DWORD cnt=0;cnt<m_filecount;cnt++)
	{
		CString sFileName =sa.GetAt(cnt);
		m_FileList.SetSel(-1,-1);
		m_FileList.ReplaceSel(sFileName);
		int m_flag=dcfile(sFileName);
		if(m_flag==1)
		{
			m_FileList.SetSel(-1,-1);
			m_FileList.ReplaceSel("....解密成功!\r\n");
		}
		else if(m_flag==0)
		{
			m_FileList.SetSel(-1,-1);
			m_FileList.ReplaceSel("....非加密文件或密码不对!\r\n");
		}
		else
		{
			m_FileList.SetSel(-1,-1);
			m_FileList.ReplaceSel("....解密失败!\r\n");
		}
	}
	sa.RemoveAll();
	CString str_disp;
	str_disp.Format("%d",m_filecount);
	str_disp.Insert(0,"总共有");
	str_disp +="个文件";
	m_FileList.SetSel(-1,-1);
	m_FileList.ReplaceSel(str_disp);
}
BOOL CEcfileDlg::GetFloder(CString* sFolderPath) 
{
	// TODO: Add your control notification handler code here
	// BROWSEINFO 结构
	////////////////////////////////////
	// typedef struct _browseinfo {
	//   HWND hwndOwner;
	//   LPCITEMIDLIST pidlRoot;
	//   LPSTR pszDisplayName;
	//   LPCSTR lpszTitle;
	//   UINT ulFlags;
	//   BFFCALLBACK lpfn;
	//   LPARAM lParam;
	//   int iImage;
	//   } BROWSEINFO;
	///////////////////////////////////


	//CString sFolderPath;
	BROWSEINFO bi;
	char Buffer[MAX_PATH];
	//初始化入口参数bi开始
	bi.hwndOwner = NULL;
	bi.pidlRoot =NULL;//初始化制定的root目录很不容易,
	bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
	bi.lpszTitle = "修改接收路径";
	bi.ulFlags = BIF_BROWSEINCLUDEFILES;//包括文件夹和文件
	//bi.ulFlags = BIF_EDITBOX;//只有文件夹

	bi.lpfn = NULL;
	bi.iImage=IDR_MAINFRAME;
	//初始化入口参数bi结束
	LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
	if(pIDList)
	{
	   SHGetPathFromIDList(pIDList, Buffer);
	   //取得文件夹路径到Buffer里
	   *sFolderPath = Buffer;//将路径保存在一个CString对象里
	}
	LPMALLOC lpMalloc;
	if(FAILED(SHGetMalloc(&lpMalloc))) return false;
	//释放内存
	lpMalloc->Free(pIDList);
	lpMalloc->Release();
	//sFolderPath = Buffer;
#if	0
	MessageBox(sFolderPath,"Title",MB_OK);
	TRACE("\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
	TRACE(sFolderPath);
	TRACE("\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
#endif
	return	true;
}
void CEcfileDlg::OnBrow() 
{
	CString sPathName;
	CFileDialog dlg(TRUE);
	if(GetFloder(&sPathName))
	{
		UpdateData(TRUE);
		m_path = sPathName;
		UpdateData(FALSE);
	}
	else
	{
		MessageBox("找不到相关文件或文件夹!","Title",MB_OK);
	}
}


//给文件加密的函数
#define		C_DATA_LEN	65535
BOOL CEcfileDlg::ecfile(LPCTSTR fpath)
{
	char *data;
	CFile file;
	DWORD flen;

	m_password = epass();

	//file = new CFile;
	if ( !file.Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))
	{
		return FALSE;
	}

	flen = file.GetLength();
	if(flen>C_DATA_LEN)
		flen = C_DATA_LEN;
	//data = new char[(int)flen];
	data = new char[flen];

	file.SeekToBegin();
	file.Read(data, flen);
	DWORD i;
	for(i=0; i<flen; i++)
	{
		data[i] ^= m_password;
		data[i] ^= flen;
	}

	file.SeekToBegin();
	file.Write(data, flen);

	delete[] data;

	//添加密码验证信息
	char cpass[5] = "FUCK";
	for(int j=0; j<5; j++)
	{
		cpass[j] ^= m_password;
	}
	file.SeekToEnd();
	file.Write(&cpass, 5);
	file.Close();
	//delete file;

	return TRUE;
}


//给文件解密的函数
int CEcfileDlg::dcfile(LPCTSTR fpath)
{
	char *data;
	CFile file;
	DWORD flen;
	char love[5];

	//file = new CFile;
	if( !file.Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))
	{
		return -1;
	}

	flen = file.GetLength();
	
	//检验密码是不是正确
	file.Seek(-5, CFile::end);
	file.Read(&love, 5);
	m_password = epass();
	int i;
	for(i=0; i<5; i++)
	{
		love[i] ^= m_password;
	}

	if(strcmp(love, "FUCK")!=0)
	{
		return 0;
	}
	file.SetLength(flen-5);
	//解密
	flen -=5;
	if(flen>C_DATA_LEN)
		flen = C_DATA_LEN;
	data = new char[(int)flen];
	file.SeekToBegin();
	file.Read(data, flen);
	DWORD j;
	for(j=0; j<flen; j++)
	{
		data[j] ^= m_password;
		data[j] ^= (flen);
	}
	file.SeekToBegin();
	file.Write(data, flen);

	file.Close();

	delete[] data;
//	delete file;
	return 1;
}


//获得密码的函数
__int64 CEcfileDlg::epass()
{
	DWORD plen;
	char *ppass;
	__int64 mc= 9235678042345;
	//__int64 mc= 8757735233305;
	UpdateData(TRUE);

	ppass = m_pass.GetBuffer(0);

	plen = strlen(ppass);

	for(int i=0; i<(int)plen; i++)
	{
		mc ^= ppass[i]|128;
	}
	return mc;
}

⌨️ 快捷键说明

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