基于RSA加密算法的注冊碼軟件加密保護

計算機軟件是一類特殊商品,極易非法復(fù)制和盜版,為了保護軟件開發(fā)商的利益,必須對軟件進行加密保護。而隨著Intemet的發(fā)展,利用注冊碼機制進行軟件加密保護變得十分普遍,這種保護方法實現(xiàn)起來相對簡單,不需要額外的成本。為此,我們在基于注冊碼軟件加密保護的基礎(chǔ)上提出了一套完整的保護方案,加強了對軟件的保護,更好地防止了非法注冊碼和注冊機的制作。

一、注冊碼軟件的加密保護分析

在注冊碼軟件加密保護方法中,注冊機程序就是通過一定算法將用戶信息換算成注冊碼,可用下式表示:

注冊碼=F(用戶信息)

這一過程與用戶軟件中注冊信息合法性驗證環(huán)節(jié)有著密切的聯(lián)系,軟件合法性驗證有以下兩種基本表示:

注冊碼=F(用戶信息)

用戶信息=F逆(注冊碼)

其中換算關(guān)系設(shè)計的科學(xué)性與否直接關(guān)系到軟件破解的難易程度,因為驗證這一過程必然要暴露在他人計算機上運行,這樣便使得破解者有機會使用類似TRW2000這樣的調(diào)試工具對其進行跟蹤分析,通過分析一方面可以找出合法注冊碼進行網(wǎng)上傳播,另一方面破解者還可以通過進一步分析換算算法從而寫出非法注冊機。這將造成軟件保護失效,嚴重損害了軟件開發(fā)者的利益。

針對這些情況,相應(yīng)又提出了“一機一碼”制,即一臺計算機對應(yīng)一個注冊碼,那么即使某些注冊碼被破解傳播也不能在其他計算機上使用;另外在合法性驗證環(huán)節(jié)上采用注冊機算法的逆算法,即:

用戶信息=F逆(注冊碼)

并將F逆設(shè)計成一個非對稱算法,這樣即使破解者分析出驗證中的F逆算法也很難推導(dǎo)出注冊機中的F算法,也就寫不出非法注冊機了,但是這種加密算法相當不好設(shè)計。

二、完整的軟件保護方案

我們今天設(shè)計的方案是在注冊碼軟件加密保護基礎(chǔ)上采用了“一機一碼”制,密碼學(xué)中成熟的非對稱RSA加密算法,并且利用數(shù)據(jù)庫管理算法密鑰,通過這些措施提高了軟件保護的可靠性,更好地防止了非法注冊碼和注冊機。

1、 用戶軟件注冊流程圈

圖1描述了用戶利用軟件的注冊模塊得出注冊申請碼,以及將開發(fā)商反饋回來的注冊碼寫入注冊表完成注冊的整個過程。其中軟件的不同版本信息對應(yīng)了軟件開發(fā)商數(shù)據(jù)庫中不同的RSA加密算法私鑰,只有當開發(fā)商計算注冊碼時使用的私鑰與用戶軟件驗證程序中使用的公鑰是一對時才構(gòu)成一個完整的RSA加密算法。

基于RSA加密算法的注冊碼軟件加密保護

2、用戶軟件注冊信息合法性驗證流程圖

圖2描述了軟件進行用戶注冊信息合法性驗證的過程。

基于RSA加密算法的注冊碼軟件加密保護
在驗證時軟件再次讀出當前計算機的硬件信息形成一個申請碼,和解密后的明文(就是軟件申請注冊碼時的那臺計算機上的申請碼)作比較,這樣保證了注冊過后的軟件只能在規(guī)定的某臺計算機上使用。

三、基于RSA加密算法的注冊碼軟件加密保護關(guān)鍵部分分析

基于RSA加密算法的注冊碼軟件加密保護采用VC++6.0為開發(fā)工具,Microsoft Access2000數(shù)據(jù)庫保存相關(guān)數(shù)據(jù),關(guān)鍵部分分析如下:

1、注冊申請碼的選取

注冊申請碼也就是軟件用戶要提交給軟件開發(fā)商的用戶信息,因為是“一機一碼”制,所以必須是計算機的唯一性信息。通過這種手段能夠?qū)④浖c某臺固定計算機進行綁定,軟件每次運行時都會去檢查當前計算機的“注冊申請碼”,然后進行合法性驗證,這樣防止了非法注冊碼。方案中采取的是提取計算機的硬盤序列號和網(wǎng)卡的MAC地址,并將兩者糅合成申請碼。

2、用戶與開發(fā)商信息的交換

