《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > 基于DSA算法的軟件注冊碼保護

基于DSA算法的軟件注冊碼保護

2009-08-13
作者:譚毓安,盧 超,崔志剛

??? 摘? 要: 提出一種利用DSA算法生成和驗證軟件注冊碼的方法,。注冊碼的計算和驗證分別使用秘密密鑰和公開密鑰,以保證注冊碼計算的秘密性,。
??? 關(guān)鍵詞: 注冊碼? 軟件保護? DSA數(shù)字簽名算法

?

??? 計算機軟件采用的加密方法可分為硬加密和軟加密。硬加密主要有鑰匙盤,、軟件狗,、CD指紋等,其兼容性較差,、成本高,,不能有效地利用Internet來發(fā)布和銷售軟件。軟加密是通過軟件注冊碼的形式向用戶提供授權(quán),,不依賴于專門硬件,,從而避免了硬加密方法的一些限制。
??? 本文研究了一種通過公開密鑰數(shù)字簽名算法進行軟件加密的方法,。該方法使用DSA(Digital Signature Algorithm)數(shù)字簽名算法對主機ID生成一個數(shù)字簽名作為軟件的注冊碼,,軟件運行時再對數(shù)字簽名進行驗證來判斷軟件的合法性。只有開發(fā)商才能對主機ID進行數(shù)字簽名,,此方法可有效地保護軟件版權(quán),,而且不依賴于任何特殊的硬件設(shè)備。
1? 利用注冊碼實現(xiàn)軟件加密
??? 在軟件運行前,,對計算機硬件進行檢測以獲得該計算機的標識信息,,即代表這個計算機的主機ID,。用戶通過Internet、E-mail,、電話等方式將主機ID提供給軟件開發(fā)商,,軟件開發(fā)商對用戶進行驗證后,再根據(jù)主機ID計算出一個注冊碼,。用戶輸入注冊碼后,,軟件中的程序就可以檢測計算機的主機ID和該序列號是否對應(yīng)。如果用戶將軟件安裝或拷貝到其他計算機上,,由于主機ID不同,,程序就能判斷出該軟件屬于非法使用。微軟最新發(fā)布的Windows XP和Office系列軟件即采用了這種軟加密方式,。這種方式也被稱為許可證加密方式或序列號加密方式,。
1.1 注冊碼的計算和校驗
??? 主機ID可以根據(jù)計算機的CPU序列號、網(wǎng)卡序列號,、硬盤卷標,、BIOS的日期及版本等信息產(chǎn)生。用戶將主機ID提供給軟件開發(fā)商后,,得到一個二元組。該二元組就作為對該計算機的授權(quán),。
??? 二元組的計算在軟件開發(fā)商的計算機上完成,,而該二元組的驗證在用戶的計算機上完成,。計算模塊和校驗?zāi)K分別用于產(chǎn)生和驗證二元組,。因此這兩個模塊之間必須共享一些信息,。計算模塊是秘密的,而校驗?zāi)K(包括校驗過程使用的算法及參數(shù))對破解者是沒有任何秘密可言的,。通過分析校驗算法,,可以獲得注冊碼的計算過程,但不能允許從校驗過程直接推導(dǎo)出計算過程的參數(shù),。一些使用注冊碼方式加密的軟件中,,其校驗?zāi)K暴露了太多的信息,以至于破解者可以開發(fā)出注冊機,,為任何主機ID生成注冊碼,。
1.2 數(shù)字簽名在注冊碼加密的應(yīng)用
??? 軟件開發(fā)商選定一個加密算法和一個私鑰/公鑰對來實現(xiàn)注冊碼加密。私鑰用來為ID產(chǎn)生數(shù)字簽名,,此簽名作為軟件的注冊碼,。公鑰存在于軟件程序中,,校驗?zāi)K得到計算機的ID后,利用公鑰驗證數(shù)字簽名(注冊碼)的正確性,。
??? 使用基于公開密碼體制的數(shù)字簽名算法來計算和校驗注冊碼,,在軟件程序中包含了公鑰和簽名的驗證過程,而注冊碼計算所需要的私鑰則是秘密的,。破解者通過分析,、跟蹤等方法可以獲得注冊碼的校驗過程和公鑰,從而推導(dǎo)出注冊碼的計算方法,,但他不能得到計算過程中所需要的私鑰,,因此不能計算出注冊碼。當密鑰的位數(shù)足夠長時,,使用暴力窮舉法或其他攻擊方法也不能在有效時間范圍內(nèi)根據(jù)已獲得的公鑰計算出私鑰,。
??? 如圖1所示,注冊碼加密包括了密鑰生成,、主機ID生成,、注冊碼計算、注冊碼校驗四個主要模塊,。

