187上位机VC MFC加密解密实现文件保护功能
187上位机VC MFC加密解密实现文件保护功能 功能展示 保护文件不被他人解读是很长见的功能,比如产品工艺参数不想让他人获取,QQ聊天记录不想让人知晓会对文件进行加密处理,在程序打开文件时再进行解密,我们当前例程也实现对指定文件的加密解密功能,效果如图; 要点提示 文件的解密与加密得进行文件读取与保存操作;对应Cfile类的Read()Write()函数; 加密解密过程为: 1.从文件读取内容,将内容的每个字节和一个固定数(例程为3)进行异或处理,处理结果再保存到另一个缓存文件,直到读取完文件内容为止; 2.将旧的文件删除,缓存的文件重命名进行重命名; 加密解密后例程调用ShellExecute()进行处理后的文件的打开操作; 1.函数功能: 你可以给它任何文件的名字,它都能识别出来并打开它。 2.函数原型: HINSTANCEShellExecute( HWNDhwnd, LPCTSTRlpOperation, LPCTSTRlpFile, LPCTSTRlpParameters, LPCTSTRlpDirectory, INTnShowCmd 3.参数说明: hwnd: 用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。 lpOperation: 用于指定要进行的操作。 “open”操作表示执行由lpFile参数指定的程序,或打开由lpFile参数指定的文件或文件夹; “print”操作表示打印由lpFile参数指定的文件; “explore”操作表示浏览由lpFile参数指定的文件夹。 当参数设为NULL时,表示执行默认操作“open”。 lpFile: 用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。 lpParameters: 若lpFile参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为NULL. lpDirectory: 用于指定默认目录. nShowCmd: 若lpFile参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。 这个参数常用的常数: SW_HIDE 隐藏窗口,活动状态给令一个窗口 SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 SW_SHOWMAXIMIZED 最大化窗口,并将其激活 SW_SHOWMINIMIZED 最小化窗口,并将其激活 SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 SW_SHOWNORMAL 与SW_RESTORE相同 若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。 4.使用方法: 例如打开位图: ShellExecute(NULL,"open",“1.bmp",NULL,NULL,SW_SHOWNORMAL); 用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是 Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。 打开TXT文本文件: ShellExecute(this->m_hWnd,"open",sFilePath,NULL,NULL,SW_SHOWNORMAL); 实现功能 1.新建基于对话框的应用程序 2.拖拽两个按钮控件关联函数实现文件的加密与解密功能 - void CGkbc8Dlg::OnDecrypt()
- {
- CFileDialog Dlg(TRUE,"文件",NULL,OFN_HIDEREADONLY,"FILE(*.txt)|*.txt||",NULL);
- if(Dlg.DoModal()==IDOK)
- {
- CString sFilePath,sTempPath;
- sFilePath=Dlg.GetPathName();
- sTempPath=sFilePath.Left(sFilePath.Find('.'));
- sTempPath+="-Temp";
- sTempPath+=sFilePath.Right(sFilePath.GetLength()-sFilePath.ReverseFind('.'));//同目录下缓存文件名
- //
- CFile ReadFile,WriteFile;
- if(!ReadFile.Open(sFilePath,CFile::modeRead))
- return;
- if(!WriteFile.Open(sTempPath,CFile::modeCreate|CFile::modeWrite) )
- return;
- //
- char buf[128];
- char desbuf[128];
- while(1)
- {
- ZeroMemory(buf,128);
- ZeroMemory(desbuf,128);
- DWORD i=ReadFile.Read(buf,128);
-
复制代码- for(DWORD p=0;p<i;p++)
- {
- char m=buf[p];
- desbuf[p]=m^3;
- }
- WriteFile.Write(desbuf,i);
- if(i==0)
- break;
- }
- ReadFile.Close();
- WriteFile.Close();
- ::DeleteFile(sFilePath);
- ::MoveFile(sTempPath,sFilePath);
-
- ShellExecute(this->m_hWnd,"open",sFilePath,NULL,NULL,SW_SHOWNORMAL);//打开已解密的TXT文件
- }
- }
- void CGkbc8Dlg::OnEncrypt()
- {
- CFileDialog Dlg(TRUE,"文件",NULL,OFN_HIDEREADONLY,"FILE(*.txt)|*.txt||",NULL);
- if(Dlg.DoModal()==IDOK)
- {
- CString sFilePath,sTempPath;
- sFilePath=Dlg.GetPathName();
- sTempPath=sFilePath.Left(sFilePath.Find('.'));
- sTempPath+="-Temp";
- sTempPath+=sFilePath.Right(sFilePath.GetLength()-sFilePath.ReverseFind('.'));//同目录下缓存文件名
- //
- CFile ReadFile,WriteFile;
- if(!ReadFile.Open(sFilePath,CFile::modeRead))
- return;
- if(!WriteFile.Open(sTempPath,CFile::modeCreate|CFile::modeWrite) )
- return;
- //
- char buf[128];
- char desbuf[128];
-
复制代码- while(1)
- {
- ZeroMemory(buf,128);
- ZeroMemory(desbuf,128);
- DWORD i=ReadFile.Read(buf,128);
- for(DWORD p=0;p<i;p++)
- {
- char m=buf[p];
- desbuf[p]=m^3;
- }
- WriteFile.Write(desbuf,i);
- if(i==0)
- break;
- }
- ReadFile.Close();
- WriteFile.Close();
- ::DeleteFile(sFilePath);
- ::MoveFile(sTempPath,sFilePath);
-
- ShellExecute(this->m_hWnd,"open",sFilePath,NULL,NULL,SW_SHOWNORMAL);
- }
- }
复制代码我们来演示下功能实现的整个过程
|