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

VC++
自绘按钮补遗
按钮控件的使用
自绘按钮的实现
图形超链接类
VC中多语言菜单的实现
一种漂亮的自绘菜单
CGfxOutBarCtrl之提升篇
颜色选择组合框
如何去掉浮动工具条中的“关闭”按钮
设计XP风格的按钮
实现类似Excel和Visual C++里文件夹式样的标签控制(三)
实现类似Excel和Visual C++里文件夹式样的标签控制(二)
实现类似Excel和Visual C++里文件夹式样的标签控制(一)
CGfxOutBarCtrl之BUG篇
如何实现Office式样的扁平组合框
CButtonST类公共接口函数
CButtonST使用技巧(三)
CButtonST使用技巧(二)
CButtonST使用技巧(一)
CButtonST使用技巧: CButtonST简介

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 59 ::
收藏到网摘: 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下调试通过了)。