方案中軟件用戶與開發(fā)商的溝通是必不可少的,用戶需要將申請碼提交給開發(fā)商,同時開發(fā)商又要將注冊碼反饋給用戶,這都將通過網(wǎng)絡(luò)進行。

用戶提交給開發(fā)商的信息主要包括:注冊申請碼,版本信息,電子郵箱,聯(lián)系電話。在用戶端可以直接鏈接到開發(fā)商的網(wǎng)址,例如:

SheIIExecute( NULL,"open","http: //www.nuaa. edu. cn',NULL,NULL, SW_SHOWNORMAL):

注冊信息通過網(wǎng)上注冊直接保存到開發(fā)商的數(shù)據(jù)庫中等待計算。

開發(fā)商在完成注冊碼計算的同時也將注冊碼以郵件的方式網(wǎng)上發(fā)給用戶:

CString str=’‘mailto:”+returnemail;

SheIIExecute(NULL, "open", str, NULL, NULL,SW_SHOWNORMAL);

這里retumemail是當前被計算用戶的郵箱地址。

3、對注冊表的操作

當用戶得到開發(fā)商反饋的注冊碼時必須在計算機里找一個不易被發(fā)現(xiàn)的地方保存起來,為以后注冊信息的合法性驗證環(huán)節(jié)讀入注冊碼作好準備??梢詫⑵鋵懭胱员?,IM配置文件或其他任一文件中,這里采用系統(tǒng)注冊表來進行注冊碼的保存,在存入時盡量將文件夾名取的沒有意義,這樣較為安全。

HKEY retumopenedsubkey;

DWORD dwDisposition;

//注冊表中生成jhylf\\ohs文件夾

::RegCreateKeyEx( HKEY_CURRENT_USER,”Sofiware\\jhylf\\ohs”, O, ““, 0, KEY—ALL—ACCESS. NULL.&retumopenedsubkey, &dwDisposition);

BYTE.lpDatal=(unsignedchar.)(LPCTSTR) m_repstercode;

//將注冊信息寫入注冊表

:: RegSetValueEx( retumopenedsubkey,”注冊號”,0,REG—SZ,lpDatal,m_registercodc. GetLength());

:: RegCloseKey( HKEY_CURRENT_USER);

4、RSA加密算法的引入

RSA非對稱加密算法是由Rivest、Shamir和Adelman創(chuàng)立的,它是密碼學(xué)上十分成熟的加密算法,廣泛用于數(shù)據(jù)文件加密和數(shù)字簽名。該加密算法采用一對公鑰和私鑰,從公鑰很難推出私鑰,反之從私鑰也很難推出公鑰,此難度是基于大數(shù)分解的難度,其簡要原理如下:

(1)產(chǎn)生一對公鑰E和私鑰D,以及模N;

(2)加密:C - (M∧D) modN,用私鑰D對信息M加密,得到密文C;

(3)解密:M’=(C∧E) modN,用公鑰E對密文C解密,得到明文M'。

在方案中,RSA加密算法貫穿于注冊機的制作和注冊信息合法性驗證環(huán)節(jié)。如前所述,驗證解密過程是暴露在用戶計算機上進行,容易被破解者破解。但是采用RSA非對稱加密算法后,即使破解者有可能通過動態(tài)跟蹤在驗證程序中得到算法和公鑰層,只要模數(shù)Ⅳ取適合的長度,并且保證D不要取很容易被猜到的一些常用值,就很難找出加密得私鑰D,沒有私鑰D也就無法寫出非法注冊機程序。本方案中密鑰長度取128bit,即模Ⅳ為256 bit,公鑰層取65 537,私鑰D隨機生成。當然RSA密鑰長度取得越長就使得模N越難分解,算法也就越難被破解。

方案中使用RSA公鑰加密算法大致可以分為以下幾個步驟:

(1)提取本地計算機的硬盤序列號和網(wǎng)卡MAC地址信息形成M(注冊申請碼);

(2)注冊機程序用RSA加密算法對信息M(注冊申請碼)使用私鑰D進行加密得到密文C(注冊碼);

(3)軟件注冊驗證程序用RSA加密算法對密文C(注冊碼)使用公鑰E進行解密得到明文M';

(4)將明文M'與M(當前計算機注冊申請碼)進行對比,相同則表示用戶注冊信息是合法的。

另外方案中RSA加密算法的實現(xiàn)調(diào)用了大數(shù)運算庫Miraclver4.82,其中要被加密的注冊申請碼以及加密私鑰D和模數(shù)N都是從數(shù)據(jù)庫中調(diào)出的,保證了算法的靈活性。加密注冊申請碼成為注冊碼的關(guān)鍵程序?qū)崿F(xiàn)如下:

miracl * mip = mirsys( 100, 0) ;

mip ->IOBASE =16;

big in = miwar(0);

biS out = mirvar( 0) ;

big N = mirvafio) ;

big D = mirvar( 0) ;

TCHAR 8hqm[256J = {0};

TCHAR SN[256] = {0};

m_in. GetWindowText ( shqm, len + 1) ;

bytes_to_big( len, shqm, in) ;

//初始化模數(shù) N

cinstr( N, ( char * ) ( LPCTSTR) retumN) ;

cinstr( D, ( char * ) ( IPCTSTR) returnD) ;

//it算 out =in^D mod N

powmod(in, D, N, out) ;

cotstr( out, SN) ;

//釋放內(nèi)存

mirkill( in) ;

mirkill( out) ;

mirkill( N) ;

//16進制模式

//in放注冊申請碼

//out放注冊碼

//N模數(shù)

//D私鑰進行加密

//16進制

//初始化私鑰D

//以16進制串寫入SN

//釋放內(nèi)存

mirkill(in);

mirkill( out);

mirkill(N);

mirkill(D);

mirexit();

在驗證環(huán)節(jié)中是將從注冊表中讀出的注冊碼用RSA加密算法進行公鑰E(65 537)解密,與上述注冊機實現(xiàn)過程類似。

5、密鑰的數(shù)據(jù)庫管理與更新

首先介紹下RSA加密算法密鑰的產(chǎn)生:

(1)取兩個相近的大素數(shù)P、Q;

(2)計算N= P*Q,Z=(P—1)*(Q-1);

(3)任取一個與Z互素的整數(shù)E;

(4)計算滿足E*D=1 mod Z的整數(shù)D;

(5)(N,E)或E稱為‘‘公開密鑰”;(N,D)或D稱為“私有密鑰”。

RSA加密算法的私鑰(N,D)用于開發(fā)商的加密,公鑰(N,E) (E=65537)在用戶軟件的驗證部分用于解密,如果定期地更換這對密鑰又將會給破解者帶來破解的難度。在這個軟件保護方案中,密鑰對將是隨機生成,并且建立了一套數(shù)據(jù)庫管理方法,將密鑰與不同的軟件用戶關(guān)聯(lián)起來。采用了Access數(shù)據(jù)庫建立了表KEY_TABLE來保存不同版本軟件的加密密鑰(N,D),表USER_TABLE來保存前來注冊的軟件用戶信息:

基于RSA加密算法的注冊碼軟件加密保護

這樣對應(yīng)每一批軟件就可以給出一個版本信息,不同的版本信息又對應(yīng)不同的RSA算法密鑰,通過這種方法保證了密鑰對的更新。當用戶前來注冊時,將通過SQL語句進行兩表聯(lián)合查詢:

Belect SHQM.N,D

from KEY_TABLE.USER_TABLE

where KEY_TABIE. FLAG=USER_TABLE. FLAG

形成一張?zhí)摂M表:

基于RSA加密算法的注冊碼軟件加密保護

這就等于系統(tǒng)自動把每個注冊申請碼對應(yīng)的加密密鑰找了出來,從而使得順利利用RSA算法對申請碼加密生成注冊碼。

6、軟件合法性驗證

用戶軟件每次啟動時讀出注冊表中的注冊碼信息,并將其用RSA算法進行解密得出明文,將此明文與當前計算機注冊申請碼進行對比以判斷合法性。下面的代碼是應(yīng)用軟件啟動初始化時進行判斷的:

if( lstrcmp( shqm, my8hqm)!=0)

{

AfxMessageBox(”對不起,您在本機上的注冊信息不正確!”,

MB_ICONEXCLAMATION);

exit(0;)//軟件強行退出

}

7、程序界面介紹

用戶端負責(zé)注冊申請碼的產(chǎn)生,提交以及將供應(yīng)商反饋的注冊碼進行注冊。

基于RSA加密算法的注冊碼軟件加密保護

注冊機端負責(zé)隨機密鑰的生成,保存以及注冊碼的生成和反饋。

基于RSA加密算法的注冊碼軟件加密保護

方案不僅考慮了“一機一碼”制防止非法注冊碼,也考慮了利用非對稱加密算法來防止非法注冊機的制作。相對于以往單純地利用硬件信息或是自己編寫換算算法來實現(xiàn)軟件加密保護有了更深入的研究,從而實用性也就得到了進一步加強。

?小知識之算法注冊機

算法注冊機是指根據(jù)軟件反匯編得出來的注冊算法,然后使用編程語言寫出來的程序。它的功能是通過用戶提供的注冊序列號、注冊名或者機器碼等去計算出軟件的注冊碼來 。