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