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