Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468095
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:55:51

实现文件加密功能
作者:



我前几天在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下调试通过了)。


--------------------next---------------------

解码失败时就会出现内存泄漏 ( chaoyan 发表于 2006-8-7 9:47:00)
 
to jim-huang:
"内存的泄漏,资源的浪费"在哪里出现?希望大虾可以指出。
to hzdwang:“这种加密方法也太简单了吧!”
我觉得这种方法简单易懂,挺好的啊,你是否有哪里改进的地方,或者哪里有破绽啊?如何破解这个程序所加密的文件?
to sandyzh31: 
我想问题出在epass()函数中,
for(int i=0; i<(int)plen; i++){
   mc ^= ppass[i]|128;

mc反复的对输入的字符进行异或运算,没有考虑输入字符的顺序问题。
我的改进如下:
for(int i=0; i<(int)plen; i++) {
  __int64 temp=( ppass[i]|128 )<  mc ^= temp;
}
这样改进可否,请各位大虾指正
另外,to suhaiping,,我没有碰到你所说的问题啊?可能是和sandyzh31一样的问题吧?看看我这样改进后还有问题吗? ( happy_dada 发表于 2005-1-10 10:46:00)
 
我有一个问题想问问,用许景周的加密程序,假如选择一个文件夹,怎么选择这个文件夹的每个文件进行加密。 ( vc_question 发表于 2004-5-10 9:33:00)
 
程序存在的问题!!!!!!!第1次用错误的密码解密,显示加密错误,但再用任何的错误密码解密,都显示解密成功,并解密已加密的文件。
哪位高人能否改进一下。不胜感激!!!!!!!!!
( suhaiping 发表于 2004-4-21 19:30:00)
 
程序存在的问题:我用123作为加密密码,却用321就可以解码了。我发现相同的字符,只要排列顺序不同,就可以解码。 ( sandyzh31 发表于 2003-12-16 9:35:00)
 
这种加密方法也太简单了吧! ( hzdwang 发表于 2003-7-25 9:25:00)
 
不好意思,我还是个初学者,林静的这个程序中我有一点看不太明白!
{
data[i] ^= m_password;
data[i] ^= flen;                //因为每次加密后文件的大小都会增加5字节,所以如果两次用同一密码进行加密也没关系
}
此处为何会增加5个字节,PASSWORD初始化的时候,定义为4个字节,是否能讲解一二,感激涕零!! ( robysad 发表于 2003-6-7 18:24:00)
 
可不是随便批评啊,已经有不只一个的受害者啦,包括一开始的我:)
这里总有批评的自由吧。
( jim-huang 发表于 2003-6-6 8:11:00)
 
谁的程序会保证永远100%正确呢?随便批评人完全不可取 ( kingwei 发表于 2003-6-5 11:48:00)
 
谁的程序会保证永远100%正确呢?随便批评人完全不可取 ( kingwei 发表于 2003-6-5 11:48:00)
 
.......................................................

--------------------next---------------------

阅读(334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~