3.解密函数所要完成的主要功能
(1) 先将追加在加密文件中的系统时间解读出来,然后利用这个参数把解密文件数据所须的系统运行时间参数解读出来,这是解密文件的准备工作。
(2) 根据相应的动态位加密算式将加密文件中的数据解密在临时文件中。
(3) 最后将临时文件中的数据更新到原文件中并将临时文件内容清空删除。具体如下
void CDynamicLockDlg::UnLockData(char *FileName, char *TempFile)
{
//解密追加在加密文件结尾的有关数据
//首先解读系统时间参数并处理成unsigned long型供解密运行时间时使用
unsigned long systime; unsigned long runtime;
FILE *fp,*ftemp; char c; char cData; int ii=0;
if((fp=fopen(FileName, "rb"))==NULL) //判断一下文件是否打开
{ MessageBox("打开文件失败!", "提示", MB_OK); return; }
CString strSysTime=""; //将系统时间解密成字符串再转化为unsigned long型
fseek(fp, -42L, SEEK_END); //将文件指针指向系统时间的追加存放位置
for( ii=0; ii<10; ii++)
{ c=fgetc(fp);
c^=0xab+ii%5;
strSysTime=strSysTime+c;
} systime=atol(strSysTime); // AfxMessageBox(strSysTime); 检测解读系统时间
//解读系统运行时间参数并处理成unsigned long型供解密文件数据时使用
CString strRun="";
fseek(fp, -52L, SEEK_END); //将文件指针指向系统运行时间的存放位置
for(ii=0; ii<10; ii++)
{ c=fgetc(fp);
c^=0xab+ii+(ii+2008)%2008+systime%2008;
strRun=strRun+c;
} runtime=atol(strRun); fclose(fp); // AfxMessageBox(strRun); 解读运行时间
//将加密文件按加密时所对应的动态位加密算式解密在临时文件中
fp=fopen(FileName, "rb"); //以二进制只读方式打开加密文件
fseek(fp, 0L, SEEK_END); int LenSize=ftell(fp); //获取文件长度
rewind(fp); //将文件指针从新指向开头以便解密文件数据
ftemp=fopen(TempFile, "wb+"); //以二进制方式将文件数据解密在临时文件中
int i=0;
while(i!=LenSize-175) //解密文件时应去除去全部追加的数据总共175个
{ cData=fgetc(fp);
cData^=0xab+(i+2008)%2008+i-runtime; //必须与加密函数中对应算式一致
putc(cData, ftemp); //将解密出来的数据写入临时文件中
i++;
} fclose(fp); fclose(ftemp);
//最后将临时文件中的数据更新到原文件中并将临时文件内容清空删除
CopyFile(TempFile, FileName, 0); //将临时文件数据更新到原文件中
ftemp=fopen(TempFile, "wb+"); //将临时文件数据清空,不留痕迹
fwrite(NULL, 0, 0, ftemp);
fclose(ftemp);
remove(TempFile); //删除临时文件
}
4.加密判断功能
在指定位置-175L去解读取125个字符的判断标志与标准标志进行比较,如果一致则属于加密型否则属于未加密型。主要在打开文件时调用并根据函数返回值是否为TRUE来判断
BOOL CDynamicLockDlg::GetFileFlag(char *FileName)
{ //读取相应位置的判断标志进行解密来判断是否是加密文件*****************
CString strFlag="The data of file had been locked OK."; //标准判断标志
strFlag=strFlag+"The Data Of File Had Been Locked OK.";
strFlag=strFlag+"THE DATA OF FILE HAD BEEN LOCKED OK.";
FILE *fp; char c; CString strflag=""; //文件中提取的判断标志
fp=fopen(FileName, "rb"); //////////////以二进制只读的方式打开原文件
fseek(fp, -175L, SEEK_END); //将文件指针指向判断标准的追加位置
for(int ii=0; ii<123; ii++)
{ c=fgetc(fp); //读取相应位置字符
c^=0xab+(ii+123)%123; //按动态位加密算式解密
strflag=strflag+c; //解密后的数据组成字符串
} fclose(fp);
if(strflag==strFlag) return TRUE; //为加密文件类型
return FALSE;
}
5.解读密码函数要完成功能
将追加在加密文件中经过加密的密码数据解读出来。
CString CDynamicLockDlg::GetFilePassWord(char *FileName)
{ FILE *fp; char c; int ii=0;
fp=fopen(FileName, "rb");
CString strSysTime=""; fseek(fp, -42L, SEEK_END);//定位到系统时间的追加位置
for(ii=0; ii<10; ii++)
{ c=fgetc(fp);
c^=0xab+ii%5;
strSysTime=strSysTime+c;
} unsigned long systime=atol(strSysTime); //解读密码时要用到系统时间这个参数
CString strRun=""; fseek(fp, -52L, SEEK_END); //定位到运行时间的追加位置
for(ii=0; ii<10; ii++)
{ c=fgetc(fp);
c^=0xab+ii+(ii+2008)%2008+systime%2008;
strRun=strRun+c;
} unsigned long runtime=atol(strRun); //解读密码时要用到运行时间这个参数
CString strPassWord =""; fseek(fp, -32L, SEEK_END); //定位到密码的追加位置
for(ii=0; ii<32; ii++)
{ c=fgetc(fp);
c^=0xab+(ii+systime)%2008+runtime;
strPassWord = strPassWord +c;
} fclose(fp); //解读完毕后检测提取的密码
return strPassWord; //返回解读出来的密码 }
|