远程关键运算软件防破解方法

文档序号:6563163阅读:190来源:国知局
专利名称:远程关键运算软件防破解方法
技术领域
本发明涉及的是一种基于计算机网络的计算机软件防破解技术。
背景技术
目前,商业化的计算机软件大多要通过注册用户和密码、认证码的方式进行软件的防盗版保护。基于这种方式的软件注册,对于进行软件盗版破解的破解者而言,通过逐段、逐句的分析和查找,可以找到软件执行程序内部进行认证和中断非法用户使用软件功能的语句。因此,就目前的所有计算机软件而言,只要软件的执行程序被破解者掌握,该软件的功能就很容易被破解者破解为自由可用的软件。

发明内容本发明的目的在于提供一种全新的基于网络的用以实现对实时在线软件的更严密的防盗版保护的远程认证方法。
本发明的目的是这样实现的将计算机软件的数据处理过程分为本地用户在客户端输入、服务器端处理、服务器端输出三个处理阶段,服务器端处理软件中不可省略的计算处理,并与本地用户提供的输入部分共同完成运算。
本发明还有这样一些结构特征所述的远程服务器端处理的程序是一节或多节连续的或不连续的处理。
本发明中将计算机软件的数据处理过程简单的分为输入-->处理-->输出三个处理阶段。如果我们把软件的某些不可省略的计算处理代码放置在服务器端运行,这样本地用户使用的客户端代码将是不完整的,本地用户通过提供输入部分提请服务器完成少量的关键计算。
采用本发明的软件防破解方法,由于的程序代码不完整,特别是关键代码的缺失,对客户端软件的破解如果通过现在通用的、修改可执行代码跳过认证代码程序段的方法,客户端软件的功能将会因数据处理的断层发生故障,从而有效防止软件的执行程序被破解者掌握,预防了软件被破解者破解为自由可用的用于其他目的软件,保证了软件的安全和人们的利益。
由于关键代码并不存在于客户端,破解者不能得到,使得破解者即使分析出问题所在,也只能通过分析输入输出数据猜测关键代码的实际内容,也就是用猜黑盒子的办法来弥补关键代码功能。在输入值域和输出值域够大的情况下,猜测关键代码是人力无法做到的。另外,由于黑盒子具有不同代码可以实现相同功能的特点,通过现有计算机来破解具有多义性的黑盒子也完全不可能。退一步而言,即使关键代码的处理过程足够简单,输入值域和输出值域比较小,以至于破解者可以通过穷举法等手段来进行破解或者通过逻辑分析模拟出类似的处理过程,其破解的劳动量和劳动强度也将十分庞大,其难度可能比重新设计一个同等功能的软件所费的精力更大。从而增加盗版耗时和费用,使软件的破解工作在经济和脑力投入上得不偿失,失去盗版价值。


