專(zhuān)利名稱(chēng):遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的是一種基于計(jì)算機(jī)網(wǎng)絡(luò)的計(jì)算機(jī)軟件防破解技術(shù)。
背景技術(shù):
目前,商業(yè)化的計(jì)算機(jī)軟件大多要通過(guò)注冊(cè)用戶和密碼、認(rèn)證碼的方式進(jìn)行軟件的防盜版保護(hù)?;谶@種方式的軟件注冊(cè),對(duì)于進(jìn)行軟件盜版破解的破解者而言,通過(guò)逐段、逐句的分析和查找,可以找到軟件執(zhí)行程序內(nèi)部進(jìn)行認(rèn)證和中斷非法用戶使用軟件功能的語(yǔ)句。因此,就目前的所有計(jì)算機(jī)軟件而言,只要軟件的執(zhí)行程序被破解者掌握,該軟件的功能就很容易被破解者破解為自由可用的軟件。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種全新的基于網(wǎng)絡(luò)的用以實(shí)現(xiàn)對(duì)實(shí)時(shí)在線軟件的更嚴(yán)密的防盜版保護(hù)的遠(yuǎn)程認(rèn)證方法。
本發(fā)明的目的是這樣實(shí)現(xiàn)的將計(jì)算機(jī)軟件的數(shù)據(jù)處理過(guò)程分為本地用戶在客戶端輸入、服務(wù)器端處理、服務(wù)器端輸出三個(gè)處理階段,服務(wù)器端處理軟件中不可省略的計(jì)算處理,并與本地用戶提供的輸入部分共同完成運(yùn)算。
本發(fā)明還有這樣一些結(jié)構(gòu)特征所述的遠(yuǎn)程服務(wù)器端處理的程序是一節(jié)或多節(jié)連續(xù)的或不連續(xù)的處理。
本發(fā)明中將計(jì)算機(jī)軟件的數(shù)據(jù)處理過(guò)程簡(jiǎn)單的分為輸入-->處理-->輸出三個(gè)處理階段。如果我們把軟件的某些不可省略的計(jì)算處理代碼放置在服務(wù)器端運(yùn)行,這樣本地用戶使用的客戶端代碼將是不完整的,本地用戶通過(guò)提供輸入部分提請(qǐng)服務(wù)器完成少量的關(guān)鍵計(jì)算。
采用本發(fā)明的軟件防破解方法,由于的程序代碼不完整,特別是關(guān)鍵代碼的缺失,對(duì)客戶端軟件的破解如果通過(guò)現(xiàn)在通用的、修改可執(zhí)行代碼跳過(guò)認(rèn)證代碼程序段的方法,客戶端軟件的功能將會(huì)因數(shù)據(jù)處理的斷層發(fā)生故障,從而有效防止軟件的執(zhí)行程序被破解者掌握,預(yù)防了軟件被破解者破解為自由可用的用于其他目的軟件,保證了軟件的安全和人們的利益。
由于關(guān)鍵代碼并不存在于客戶端,破解者不能得到,使得破解者即使分析出問(wèn)題所在,也只能通過(guò)分析輸入輸出數(shù)據(jù)猜測(cè)關(guān)鍵代碼的實(shí)際內(nèi)容,也就是用猜黑盒子的辦法來(lái)彌補(bǔ)關(guān)鍵代碼功能。在輸入值域和輸出值域夠大的情況下,猜測(cè)關(guān)鍵代碼是人力無(wú)法做到的。另外,由于黑盒子具有不同代碼可以實(shí)現(xiàn)相同功能的特點(diǎn),通過(guò)現(xiàn)有計(jì)算機(jī)來(lái)破解具有多義性的黑盒子也完全不可能。退一步而言,即使關(guān)鍵代碼的處理過(guò)程足夠簡(jiǎn)單,輸入值域和輸出值域比較小,以至于破解者可以通過(guò)窮舉法等手段來(lái)進(jìn)行破解或者通過(guò)邏輯分析模擬出類(lèi)似的處理過(guò)程,其破解的勞動(dòng)量和勞動(dòng)強(qiáng)度也將十分龐大,其難度可能比重新設(shè)計(jì)一個(gè)同等功能的軟件所費(fèi)的精力更大。從而增加盜版耗時(shí)和費(fèi)用,使軟件的破解工作在經(jīng)濟(jì)和腦力投入上得不償失,失去盜版價(jià)值。
圖1為本發(fā)明遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法的一種具體實(shí)施框圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步的說(shuō)明結(jié)合圖1,本發(fā)明將計(jì)算機(jī)軟件的數(shù)據(jù)處理過(guò)程分為本地用戶在客戶端輸入、服務(wù)器端處理、輸出三個(gè)處理階段。其中,把軟件的某些不可省略的計(jì)算處理代碼放置在服務(wù)器端運(yùn)行,本地用戶通過(guò)提供輸入部分,提請(qǐng)服務(wù)器完成少量的關(guān)鍵計(jì)算。
這里需要提到一個(gè)問(wèn)題,對(duì)于軟件來(lái)說(shuō),通常處理部分比較消耗資源,另外有些對(duì)性能要求比較高的處理過(guò)程并不適合放在服務(wù)器端。進(jìn)一步考慮,處理過(guò)程可以進(jìn)行如下分解處理處理1......-->處理x-1-->處理x-->處理x+1......-->處理n如果我們能在處理中找到些資源消耗少的處理過(guò)程,并且滿足輸入的值域和輸出的結(jié)果域足夠大,那么我們就可以把這個(gè)局部處理過(guò)程即處理x放置在服務(wù)器端。
所謂的關(guān)鍵運(yùn)算,指的是在運(yùn)算處理過(guò)程中,該部分運(yùn)算產(chǎn)生的結(jié)果對(duì)程序功能和最終結(jié)果產(chǎn)生至關(guān)重要的影響,也就是說(shuō),如果破解者不去完整的模擬出該運(yùn)算的過(guò)程,返回恰當(dāng)?shù)妮敵?,軟件的后續(xù)運(yùn)算將無(wú)法生成正確的結(jié)果。
下面結(jié)合具體實(shí)施例介紹本發(fā)明的實(shí)施過(guò)程。本實(shí)施例為一個(gè)開(kāi)源的代碼--混合密碼系統(tǒng),該系統(tǒng)實(shí)現(xiàn)了一個(gè)基本的混合密碼系統(tǒng)。它使用DES作為對(duì)稱(chēng)密鑰算法,RSA作為公開(kāi)密鑰算法。
選擇混合加密后,當(dāng)按下加密后,程序的處理過(guò)程如下處理1、打開(kāi)輸入輸出文件處理2、產(chǎn)生隨機(jī)des密鑰串處理3、使用給出的rsa密鑰和rsa模加密des密鑰串處理4、保存加密后的des密鑰串到輸出文件中處理5、使用des密鑰串(未加密的)加密輸入文件中的內(nèi)容并存入輸出文件中。
相應(yīng)的解密處理過(guò)程如下處理1、打開(kāi)輸入輸出文件處理2、讀取加密后的des密鑰串信息處理3、使用給出的rsa密鑰和rsa模解密des密鑰串處理4、使用des密鑰串(已解密的)解密輸入文件中的內(nèi)容并存入輸出文件中。
相應(yīng)的代碼部分如下/******************************************************************************///名稱(chēng)Encrypt//功能加密//參數(shù)KeyStr,ModStr為0結(jié)尾的密鑰串,用于設(shè)置RSA密鑰和模n;Is3DES-3次DES標(biāo)志//返回加密成功返回true,否則返回false//備注無(wú)須保存3次DES標(biāo)志,因?yàn)镈ES會(huì)根據(jù)密鑰長(zhǎng)度自動(dòng)切換/******************************************************************************/bool CMcs::Encrypt(char*OutFile,char*InFile,char*RsaKeyStr,char*RsaModStr,bool Is3DES){//處理1、打開(kāi)輸入輸出文件CHECK(RsaKeyStr&&RsaModStr&&OpenFile(OutFile,InFile))chardeskey[17];CWindow wnd;mcshead.Ver=1;wnd.ShowWaitCursor();wnd.SetWindowCaption(″RSA正在加密DES密鑰......″);//處理2、產(chǎn)生隨機(jī)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密鑰串(未加密的)加密輸入文件中的內(nèi)容并存入輸出文件中FILE_CHECK(des.Encrypt(fh_out,fh_in,deskey),OutFile)CloseFile();
return true;}/******************************************************************************///名稱(chēng)Decrypt//功能解密//參數(shù)KeyStr,ModStr為0結(jié)尾的密鑰串,用于設(shè)置RSA密鑰和模n//返回解密成功返回true,否則返回false/******************************************************************************/bool CMcs::Decrypt(char*OutFile,char*InFile,char*RsaKeyStr,char*RsaModStr){//處理1、打開(kāi)輸入輸出文件CHECK(RsaKeyStr&&RsaModStr&&OpenFile(OutFile,InFile))CWindow wnd;//處理2、讀取加密后的des密鑰串信息FILE_CHECK_MSG(_lread(fh_in,&mcshead,sizeof(mcshead))==sizeof(mcshead),OutFile,″錯(cuò)誤該文件不是有效的MCS加密文件!″)FILE_CHECK_MSG(mcshead.Ver==1,OutFile,″該版程序無(wú)法解密此文件。\n請(qǐng)使用該程序的最新版。″)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,″錯(cuò)誤RSA密鑰不正確!″)mcshead.DesKey[len]=′\0′;//處理4、使用des密鑰串(已解密的)解密輸入文件中的內(nèi)容并存入輸出文件中FILE_CHECK(des.Decrypt(fh_out,fh_in,mcshead.DesKey),OutFile)CloseFile();return true;
}依據(jù)我們的設(shè)計(jì),我們需要找出關(guān)鍵計(jì)算并放在服務(wù)器端運(yùn)行。顯然,在上述的加密和解密處理過(guò)程中第三步(處理3、使用給出的rsa密鑰和rsa模加(解)密des密鑰串)即可看作是關(guān)鍵計(jì)算,如果沒(méi)有該步驟的正確執(zhí)行,后續(xù)的運(yùn)算將產(chǎn)生錯(cuò)誤的結(jié)果。我們可以將該關(guān)鍵計(jì)算放在服務(wù)器端執(zhí)行。該關(guān)鍵計(jì)算對(duì)應(yīng)的代碼如下/******************************************************************************///名稱(chēng)Encrypt//功能加密//參數(shù)len為加密內(nèi)容的長(zhǎng)度;KeyStr,ModStr為0結(jié)尾的密鑰串,用于設(shè)置RSA密鑰和模n//返回加密(解密)后的密文(明文)長(zhǎng)度/******************************************************************************/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、由輸入構(gòu)造一個(gè)大數(shù)CHECK_MSG(BI.BuildBIFromByte(a,In,len)&&a.len<=n.len,″錯(cuò)誤RSA加密(解密)的內(nèi)容過(guò)長(zhǎng)!″)//處理2、對(duì)大數(shù)進(jìn)行乘方取模CHECK(BI.PowMod(c,a,key,n))//處理3、轉(zhuǎn)化成加密后的密文CGfL::HalfByteToByte(Out,c.bit,c.len);return (c.len+1)>>1;}這樣,破解者如果要破解該軟件的話,需要根據(jù)客戶端請(qǐng)求的數(shù)據(jù)包和服務(wù)器端返回的數(shù)據(jù)包來(lái)猜測(cè)該函數(shù)的各參數(shù)含義以及返回值含義。(通常這種猜測(cè)是極為困難的,在函數(shù)比較復(fù)雜時(shí)甚至是不可能的。另外,如果函數(shù)比較簡(jiǎn)單的話,那么軟件作者可以在其中再采用一些煙霧彈以加大猜測(cè)難度,比如把某些參數(shù)的數(shù)據(jù)采用簡(jiǎn)單加密后送到服務(wù)器端)。即使在某些特殊情況下被破解者猜測(cè)出該函數(shù)的作用,那么破解者需要完成的工作是模擬出該算法,并且轉(zhuǎn)化成2進(jìn)制代碼,然后在程序文件中開(kāi)辟一個(gè)新區(qū)域,把2進(jìn)制代碼寫(xiě)入該區(qū)域,并修改程序中的代碼使其跳轉(zhuǎn)到破解者提供的代碼部分。整個(gè)工作量相對(duì)來(lái)說(shuō)比較大。進(jìn)一步分析,使用給出的rsa密鑰和rsa模加(解)密des密鑰串的運(yùn)算過(guò)程比較復(fù)雜,對(duì)服務(wù)器的負(fù)載比較重,可以進(jìn)一步細(xì)化成如下處理過(guò)程處理1、由輸入構(gòu)造一個(gè)大數(shù)處理2、對(duì)大數(shù)進(jìn)行乘方取模處理3、轉(zhuǎn)化成加密后的密文這里計(jì)算量比較大的是對(duì)大數(shù)進(jìn)行乘方取模。考慮到服務(wù)器負(fù)載問(wèn)題,我們可以把第一步和第三步作為關(guān)鍵計(jì)算放在服務(wù)器端運(yùn)行。這兩個(gè)步驟對(duì)應(yīng)得代碼如下/******************************************************************************///名稱(chēng)BuildBIFromByte//功能由輸入字節(jié)組構(gòu)造一個(gè)大數(shù)//參數(shù)//返回構(gòu)造成功返回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;}/******************************************************************************///名稱(chēng)ByteToHalfByte//功能將字節(jié)組轉(zhuǎn)換成半字節(jié)組//參數(shù)//返回轉(zhuǎn)換成功返回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;}/******************************************************************************///名稱(chēng)HalfByteToByte//功能將半字節(jié)組轉(zhuǎn)換成字節(jié)組//參數(shù)//返回轉(zhuǎn)換成功返回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;}考慮到上述的函數(shù)作為關(guān)鍵計(jì)算相對(duì)比較簡(jiǎn)單,破解者通過(guò)分析輸入和輸出有可能猜測(cè)出函數(shù)的功能并加以模擬。在實(shí)施時(shí)可以在返回結(jié)果中進(jìn)行簡(jiǎn)單加密以加大破解者的猜測(cè)難度。
權(quán)利要求
1.一種遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法,其特征在于它是將計(jì)算機(jī)軟件的數(shù)據(jù)處理過(guò)程分為本地用戶在客戶端輸入、遠(yuǎn)程服務(wù)器端處理、輸出三個(gè)處理階段,其中,把軟件的不可省略的計(jì)算處理代碼放置在遠(yuǎn)程服務(wù)器端運(yùn)行,本地用戶通過(guò)提供輸入部分提請(qǐng)遠(yuǎn)程服務(wù)器完成少量的關(guān)鍵計(jì)算。
2.根據(jù)權(quán)利要求1所述的一種遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法,其特征在于所述的遠(yuǎn)程服務(wù)器端處理的程序是一節(jié)連續(xù)的處理。
3.根據(jù)權(quán)利要求1所述的一種遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法,其特征在于所述的遠(yuǎn)程服務(wù)器端處理的程序是多節(jié)連續(xù)的處理。
4.根據(jù)權(quán)利要求1所述的一種遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法,其特征在于所述的遠(yuǎn)程服務(wù)器端處理的程序是一節(jié)不連續(xù)的處理。
5.根據(jù)權(quán)利要求1所述的一種遠(yuǎn)程關(guān)鍵運(yùn)算軟件防破解方法,其特征在于所述的遠(yuǎn)程服務(wù)器端處理的程序是多節(jié)不連續(xù)的處理。
全文摘要
本發(fā)明提供了一種全新的基于網(wǎng)絡(luò)的用以實(shí)現(xiàn)對(duì)實(shí)時(shí)在線軟件的更嚴(yán)密的防盜版保護(hù)的遠(yuǎn)程認(rèn)證方法。本發(fā)明是將計(jì)算機(jī)軟件的數(shù)據(jù)處理過(guò)程分為本地用戶在客戶端輸入、服務(wù)器端處理、服務(wù)器端輸出三個(gè)處理階段,服務(wù)器端處理軟件中不可省略的計(jì)算處理,并與本地用戶提供的輸入部分共同完成運(yùn)算。采用本發(fā)明的軟件防破解方法,由于的程序代碼不完整,特別是關(guān)鍵代碼的缺失,對(duì)客戶端軟件的破解如果通過(guò)現(xiàn)在通用的、修改可執(zhí)行代碼跳過(guò)認(rèn)證代碼程序段的方法,客戶端軟件的功能將會(huì)因數(shù)據(jù)處理的斷層發(fā)生故障,從而有效防止軟件的執(zhí)行程序被破解者掌握,預(yù)防了軟件被破解者破解為自由可用的用于其他目的軟件,保證了軟件的安全和人們的利益。
文檔編號(hào)G06F21/22GK1963836SQ20061015104
公開(kāi)日2007年5月16日 申請(qǐng)日期2006年11月21日 優(yōu)先權(quán)日2006年11月21日
發(fā)明者姚念民, 趙建明, 萬(wàn)眾一 申請(qǐng)人:哈爾濱工程大學(xué)