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

VC++
几个数字信号处理算法程序
简易软盘镜像工具的实现及操作系统编写初步
教你使用正则表达式
C++ 扩展和嵌入 Python
拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
精通VC与Matlab联合编程(六)
精通VC与Matlab联合编程(五)
一个排序用的C++函数模板
浅析VC与MATLAB联合编程
C++编译器如何实现异常处理
文件重定义冲突的分析与解决
一步一步实现MFC扩展DLL中导出类和对话框
C宏:智者的利刃,愚者的恶梦!
引用的作用
《UTF-8与GB2312之间的互换》的改进
程序风格的要素-C++风格指南
VC+6.0实现文本串的自由拆分
怎样给串行化类分配版本号(可配置版本模式)
在常规的编程任务中使用新的 <tuple> 库
使用 typedef 抑制劣质代码

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


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