你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
动态位算法加密技术(二)
 

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;  //返回解读出来的密码

}
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089