图1为本发明远程关键运算软件防破解方法的一种具体实施框图。
具体实施方式
下面结合附图对本发明作进一步的说明结合图1,本发明将计算机软件的数据处理过程分为本地用户在客户端输入、服务器端处理、输出三个处理阶段。其中,把软件的某些不可省略的计算处理代码放置在服务器端运行,本地用户通过提供输入部分,提请服务器完成少量的关键计算。
这里需要提到一个问题,对于软件来说,通常处理部分比较消耗资源,另外有些对性能要求比较高的处理过程并不适合放在服务器端。进一步考虑,处理过程可以进行如下分解处理处理1......-->处理x-1-->处理x-->处理x+1......-->处理n如果我们能在处理中找到些资源消耗少的处理过程,并且满足输入的值域和输出的结果域足够大,那么我们就可以把这个局部处理过程即处理x放置在服务器端。
所谓的关键运算,指的是在运算处理过程中,该部分运算产生的结果对程序功能和最终结果产生至关重要的影响,也就是说,如果破解者不去完整的模拟出该运算的过程,返回恰当的输出,软件的后续运算将无法生成正确的结果。
下面结合具体实施例介绍本发明的实施过程。本实施例为一个开源的代码--混合密码系统,该系统实现了一个基本的混合密码系统。它使用DES作为对称密钥算法,RSA作为公开密钥算法。
选择混合加密后,当按下加密后,程序的处理过程如下处理1、打开输入输出文件处理2、产生随机des密钥串处理3、使用给出的rsa密钥和rsa模加密des密钥串处理4、保存加密后的des密钥串到输出文件中处理5、使用des密钥串(未加密的)加密输入文件中的内容并存入输出文件中。
相应的解密处理过程如下处理1、打开输入输出文件处理2、读取加密后的des密钥串信息处理3、使用给出的rsa密钥和rsa模解密des密钥串处理4、使用des密钥串(已解密的)解密输入文件中的内容并存入输出文件中。
相应的代码部分如下/******************************************************************************///名称Encrypt//功能加密//参数KeyStr,ModStr为0结尾的密钥串,用于设置RSA密钥和模n;Is3DES-3次DES标志//返回加密成功返回true,否则返回false//备注无须保存3次DES标志,因为DES会根据密钥长度自动切换/******************************************************************************/bool CMcs::Encrypt(char*OutFile,char*InFile,char*RsaKeyStr,char*RsaModStr,bool Is3DES){//处理1、打开输入输出文件CHECK(RsaKeyStr&&RsaModStr&&OpenFile(OutFile,InFile))chardeskey[17];CWindow wnd;mcshead.Ver=1;wnd.ShowWaitCursor();wnd.SetWindowCaption(″RSA正在加密DES密钥......″);//处理2、产生随机des密钥串des.RandKeyStr(deskey);if(Is3DES)des.RandKeyStr(&deskey[8]);//处理3、使用给出的rsa密钥和rsa模加密des密钥串FILE_CHECK(mcshead.KeyLen=rsa.Encrypt(mcshead.DesKey,deskey,Is3DES?168,RsaKeyStrRsaModStr),OutFile)wnd.EndWaitCursor();//处理4、保存加密后的des密钥串到输出文件中_1write(fh_out,(char*)&mcshead,sizeof(mcshead));//处理5、使用des密钥串(未加密的)加密输入文件中的内容并存入输出文件中FILE_CHECK(des.Encrypt(fh_out,fh_in,deskey),OutFile)CloseFile();
return true;}/******************************************************************************///名称Decrypt//功能解密//参数KeyStr,ModStr为0结尾的密钥串,用于设置RSA密钥和模n//返回解密成功返回true,否则返回false/******************************************************************************/bool CMcs::Decrypt(char*OutFile,char*InFile,char*RsaKeyStr,char*RsaModStr){//处理1、打开输入输出文件CHECK(RsaKeyStr&&RsaModStr&&OpenFile(OutFile,InFile))CWindow wnd;//处理2、读取加密后的des密钥串信息FILE_CHECK_MSG(_lread(fh_in,&mcshead,sizeof(mcshead))==sizeof(mcshead),OutFile,″错误该文件不是有效的MCS加密文件!″)FILE_CHECK_MSG(mcshead.Ver==1,OutFile,″该版程序无法解密此文件。\n请使用该程序的最新版。″)wnd.ShowWaitCursor();wnd.SetWindowCaption(″RSA正在解密DES密钥......″);//处理3、使用给出的rsa密钥和rsa模解密des密钥串int len =rsa.Decrypt(mcshead.DesKey,mcshead.DesKey,mcshead.KeyLen,RsaKeyStr,RsaModStr);wnd.EndWaitCursor();FILE_CHECK(len,OutFile)FILE_CHECK_MSG(len<=16,OutFile,″错误RSA密钥不正确!″)mcshead.DesKey[len]=′\0′;//处理4、使用des密钥串(已解密的)解密输入文件中的内容并存入输出文件中FILE_CHECK(des.Decrypt(fh_out,fh_in,mcshead.DesKey),OutFile)CloseFile();return true;
}依据我们的设计,我们需要找出关键计算并放在服务器端运行。显然,在上述的加密和解密处理过程中第三步(处理3、使用给出的rsa密钥和rsa模加(解)密des密钥串)即可看作是关键计算,如果没有该步骤的正确执行,后续的运算将产生错误的结果。我们可以将该关键计算放在服务器端执行。该关键计算对应的代码如下/******************************************************************************///名称Encrypt//功能加密//参数len为加密内容的长度;KeyStr,ModStr为0结尾的密钥串,用于设置RSA密钥和模n//返回加密(解密)后的密文(明文)长度/******************************************************************************/int CRsa::Encrypt(char*Out,char*In,UINT len,char*KeyStr,char*ModStr){static BigInt a,c;CHECK(Out&&In&&len&&SetKey(KeyStr,ModStr))//处理1、由输入构造一个大数CHECK_MSG(BI.BuildBIFromByte(a,In,len)&&a.len<=n.len,″错误RSA加密(解密)的内容过长!″)//处理2、对大数进行乘方取模CHECK(BI.PowMod(c,a,key,n))//处理3、转化成加密后的密文CGfL::HalfByteToByte(Out,c.bit,c.len);return (c.len+1)>>1;}这样,破解者如果要破解该软件的话,需要根据客户端请求的数据包和服务器端返回的数据包来猜测该函数的各参数含义以及返回值含义。(通常这种猜测是极为困难的,在函数比较复杂时甚至是不可能的。另外,如果函数比较简单的话,那么软件作者可以在其中再采用一些烟雾弹以加大猜测难度,比如把某些参数的数据采用简单加密后送到服务器端)。即使在某些特殊情况下被破解者猜测出该函数的作用,那么破解者需要完成的工作是模拟出该算法,并且转化成2进制代码,然后在程序文件中开辟一个新区域,把2进制代码写入该区域,并修改程序中的代码使其跳转到破解者提供的代码部分。整个工作量相对来说比较大。进一步分析,使用给出的rsa密钥和rsa模加(解)密des密钥串的运算过程比较复杂,对服务器的负载比较重,可以进一步细化成如下处理过程处理1、由输入构造一个大数处理2、对大数进行乘方取模处理3、转化成加密后的密文这里计算量比较大的是对大数进行乘方取模。考虑到服务器负载问题,我们可以把第一步和第三步作为关键计算放在服务器端运行。这两个步骤对应得代码如下/******************************************************************************///名称BuildBIFromByte//功能由输入字节组构造一个大数//参数//返回构造成功返回true,否则返回false/******************************************************************************/bool CBigInt::BuildBIFromByte(BigInt&Out,const char*In,UINT len){CHECK(In&&len<=BI_MAXLEN/4)Out=Zero;CGfL::ByteToHalfByte(Out.bit,In,len);SetLen(Out,len<<1);return true;}/******************************************************************************///名称ByteToHalfByte//功能将字节组转换成半字节组//参数//返回转换成功返回true,否则返回false/******************************************************************************/bool CGfL::ByteToHalfByte(char*Out,const char*In,UINT len){CHECK(Out&&In)
for(UINT i=0;i<len;++i){Out
=(*In)&0xf;Out[1]=((*In)>>4)&0xf;Out+=2;++In;}return true;}/******************************************************************************///名称HalfByteToByte//功能将半字节组转换成字节组//参数//返回转换成功返回true,否则返回false/******************************************************************************/bool CGfL::HalfByteToByte(char*Out,const char*In,UINT len){CHECK(Out&&In)for(UINT i=0,j=len>>1;i<j;++i){*Out=In
;*Out|=In[1]<<4;++Out;In+=2;}if(len%2)*Out=*In;return true;}考虑到上述的函数作为关键计算相对比较简单,破解者通过分析输入和输出有可能猜测出函数的功能并加以模拟。在实施时可以在返回结果中进行简单加密以加大破解者的猜测难度。
权利要求
1.一种远程关键运算软件防破解方法,其特征在于它是将计算机软件的数据处理过程分为本地用户在客户端输入、远程服务器端处理、输出三个处理阶段,其中,把软件的不可省略的计算处理代码放置在远程服务器端运行,本地用户通过提供输入部分提请远程服务器完成少量的关键计算。
2.根据权利要求1所述的一种远程关键运算软件防破解方法,其特征在于所述的远程服务器端处理的程序是一节连续的处理。
3.根据权利要求1所述的一种远程关键运算软件防破解方法,其特征在于所述的远程服务器端处理的程序是多节连续的处理。
4.根据权利要求1所述的一种远程关键运算软件防破解方法,其特征在于所述的远程服务器端处理的程序是一节不连续的处理。
5.根据权利要求1所述的一种远程关键运算软件防破解方法,其特征在于所述的远程服务器端处理的程序是多节不连续的处理。
全文摘要
本发明提供了一种全新的基于网络的用以实现对实时在线软件的更严密的防盗版保护的远程认证方法。本发明是将计算机软件的数据处理过程分为本地用户在客户端输入、服务器端处理、服务器端输出三个处理阶段,服务器端处理软件中不可省略的计算处理,并与本地用户提供的输入部分共同完成运算。采用本发明的软件防破解方法,由于的程序代码不完整,特别是关键代码的缺失,对客户端软件的破解如果通过现在通用的、修改可执行代码跳过认证代码程序段的方法,客户端软件的功能将会因数据处理的断层发生故障,从而有效防止软件的执行程序被破解者掌握,预防了软件被破解者破解为自由可用的用于其他目的软件,保证了软件的安全和人们的利益。
文档编号G06F21/22GK1963836SQ20061015104
公开日2007年5月16日 申请日期2006年11月21日 优先权日2006年11月21日
发明者姚念民, 赵建明, 万众一 申请人:哈尔滨工程大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1