6.各按钮要完成的功能
(1)打开文件按钮函数的主要功能是定义打开文件对话框并对文件名与临时文件名赋予初始值,然后根据加密判断函数的返回值来判断文件属于加密型还是未加密型,具体如下。
void CDynamicLockDlg::OnOpenFile()
{
//设置打开文件对话框,关键是提取所打开的文件名
CFileDialog FileDlg(true); //定义打开文件对话框变量
FileDlg.m_ofn.lStructSize=76; //如果值为88则代表Win2000风格的对话框
if(FileDlg.DoModal()==IDOK) //启动打开文件对话框
{ if(FileDlg.GetPathName()=="") return;
m_filename=FileDlg.GetPathName(); UpdateData(false); //文本框中显示出来
strcpy( filename, FileDlg.GetPathName() ); //打开的文件名赋予全局变量
strcpy( tempname, FileDlg.GetPathName() );
strcat( tempname, ".temp" ); //将临时文件名处理为“原文件名.temp”形式
strPass==""; m_pass=""; UpdateData(false); //避免反复打开文件时导致数据混乱
}
else return;
//运用加密判断函数的返回值来判断打开文件属于加密型还是未加密型
if(GetFileFlag(filename)== TRUE) //属于加密型文件则应让加密按钮失效
{ GetDlgItem(IDC_LOCK)->EnableWindow(false);
GetDlgItem(IDC_UNLOCK)->EnableWindow(true);
}
else
{ GetDlgItem(IDC_LOCK)->EnableWindow(true);
GetDlgItem(IDC_UNLOCK)->EnableWindow(false);
}
}
(2)加密按钮所完成的主要功能是将密码框中密码赋予全局变量、调用加密函数完成加密。
void CDynamicLockDlg::OnLock()
{ //根据文本框变量值来判断文件是否打开并给出提示
if(m_filename=="") { MessageBox("没有文件打开!", "提示", MB_OK); return; }
//将密码框中数据赋予全局变量供调用并显示出当前的处理状态
UpdateData(true); strPass = m_pass;
m_status="正在加密..."; UpdateData(false);
//调用加密函数对文件数据进行解密
LockData( filename, tempname, strPass );
//处理完毕后给出提示并调整按钮的处理状态
m_status="加密成功"; UpdateData(false);
if(strPass!="") AfxMessageBox("加密成功\n\n请记住密码:"+strPass);
GetDlgItem(IDC_LOCK)->EnableWindow(false);
GetDlgItem(IDC_UNLOCK)->EnableWindow(true);
}
(3)解密按钮的主要功能是将密码框中的密码与解密函数中解读的正确密码比较,获得权限后再调用解密函数进行解密。
void CDynamicLockDlg::OnUnlock()
{ //根据文本框变量值来判断文件是否打开并给出提示
if(m_filename=="") { MessageBox("没有文件打开!", "提示", MB_OK); return; }
//将密码框中输入的密码与解密函数中解读的正确密码进行比较来决定操作权限
UpdateData(true);
if(m_pass!=GetFilePassWord(filename))
{ m_status="密码错误!"; UpdateData(false);
AfxMessageBox("密码错误,请从新输入"); return;
}
//显示当前的处理状态
m_status="正在解密..."; UpdateData(false);
//调用解密函数对文件数据进行解密
UnLockData(filename, tempname);
//处理完毕后给出提示并调整按钮的处理状态
m_status="解密成功 OK."; UpdateData(false);
GetDlgItem(IDC_LOCK)->EnableWindow(true);
GetDlgItem(IDC_UNLOCK)->EnableWindow(false);
}
7.特别说明
(1)在文件操作时均采用了二进制的方式进行,主要原因是可适用于任何格式类型的文件。由于在具体处理时主要运用了C语言的FILE*文件的有关操作与少量Windows API函数,因此也可用于C语言编程。
(2)在加密解密时借助于临时文件来实现,主要原因是便于去除追加在文件中的数据。
(3)在加密解密函数中最后对临时文件采用清空数据后删除,渗透了粉碎文件思想,即便使用了恢复删除软件得到的也是一个空文件而且速度特快再大文件也是瞬间完成,保证了操作不留痕。
(4)在追加密码与运行时间参数时将系统时间作为加密算式中的一个动态参数,虽然增加了大量代码给解读带来一定麻烦但却有力地保护了追加的密码与运行时间参数的无懈可击。在追加与解读数据时一定要注意定位到相应的具体位置与字符个数。
三、测试及应用
程序在WinXP系统中用VC++6.0所完成的编译、调试并成功地进行过多次测试。
1.检测
可在VC++6.0中按以上步骤直接拷贝编译后检测。检测时可在软件中任意打开一个文件进行加密,再以记事本或其他方式打开原文件进行直观对比。反复测试,观察是否在不同时间加密后数据在不断变化。
2.应用
(1)代码添置工作:关键是添加三个全局变量以及加密函数、解密函数、加密判断函数、解读密码函数代码可直接进行拷贝。调用时应注意各函数的函数类型及调用方式可参考第六步中的调用方式灵活运用。
(2)代码修改工作:关键就是修改所对应的各类运算式。确切地说就是指加密函数、解密函数以及解读密码函数中所对应的各类算式,尽可能复杂些,但修改后要保证所对应的加密与解密算式完全一致。主要原因是由于该技术加密解密的关键是运算式,所以引用后只须更改相应的算式即可,但要保证对应的加密式与解密解读式完全一致才能还原出原有数据。
四、总结
本文以数据位算法加密原理为基本指导思想,以不断变化的系统时间与运行时间作为动态位算法加密算式的动态参数,打破了传统数据加密的静态模式,提供了一个全新的动态位算法加密技术新理念模式,以供探讨与交流。
|