当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 实现文件加密功能

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 实现文件加密功能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 61 ::
收藏到网摘: n/a

实现文件加密功能
作者:林静

下载本文示例源代码

我前几天在VC知识库(VCKBASE.COM)下载了一个 "徐景周" 做的一个叫<加密之星>的小工具的源代码,我把它编译后拿文件来实验一下发现它对大多数文件都不管用.比如,加密文本文件只有文件的前一部分被加密而大部分还完整的存在, 如果用来加密mp3,简直就不起作用,加密后的mp3还是能很好的从头播放的尾..所以我自己发明了一种文件加密的方法,虽然很简单,但是能安全地加密任何计算机上的文件而且还可以用同一密码对同一文件进行多次加密。

我用的方法是把文件从头到尾的每一个字节都读出来然后加密,.

具体做法如下:(请参照源代码);

新建一个基于对话框的工程(起名为ecflie,然后去掉确定、取消、和系统添加的静态控件.在对话框添加三个按钮和两个编辑控件.给两个编辑控件分别关联变量CString m_path和CString m_pass,其中m_pass作为用户输入的密码,m_path作为文件路径;
其中三个按钮分别为浏览、加密、解密按钮.
添加以下函数:

__int64 epass(); //密码初始化函数BOOL ecfile(LPCTSTR fpath);//文件加密函数BOOL dcfile(LPCTSTR fpath);//文件解密函数
//给文件加密的函数
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();	data = new char[(int)flen];//为文件分配内存	file->SeekToBegin();	file->Read(data, flen); //这里把文件的所有字节都进行加密了	for(int i=0; i<(int)flen; i++)	{	data[i] ^= m_password;	data[i] ^= flen; //因为每次加密后文件的大小都会增加5字节,所以如果两次用同一密码进行加密也没关系	}	file->SeekToBegin();	file->Write(data, flen);	delete[] data; //先释放内存	//添加密码验证信息	char cpass[5] = "love";	for(int j=0; j<5; j++)	{	cpass[j] ^= m_password;	}	file->SeekToEnd();	file->Write(&cpass, 5); //在文件尾添加密码严整部分,,这样文件就会增加5字节	file->Close();	delete file;	return TRUE;}
//给文件解密的函数
BOOL 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 FALSE;	}	flen = file->GetLength();	data = new char[(int)flen];	//检验密码是不是正确	file->Seek(-5, CFile::end);	file->Read(&love, 5);	m_password = epass();	for(int i=0; i<5; i++)	{ love[i] ^= m_password;	}	if(strcmp(love, "love")!=0)	{	return FALSE;	}	//解密	file->SeekToBegin();	file->Read(data, flen); //按照原来的方法进行解密	for(int j=0; j<(int)flen; j++)	{	data[j] ^= m_password;	data[j] ^= (flen-5);	}	file->SeekToBegin();	file->Write(data, flen);	file->SetLength(flen-5); //删除加密是添加的密码验证部分	file->Close();	delete[] data;	delete file;	return TRUE;}
上面取得密码的函数(m_password = epass();)可以自己定义,我只把密码进行简单的运算:
__int64 CEcfileDlg::epass(){	DWORD plen;	char *ppass;	__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;}
然后在适当的地方调用这两个函数就可以了.具体细节请查看源代码,(在WIN XP下调试通过了)。