分类: C/C++
2008-08-04 09:31:02
我用的方法是把文件从头到尾的每一个字节都读出来然后加密,.
具体做法如下:(请参照源代码);
新建一个基于对话框的工程(起名为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下调试通过了)。 下载本文示例代码