摘 要 基于軟件的保護方式主要有注冊碼和許可證文件,本文介紹了將單向散列函數(shù)同公開密鑰相結合實現(xiàn)數(shù)字簽名技術,提出了一種軟件許可證生成、驗證的許可系統(tǒng),并基于GNU開源庫Libgcrypt為電信設備實現(xiàn)許可證系統(tǒng)。與傳統(tǒng)技術相比,該系統(tǒng)具有簡單易用、安全可靠的特點。
關鍵詞 Libgcrypt庫 許可證文件 數(shù)字簽名 簽名校驗 RSA
1 引言
現(xiàn)在越來越多的電信設備使用基于軟件的許可證方式來實現(xiàn)版權保護,通過許可證文件對合法用戶進行授權,設備在合法的許可證文件的控制下運行。許可證文件規(guī)定了哪些用戶可以合法使用設備,以及使用設備的哪些功能。傳統(tǒng)的許可證系統(tǒng)通過私鑰生成數(shù)字簽名并形成許可證文件,然后把許可證文件和公鑰傳輸給合法的設備,設備通過公鑰對許可證文件進行數(shù)字簽名的校驗。由于公鑰需要由服務器傳輸給設備,可能被第三方竊取,通過高性能計算機分析破解可能得到對應的私鑰,從而可以自行生成合法的許可證文件。本文在分析傳統(tǒng)許可證系統(tǒng)的基礎上,參考文獻[1-2]設計了新的許可證系統(tǒng),在許可證服務器側和設備側基于密鑰生成參數(shù)獨立地生成相同的密鑰對,服務器通過密鑰對中的私鑰生成數(shù)字簽名并形成許可證文件,設備通過密鑰對中的公鑰校驗許可證文件。這樣,由于不需要直接傳輸公鑰,而是傳輸密鑰對生成參數(shù),密鑰的安全性更高。
2 數(shù)字簽名
2.1 公開密鑰體制
公鑰密碼體制[3]也被稱作非對稱密碼體制,它是現(xiàn)代密碼學的一個重要分支,也是數(shù)字簽名[4]技術的基礎,現(xiàn)有的數(shù)字簽名方案,大多數(shù)是建立在公鑰密碼學基礎之上的。目前,比較成熟的公鑰密碼體制主要有兩類:一類是基于大整數(shù)因子分解問題的,其中最典型的代表是RSA體制;另一類是基于離散對數(shù)問題的,比如EIGamal公鑰密碼和影響比較大的橢圓曲線公鑰密碼。
RSA算法[5]是Rivest,Shamir和Adieman于1978年在美國麻省理工學院研制出來的, RSA算法的體制構造是基于數(shù)論的歐拉定理,其安全性依賴于大數(shù)因子分解的困難性。RSA算法既可用于加密,也可以用于數(shù)字簽名。RSA算法流程如下:
選擇兩個不同的大素數(shù)[6-7],計算乘積n=p*q和φ(n)=(p-1)*(q-1)歐拉函數(shù)值,然后隨機選取一整數(shù)e∈Z,滿足且1≤e≤φ(n)且gcd(e,φ(n)),此時可求得d以滿足ed≡1 modφ(n),則 d≡e-1 modφ(n)。
這樣,得到公開密鑰{e,n},私有密鑰{d,n}(p, q,φ(n) 均需嚴格保密)
在RSA系統(tǒng)中,設m為明文且m 加密算法: c=E(m)≡me(mod n) (1) 解密算法: m=D(c)≡cd(mod n) (2) RSA數(shù)字簽名/校驗與加密/解密類似,一般對明文信息m先作Hash運算得摘要值h(m),數(shù)字簽名: s=(h(m))=mod n (3) 簽名校驗: m=smod n (4) 然后檢查是否成立,即可鑒別簽名是否正確。 2.2 單向散列函數(shù)(Hash函數(shù)) Hash函數(shù)[8]也是密碼學的一個基本工具,在數(shù)字簽名、檢驗信息的完整性等有關方面有重要應用,Hash函數(shù)的安全性直接關系到數(shù)字簽名技術的安全性。Hash函數(shù)是一個將不等長消息壓縮為固定長度消息的確定性算法h,它具有如下性質(zhì): (1)單向性質(zhì):任給消息x,計算h(x)是容易的,而由h(x)計算x是不可行的。 (2)抗沖突性:要找兩個不同的消息x1,x2使得h(x1)=h(x2)是計算上不可行(困難)的。 (3)映射分布均勻性:在散列值h(x)中,0bit和1bit的個數(shù)應該是相當?shù)牡?,且輸入?個bit位的變化,應導致散列值中一半以上的bit位發(fā)生變化。 總之,Hash具有單向性,強抗碰撞性、初始值敏感性和計算快速性的特點。 3 改進的電信設備許可證系統(tǒng) 傳統(tǒng)的許可證系統(tǒng)一般包括許可證服務器和客戶端(實際加載許可證文件的設備),服務器主要是為不同的設備按照設備提供的信息產(chǎn)生密鑰對,提取公鑰{e,n}和私鑰{d,n},并通過私鑰生成數(shù)字簽名,形成許可證文件。將公鑰、私鑰、許可證保存在相應的數(shù)據(jù)庫中,并維護密鑰數(shù)據(jù)庫和許可證數(shù)據(jù)庫。服務器將公鑰{e,n}和許可證文件傳輸給設備,設備通過公鑰{e,n}來校驗許可證文件的數(shù)字簽名。 本電信設備許可證系統(tǒng)根據(jù)實際應用場景對傳統(tǒng)的許可證系統(tǒng)做了改進,即在服務器側和設備側獨立地產(chǎn)生密鑰對,服務器和設備基于相同的密鑰對生成參數(shù)產(chǎn)生相同的密鑰對,服務器提取私鑰{d,n},通過私鑰生成數(shù)字簽名并形成許可證文件;設備提取公鑰{e,n},通過公鑰校驗許可證文件的數(shù)字簽名。與傳統(tǒng)的許可證系統(tǒng)相比,本文設計的許可證系統(tǒng)不直接傳輸公鑰,而是傳輸密鑰生成參數(shù),有效地防止了第三方獲得密鑰并破解,提高了系統(tǒng)的安全性。具體做法是許可證服務器和設備都基于設備的唯一標識ESN和隨機種子RAND值,來產(chǎn)生RSA密鑰體制中的兩個初始化素數(shù)p,q,然后選取私鑰d(私鑰d由ESN和RAND唯一確定),就產(chǎn)生相同的e,即得到相同的公鑰{e,n}和私鑰{d,n}。服務器提取私鑰{d,n},通過私鑰生成數(shù)字簽名并形成許可證文件;設備提取公鑰{e,n},通過公鑰校驗許可證文件的簽名。 3.1 服務器側 電信設備的功能由若干個Feature功能項組成,下圖為一個Feature的簽名。首先為設備生成隨機種子RAND值,并讀取設備唯一標識ESN,以ESN和RANG值產(chǎn)生初始化的p、q,調(diào)用密鑰生成函數(shù),生成唯一的密鑰對,從密鑰對中提取私鑰,通過提取的私鑰對設備的Feature逐個生成數(shù)字簽名,最終形成許可證文件,詳細流程如圖1所示。 具體到許可證文件中單個Feature的簽名,流程如圖2所示。首先對Feature明文作Hash摘要,然后用上述提取的私鑰對摘要作簽名,將簽名信息Sign附在明文Feature之后,就完成了一個Feature的簽名,依次可以對所有的Features簽名,從而得到帶有RSA數(shù)字簽名的許可證文件。 3.2 設備側 設備側通過公鑰實現(xiàn)對許可證文件的校驗,是服務器側許可證文件簽名的逆過程,具有處理流程如圖3,其中,密鑰對的產(chǎn)生及公鑰的提取與服務器側相同。 首先設備導入從服務器接收到的隨機種子RAND值并加載許可證文件,同時讀取設備唯一標識ESN,以ESN和RANG值作為輸入產(chǎn)生初始化的p、q,與服務器側生成相同的密鑰對并提取出公鑰{e,n},進入許可證文件校驗模塊,通過公鑰{e,n}依次完成對各個Feature的校驗。對于校驗通過的Feature,則激活對應的功能;對于校驗失敗的Feature,則進入校驗失敗相應的處理(如:提示用戶該Feature對應的功能校驗失敗,或及時付費或請求用戶聯(lián)系廠商等)。 具體到許可證文件中單個Feature簽名的校驗,流程如圖4所示。首先對Feature明文作Hash變換,得到Hash摘要;同時用對應的RSA公鑰校驗Feature的簽名,得到相應的Hash摘要。如果Feature明文得到的摘要和簽名校驗得到的摘要匹配,則校驗通過,激活該Feature對應的功能;同樣,如果摘要不匹配,則進行校驗失敗相關處理。 4 許可證方法的實現(xiàn) 本文設計的電信設備許可證系統(tǒng),可以在Linux平臺上基于Libgcrypt來實現(xiàn),Libgcrypt是GNU的開源加密庫,基于數(shù)據(jù)結構MPI(multi_precision-integers)和S表達式(S_expressions)[9],支持常見的對稱密鑰加密算法,公開密鑰加密算法和Hash算法。 4.1 公鑰/私鑰對的生成及提取 GNU的Libgcrypt庫是隨機生成密鑰對的,主要是p、q是選取隨機的。本文設計的許可證許可系統(tǒng)要求許可證服務器和設備生成相同的密鑰對,因此需要修改Libgcrypt庫密鑰生成部分。通過ESN和RANG值分別初始化p、q,同時密鑰對中的私鑰d也由ESN和RANG值唯一確定。 創(chuàng)建存放密鑰對的S表達式gcry_sexp_new (key_spec,\"(genkey(rsa(nbits 4:1024)))\",0,1); 調(diào)用密鑰生成函數(shù)gcry_pk_genkey(key,key_spec);將生成的密鑰對按照key_spec設定的格式存放在S表達式變量key中。 提取公鑰{e,n}:由函數(shù)pub_key = gcry_sexp_find_token(key,\"public-key\",0);實現(xiàn)。 如圖5所示。 提取私鑰{d,n}:由函數(shù)gcry_sexp_find_token (key, \"private-key\", 0);實現(xiàn)。如圖6所示。 4.2 Hash摘要 genhash(char *ch)函數(shù)依次調(diào)用Libgcrypt庫的以下函數(shù)gcry_md_open(),gcry_md_enable(),gcry_md_write(),gcry_md_read(),gcry_md_close()實現(xiàn)對Feature的Hash摘要。 將Feature生成的Hash摘要寫進S表達式,如圖7所示。 由函數(shù)gcry_sexp_build(data,NULL,\"(data (flags pkcs1)(hash sha256 %s))\",ch);實現(xiàn) 4.3 簽名生成及校驗 利用提取的私鑰{d,n}對Hash值進行加密,得到簽名Sign信息,如題8所示。 由函數(shù)gcry_pk_sign(sig,data,sec_key);實現(xiàn) 設備在使用許可證文件時,對簽名進行校驗,首先對Feature明文作摘要變換,得到摘要值,流程如4.2所示,并將Feature生成的Hash摘要寫進S表達式data。 校驗通過gcry_pk_verify(sig,data,pub_key);實現(xiàn),利用提取的公鑰{e,n}對簽名Sign解密得到摘要值,然后檢查是否成立。 5 分析及結論 本文設計的許可證方法,在傳統(tǒng)的許可證方法上加以改進,不直接傳輸密鑰,而是傳輸密鑰生成參數(shù)ESN和RANG值,密鑰更隱蔽、更安全。服務器和設備基于密鑰生成參數(shù)獨立地產(chǎn)生相同的密鑰對。設備標識ESN一般選取設備的硬件編號,如硬盤序列號、網(wǎng)卡MAC地址及系統(tǒng)處理器型號等,為保密起見,還可以將設備標識ESN通過哈希算法生成固定長度的摘要值h(ESN)作為ESN,這樣安全性更高;隨機種子RAND值由許可證服務器隨機產(chǎn)生,與設備一一對應,與許可證文件一起傳給設備。 ESN和RAND值與密鑰的雙重綁定提高了系統(tǒng)的安全性,可以更有效地防止非法偽造或篡改許可證文件,如果結合軟件自檢測防篡改技術[10]及反跟蹤技術,還可以進一步提高系統(tǒng)安全性,保護知識產(chǎn)權。