?


??? 密鑰生成模塊和注冊碼計算模塊由軟件開發(fā)商掌握,,主機ID生成模塊和注冊碼校驗?zāi)K在軟件中運行。
??? (1)密鑰生成模塊計算出具有一定長度的<公鑰,,私鑰>對,。公鑰由注冊碼校驗?zāi)K使用,而私鑰由注冊碼計算模塊使用,。(2)主機ID生成模塊按照主機的硬件信息計算出一個固定長度的ID,。軟件用戶將主機ID交給軟件開發(fā)商。(3)注冊碼計算模塊根據(jù)主機ID計算出對應(yīng)的注冊碼,,注冊碼就是主機ID的數(shù)字簽名,,使用密鑰生成模塊提供的私鑰進行簽名。軟件開發(fā)將二元組交給用戶,。(4)在運行軟件程序時,注冊碼校驗?zāi)K首先確認ID的合法性,。如果本機的ID與二元組中的ID不一致,,說明該授權(quán)不是對這臺計算機的,程序終止,。ID正確時,,再檢驗二元組是否匹配,即注冊碼是否正確,。如果不匹配,,說明注冊碼是偽造的,程序終止,。
2? 基于DSA算法的軟件加密
??? 數(shù)字簽名算法包括兩大類:基于公開密鑰的數(shù)字簽名和基于共享密鑰的數(shù)字簽名,。前者包括ElGamal、DSA(Digital Signature Algorithm),、RSA(Rivest Shamir Adleman algorithm)等,,后者包括HMAC(Keyed-Hashing for Message Authentication)、Asmuth-Bloom等,。在軟件加密中不能使用共享密鑰簽名方案,,因為校驗?zāi)K中包括的共享密鑰會完全被暴露給破解者。
??? 計算機的ID作為簽名算法的輸入(即消息)得到的簽名作為注冊碼,。算法的公鑰存在于校驗?zāi)K中,,而私鑰則必須秘密保存,由計算模塊使用,。注冊碼的計算和校驗方法不需要保密,。
2.1 DSA算法
??? DSA是Schnorr和ElGamal簽名算法的變種,被美國NIST稱為DSS(Digital Signature Standard)[4],。DSA是基于整數(shù)有限域離散對數(shù)難題的,,其安全性與RSA類似。DSA的一個重要特點是兩個素數(shù)公開,,這樣,,當使用p和q時,即使不知道私鑰,,也能確認它們的安全性,。而RSA算法卻沒有這個特點。DSA算法由于其計算量大,,其所用時間是RSA簽名的10~40倍。在軟件加密中,,簽名的計算和校驗并不頻繁,,因此DSA算法的速度并不會帶來明顯的影響。
??? DSA算法既可用于數(shù)據(jù)的加密解密,,也可用于數(shù)字簽名,。DSA算法產(chǎn)生的數(shù)字簽名由于其長度固定,適合作為軟件的注冊碼,。也可以采用ElGamal,、RSA等其他公開密鑰數(shù)字簽名算法。
??? 算法中應(yīng)用了下述參數(shù):
??? p:L bits長的素數(shù)(L是64的倍數(shù),,取為1024),;
??? q:p-1的160位的素因子,;
??? g:g=h((p-1)/q) mod p,h滿足h((p-1)/q) mod p>1,;
??? x:x??? y:y=gx mod p,;
??? H(x):單向Hash函數(shù)。這里選用安全哈希算法SHA-1(Secure Hash Algorithm),。SHA也被稱為安全哈希標準(SHS,,Secure Hash Standard),是由美國政府提出的,,它能為任意長度的字符串生成160位的哈希值,。
2.2 注冊碼的計算
??? 計算注冊碼的過程實際上就是產(chǎn)生數(shù)字簽名的過程。
??? x為秘密密鑰,,y為公開密鑰,,p、q,、g可由一組用戶共享,。但在實際應(yīng)用中,和RSA算法一樣,,使用公共模數(shù)可能會帶來一定的威脅,。對消息m的簽名協(xié)議如下:
??? (1)將用戶的主機ID作為消息m,使用SHA算法生成ID的報文摘要g=SHA(m),。g的長度為160位,。(2)產(chǎn)生隨機數(shù)k,kk mod p)mod q,。(4)計算k-1 mod q。(5)計算s=(k-1(H(m)+xr))mod q,。(6)簽名結(jié)果(m,,r,s)中的(r,,s)作為主機ID對應(yīng)的注冊碼,。
2.3 注冊碼的校驗
??? 將m和(r,s)作為提供給用戶,。驗證注冊碼的過程就是對數(shù)字簽名進行校驗的過程。
??? (1)獲得主機ID,計算g=SHA(m),。(2)與中的ID相比較,不匹配時驗證失敗,。(3)驗證0-1 mod q。(5)計算uv=wg mod q,,v=rw mod q,。(6)計算v=((gu×yv)mod p) mod q。(7)若v=r,,則認為簽名有效,,證實(r,s)是m的正確數(shù)字簽名,,即可確認用戶輸入的注冊碼是由軟件開發(fā)商簽發(fā)的,。
2.4 私鑰/公鑰對的生成
??? 注冊碼的計算和校驗分別使用一個DSA密鑰對中的私鑰和公鑰。采用Java加密擴展庫JCE的KeyPairGenerator即可生成512位的DSA密鑰對[5],。其主要代碼為:
??? KeyPairGenerator kpg=KeyPairGenerator.getInstance(″DSA″),;
??? SecureRandom secrand=new SecureRandom( );//初始化隨機產(chǎn)生器
??? keygen.initialize(512,,secrand),;//初始化密鑰生成器
??? KeyPair kp=kpg.generateKeyPair( );//生成密鑰對
??? PublicKey pubk=kp.getPublic( ),;//得到密鑰對中的公鑰
??? PrivateKey prvk=kp.getPrivate( ),;//得到密鑰對中的私鑰
2.5 模乘運算
??? 在DSA簽名算法中,需要計算xc(mod n),,其中指數(shù)c很大,,如果直接進行c-1次乘法,計算量太大,。這里采用“平方-和-乘法”方法,,將計算r=xc(mod n)的模乘法的數(shù)目縮小到2t次或更少,這里的t是指數(shù)c的二進制位數(shù)(指數(shù)c以二進制形式表示為ct-1……c2 c1 c0),。
???
??? r的初值為1,。執(zhí)行一個循環(huán)i從0到t-1,每次計算出否則r不變,。
3? 主機ID的匹配
??? 在理想狀態(tài)下,主機ID對每一個計算機應(yīng)是惟一的,。當計算機的某些部件被更換或升級時,,主機ID可能會改變。如果任何一個小的硬件變動都要求用戶重新申請注冊碼,無疑會加重用戶和軟件開發(fā)商雙方的負擔,。因此,,主機ID的選取應(yīng)該能容忍主機上的部分硬件變化。
??? 如表1所示,,主機ID共128位,,包括了9種信息,如CPU,、硬盤序列號,、網(wǎng)卡MAC地址、BIOS出廠時間等,。硬件部件的信息作為SHA-1或MD5等哈希算法的輸入,,取計算結(jié)果的最低若干位存放在主機ID中,例如硬盤型號的哈希值在識別碼中占20位,。

