Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1334636
  • 博文数量: 953
  • 博客积分: 52320
  • 博客等级: 大将
  • 技术积分: 13090
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 13:42
文章分类

全部博文(953)

文章存档

2011年(1)

2008年(952)

我的朋友

分类: C/C++

2008-08-05 13:53:47

下载本文示例代码
下载本文示例源代码

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

下载本文示例代码
阅读(98) | 评论(0) | 转发(0) |
0

上一篇:初识WTL(上)

下一篇:初识WTL(下)

给主人留下些什么吧!~~