工控编程吧
标题:
187上位机VC MFC加密解密实现文件保护功能
[打印本页]
作者:
qq263946146
时间:
2016-1-23 20:54
标题:
187上位机VC MFC加密解密实现文件保护功能
(, 下载次数: 1)
上传
点击文件名下载附件
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);
}
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/e4a8928aa7ca90394cfc8de88d232974/0/0/w_19rteibiz9.swf-albumId=5230062009-tvId=5230062009-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4