?


??? 軟件運行時,,在取得主機ID后,與中的ID相比較,。如果二者之間只有3項(或更少)有變化,則認為是正常的硬件升級或維修,,匹配成功,。
4? 結(jié)? 論
??? 本文介紹了一種使用DSA簽名算法來計算和校驗軟件注冊碼的方法。利用DSA密鑰對中的公鑰,,注冊碼可以被有效地檢驗,,而用戶和破解者從軟件程序中不能獲得計算注冊碼所需的私鑰。在驗證主機ID時,,采用了多項硬件部件的組合,,既使用戶更換少部分硬件仍能保證其注冊碼的使用。另外,,還可以采取其他方法保護校驗?zāi)K,,防止其被篡改或繞過。
參考文獻
1?? Cronin G.A Taxonomy of Methods for Software Piracy Prevention.http://www.croninsolutions.com/writing/piracytaxonomy.pdf,,2002,,6
2?? Microsoft Corporation. Windows XP Product Activation.http://www.microsoft.com/windowsxp/pro/evaluation/overviews/activation.asp,2002,,8
3?? Nichol A.Windows Product Activation(WPA) on Windows XP.http://aumha.org/win5/a/wpa.php,,2005,3
4?? 吳世忠,,祝世雄,,張文政.應(yīng)用密碼學(xué):協(xié)議,、算法與C源程序.北京:機械工業(yè)出版社,2000

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。