吳正雪,王靜宇
(內蒙古科技大學 信息工程學院,內蒙古 包頭 014010)
云環境中通常使用基于密文策略的屬性基加密技術[1](ciphertext-policy attribute-based encryption,CP-ABE),由用戶制定訪問策略加密明文數據,通過對訪問策略的判定,實現一對多的數據安全共享。CP-ABE加密機制中,云服務器存儲的密文信息中附帶明文的訪問策略,而實際應用中惡意用戶能夠通過公開的訪問策略竊取用戶的隱私。現有方案通過采用布隆過濾器[2]、雙線性映射[3,4]、訪問結構轉換[5]、隱藏屬性值[6]等技術實現訪問策略的隱藏。但上述文獻都未考慮到實際應用中用戶屬性動態變化的問題,為此大多方案通過更新屬性版本密鑰[7]、撤銷列表嵌入到密文中[8,9]、更新屬性群密鑰[10]等方法實現屬性撤銷。但上述研究都不能確保密文數據的真實性與完整性,區塊鏈技術[11-14]的提出能有效保證交易數據的安全性,具有不可篡改、不可偽造的特性,與加密技術結合能有效解決數據隱私問題。
為設計實現數據可靠性、訪問策略隱私性和動態屬性撤銷,本文結合區塊鏈技術,將對稱解密密鑰使用CP-ABE加密存儲在云服務器中,數據摘要及文件位置等信息存儲在區塊鏈上,實現對數據的完整性審計,防止云服務器篡改數據。同時將訪問策略轉化為訪問樹結構,策略完全隱藏在密文中。當發生屬性撤銷時,由授權中心與云服務器進行密鑰與密文的更新,減輕用戶的計算開銷。

(1)雙線性:對?g∈G, ?a,b∈Zp, 都有e(ga,gb)=e(g,g)ab。
(2)非退化性:e(g,g)≠1。
(3)可計算性:對?g∈G, 存在一個有效的算法可計算e(g,g)。
密鑰加密密鑰樹由屬性管理器(AM)根據用戶屬性集合進行構建,其構建形式為一個完全二叉樹——KEK樹,如圖1所示。每一個vj節點存儲一個隨機值θj,每一個用戶uk與葉子節點相關聯。通過計算從根節點到用戶的路徑節點Path(uk) 與最小覆蓋集Mincs(Gi) 的交集,得到用戶屬性群密鑰,其中屬性群Gi代表擁有屬性atti的用戶集合。具體構建步驟請參考文獻[15]。

圖1 密鑰加密密鑰樹
本文區塊鏈選取聯盟鏈fabric 0.6版本,其采用的共識算法為實用拜占庭容錯算法(practical byzantine fault tole-rance,PBFT)。PBFT共識過程分為4個階段,首先客戶端選取主節點,主節點對交易進行排序,并廣播給其它節點,所有節點對交易進行驗證,計算并廣播其哈希值,節點之間進行哈希值的確認,當客戶端收到f+1個節點的確認消息時,則將交易打包到新的區塊中。具體共識步驟請參考文獻[16]。
本模型中有6個角色,分別為數據擁有者(DO)、數據用戶(DU)、云服務商(CSP)、可信授權中心(TA)以及區塊鏈(BC)和屬性管理器(AM)。如圖2所示。

圖2 系統模型
各個角色的具體介紹如下:
(1)DO:根據相應的訪問策略加密數據,對交易數據進行簽名。
(2)DU:請求訪問數據,解密階段可驗證數據是否被篡改。
(3)CSP:負責存儲加密數據,對密文哈希值進行簽名。
(4)TA:負責系統初始化,為DU根據其屬性集合生成私鑰和屬性群初始密鑰。當發生屬性撤銷時,負責更新屬性群密鑰。
(5)BC:使用聯盟區塊鏈,區塊鏈中每個區塊包含密文的哈希值和密文存儲位置。
(6)AM:負責密文重加密,當發生屬性撤銷時,AM執行密文更新算法,并且AM與CSP不會共謀。
(1)系統初始化階段。
TASetup(1λ,U)→(PK,MSK)。 由TA初始化系統。輸入安全參數λ和屬性集合U,生成系統公鑰PK和系統主私鑰MSK。
CSPSteup(PK)→(CPK,CSK)。 由TA執行,輸入系統公鑰PK,輸出CSP的公鑰CPK和私鑰CSK。
DOSteup(PK)→(DPK,DSK)。 由TA執行,輸入系統公鑰PK,輸出DO的公鑰DPK和私鑰DSK。
(2)密鑰生成階段。
TAKeygen(id,PK,MSK,L)→(SK,KEK′)。 TA執行算法,輸入用戶身份標志id、系統公鑰PK、系統主私鑰MSK和用戶屬性集合L,輸出用戶私鑰SK和屬性群初始密鑰KEK′。
AMKekgen(KEK′,L)→KEK。 算法由AM執行,輸入屬性群初始密鑰KEK′和用戶屬性集合L,輸出屬性群密鑰KEK。
(3)數據文件加密階段。
DOEnc(PK,Data,W)→CT′。 DO執行該算法,算法以系統公鑰PK、明文數據文件Data和用戶訪問策略W作為輸入,輸出中間密文CT′。
AMRenc(PK,CT′)→(CT,Hdr)。 算法由AM執行。輸入系統公鑰PK和中間密文CT′,輸出最終密文CT和密文頭Hdr。
SignatureGen(CT)→(SigCSP(CT),Loc)。 CSP收到 (CT,Hdr) 之后,對CT進行簽名,輸出SigCSP(CT), 并將存儲位置Loc發給DO。
(4)交易產生階段。
TransGen(SigCSP(CT))→transaction。 DO根據CSP發送的SigCSP(CT), 進行密文的驗證,驗證成功則創建交易,將密文哈希值H(CT)、密文存儲位置Loc和DO公鑰DPK保存在交易,計算交易的哈希值H(trans),并向其它節點進行廣播。
(5)解密階段。
Decrypt(PK,SK,CT,Hdr,KEK)→Data。 由DU執行該算法,算法輸入系統公鑰PK、用戶私鑰SK、密文CT、密文頭Hdr和屬性群密鑰KEK,輸出明文信息Data。
(6)用戶屬性撤銷階段。


(1)系統初始化階段。

(1)
CSPSteup(PK)→(CPK,CSK)。 TA選擇兩個大素數p,q,并且計算n=p·q,φ(n) 表示n的歐拉函數。TA選擇隨機數E∈[1,φ(n)],E與φ(n) 互素。CSP計算 (D·E)modφ(n)≡1, 則輸出CSP的公鑰CPK={E,n} 和私鑰CSK=D。
DOSteup(PK)→(DPK,DSK)。 與CSP公私鑰生成方法相同,可以得到DO的公鑰為DPK={E′,n′} 和私鑰DSK=D′。
(2)密鑰生成階段。

AMKekgen(KEK′,L)→KEK。 算法根據1.2節中的方法為用戶生成屬性群密鑰,對于Li=atti,bi, AM計算φi,bi=Path(uid)∩Mincs(Gi,bi), 若φi,bi=?, 則停止計算;反之,計算KEKi,bi=(keki,bi)1/θj=gzi,bi·λi/θj,θj代表對應節點vj∈φi,bi, 輸出KEK
KEK={Li,vj,keki,bi,KEKi,bi}Li∈L
(3)數據文件加密階段。


2)如果孩子節點為未讀狀態,且非葉子節點為“或”門,則所有孩子節點值設置為s,并設置節點為已讀狀態。DO則計算
(2)
輸出中間密文為CT′={W,C′,C′1,C′2,C′3,C′4}。
AMRenc(PK,CT′)→(CT,Hdr)。 AM得到DO發送的中間密文CT′,AM隨機選擇ki∈Zp, 并運行Mincs(Gi,bi) 算法,計算C4=C′4·∏i∈IWe(g,g)ki,C3=C′3,C2=C′2,C1=C′1,C=C′, 則密文與密文頭為
(3)
AM計算密文CT的哈希值H(CT),并發送給DO,并將(CT,Hdr)發送給CSP存儲。
SignatureGen(CT)→(SigCSP(CT),Loc)。 CSP收到(CT,Hdr)之后,計算CT的哈希值,得到H(CT),并且產生簽名SigCSP(CT)=H(CT)Dmodn, CSP將SigCSP(CT) 和密文的存儲位置Loc發送給DO。
(4)交易產生階段。
TransGen(SigCSP(CT))→transaction。 首先DO得到CSP發送的SigCSP(CT), 驗證SigCSP(CT)E=H(CT) 是否成立,如果成立,則CSP正確存儲密文,DO創建交易,并將H(CT)、密文存儲位置Loc和DO的公鑰DPK保存在交易中,計算交易的哈希值H(trans),計算SigDO(trans)=H(trans)D′modn′。
DO提交交易,并向其它節點進行廣播,區塊鏈節點根據DO的公鑰驗證SigDO(trans)E′=H(trans) 是否與交易單存儲的H(trans)相等,一樣則說明交易數據沒有問題,并發送給其它節點進行驗證;否則,返回交易單。
(5)解密階段。
Decrypt(PK,SK,CT,Hdr,KEK)→Data。
DU向區塊鏈請求交易信息,區塊鏈節點將交易單返回給DU,同時DU根據密文存儲位置Loc向CSP請求密文,得到密文信息后,DU根據云服務器返回的密文,計算密文哈希值是否與區塊鏈存儲的哈希值H(CT)相等,相等則說明CSP返回結果是正確的。則DU按照如下過程進行解密
(4)
DU利用解密得到的對稱密鑰k,可得到明文文檔,即Data=Dec(k,C)。
(6)用戶屬性撤銷階段。
當用戶屬性發生撤銷時,TA對系統公鑰、系統主私鑰和屬性密鑰樹進行更新,AM對密文進行更新。操作步驟如下:



(5)
(6)
定理:假設DBDH問題在群 (G,GT,g,p,e) 成立,至少存在多項式時間算法內以一個不能忽略的優勢解決DBDH。
證明:假設敵手A攻破本方案的優勢為ζ,則模擬器B就能以ζ/2的優勢來解決問題,其中ζ是不可忽略的。
挑戰者C在隨機選取a,b,c∈Zp, 設θ∈{0,1}, 當θ=0時,計算Z=e(g,g)abc;θ=1時,則Z代表群GT上的一個隨機值r。挑戰者C將 (g,A=ga,B=gb,C=gc,Z) 發送給模擬器B。模擬器B充當挑戰者C的角色,并執行以下過程。
(1)系統建立。敵手A將挑戰訪問樹R、挑選的質詢屬性i*發送給模擬器B。
(2)初始化階段。B定義系統屬性集U,并且為每個屬性atti∈Ux, 隨機選取zi,bi∈Zp, 并計算Zi,bi=gzi,bi,Ti,bj=g1/zi,bi, 令α=ab, 則系統公鑰為:PK={e,g,e(g,g)α,{Zi,bi,Ti,bi}1≤i≤n,1≤j≤ni}, 并發送給C,并創建列表K表示用戶id存儲的密鑰查詢。



設置c為根節點的值,并標記為已讀,所有的孩子節點設置為未讀狀態,則每個未讀的非葉子節點進行如下遞歸運算:

2)如果孩子節點為未讀狀態,且非葉子節點為“或”門,則其所有孩子節點值設置為c,并設置節點為已讀狀態。模擬器B隨機選擇ki∈Zp, 計算
(7)
則CT={C1,C2,C3,C4}, 模擬器B生成密文頭
(8)
模擬器B執行AMUpCT算法更新CT和Hdr
(9)
(10)
并將作為挑戰密文的密文CT′={C′1,C′2,C′3,C′4} 和密文頭Hdr′發送給敵手A。
(5)階段2。同階段1,但查詢不到正確的密文解密私鑰。
(6)猜測。敵手A輸出關于θ的猜想為θ′。如果θ′=θ,則B輸出0,則對應Z=e(g,g)abc, 密文CT有效,則敵手優勢

(11)
反之,輸出1,對應Z=r,密文CT對A來說是完全隨機的,則
(12)
即選擇明文攻擊的游戲中,計算出模擬器B的優勢為

(13)
則模擬器B解決DBDH問題優勢為ξ/2,基于上述過程證明系統的安全性。證畢。
4.2.1 不同方案功能對比
如表1所示,本文與文獻[5,9,10,14]的方案進行功能特征對比。文獻[5]方案實現了策略隱藏,但在屬性動態變化的場景里并不適用。文獻[9,10,14]都支持屬性撤銷,但訪問策略對所有用戶可見,隱私安全性得不到保證,其中文獻[14]方案通過結合區塊鏈技術實現管理用戶撤銷列表,無需可信中心就能執行密鑰的生成與更新。文獻[9]和文獻[14]支持LSSS訪問策略,策略表達更靈活,但策略復雜,計算開銷較大。雖然本文方案訪問結構為樹形,但在實際應用中是可以接受的。

表1 不同方案功能對比
綜上所述,本文方案結合區塊鏈技術,實現用戶對數據完整性的可驗證,保證了云服務器返回結果的正確性。方案不僅實現策略隱藏,并且實現了屬性撤銷功能,功能性較強。
4.2.2 不同方案存儲開銷對比
本文與文獻[5,9,10,14]方案在存儲開銷進行對比分析,如表2所示。 |G1|、 |G2|、 |Zp| 分別表示群G、群GT、域Zp上的一個元素的長度,nu、na、nk分別代表系統、DO訪問策略(LSSS和訪問樹)和DU的屬性個數,|CK|、|KK|分別代表密文頭、屬性群密鑰的長度,r代表撤銷用戶的數量。

表2 不同方案存儲開銷對比
TA存儲開銷主要是系統主私鑰的長度。文獻[5,9]方案系統主私鑰長度為常數級別,文獻[10]和本文方案存儲代價隨著系統屬性數量線性變化。
DO存儲開銷主要取決于系統公鑰長度。文獻[10,14]方案使用較少的存儲開銷,文獻[5,9]和本文方案系統公鑰存儲長度與系統屬性數量有關。
CSP存儲開銷主要來自于密文和密文頭。文獻[5,9,10,14]方案密文長度與用戶訪問策略屬性個數呈線性正相關,文獻[10]與本文方案不僅存儲密文,還要存儲密文頭,但本文方案中密文長度恒定,密文頭長度隨訪問策略屬性數量線性增長。
DU存儲開銷主要為密鑰長度。由表看出,文獻[5,9,10]和本文方案私鑰存儲與用戶屬性有關,并且文獻[10]和本文方案需要額外存儲屬性群密鑰,文獻[14]方案采用外包解密技術,用戶只需要存儲最后的私鑰就可,因此存儲代價最小。
4.2.3 不同方案計算開銷對比
基于CP-ABE的數據共享方案中,雙線性配對和指數運算用來表示其計算性能,因此忽略哈希運算所消耗的時間,與文獻[5,9,10,14]方案在加密和解密階段的計算開銷進行對比,如表3所示。其中,EG、EGT、p分別表示群G上的指數運算、群GT上的指數運算和1次雙線性對操作,ns、nd分別代表DO訪問策略和DU解密時需要的屬性個數。

表3 不同方案計算開銷對比
數據加密階段,DO首先加密數據得到中間密文,其子項C′1和C′2計算開銷為EG+EGT,C′3和C′4計算開銷為ns(EG+p), 則總開銷為: (ns+1)EG+EGT+nsp。 文獻[5,9,10,14]與本文方案中DO加密計算開銷都為線性變換,但文獻[9,14]方案中變化的斜率較大。
用戶解密過程中,數據使用者需要進行較多的雙線性運算,其計算代價為: (nd+3)p+EGT。 其中,文獻[14]方案中采用外包解密技術,計算開銷最低。
從表3可以看出,本文與文獻[5,9,10]方案加密計算代價都與用戶訪問策略屬性個數相關,但本文方案解密效率較高。
4.3.1 加解密時間消耗
本文與文獻[5]和文獻[10]方案在加密、解密階段的時間消耗進行實驗對比,方案采用JAVA中基于配對的密碼學(JPBC)庫進行仿真實驗,具體的實驗環境為Intel Core i7-8700 CPU處理器,內存為16 GB,操作系統為Windows10 64位。
實驗使用Type A型的素數階橢圓曲線,橢圓曲線為y2=x3+x,代碼基于JPBC-FAME與ConstantSizeCPABESE進行修改編寫。
本文方案主要是對用戶的加解密時間消耗進行仿真。實驗中,設置5種不同的訪問策略,以10為屬性增量,從10增加到50。不同的訪問策略,數據取10次實驗的平均值作為實驗結果。
如圖3所示,文獻[5]和文獻[10]方案加密消耗時間在相同屬性數量下相似,但本文方案加密時間較長一些,因為在保證密文長度恒定時需要額外的雙線性運算,計算開銷較大,但存儲開銷較低。

圖3 加密時間對比
解密時間消耗對比如圖4所示,解密消耗時間都隨著解密屬性數量增加而增加,但文獻[5]和文獻[10]方案中解密消耗時間變化的斜率較大,相同解密屬性數量下本文解密消耗時間是最低的。

圖4 解密時間對比
綜上,本文方案屬性撤銷時密鑰更新與密文更新由TA和AM執行,DO只參與加解密階段,并且具有較高的解密效率。因此,方案對于屬性頻繁變動的場景是適用的。
4.3.2 PBFT算法通信次數分析
本文使用PBFT算法實現共識,當系統節點為n個時,在客戶端請求階段,通信次數為n次;預準備階段,主節點與其它節點通信,次數為(n-1)次;準備階段,每個節點都與其它節點進行通信,則通信次數為 (n-1)(n-1) 次;確認階段需要n(n-1) 次;回復給客戶端階段需要n次,總通信次數為2n2次。通信次數圖像如圖5所示,并對函數進行取對數運算。可以看出,當節點達到一定數量時,通信次數會隨著節點數量的增加緩慢上升。

圖5 PBFT算法通信次數
本文通過結合區塊鏈技術,提出了支持策略隱藏與撤銷的CP-ABE方案,用戶不僅實現數據自主權,并且確保數據具有完整性、真實性。首先,明文形式的訪問策略存在信息泄露的問題,因此實現策略隱藏是有必要的。其次,屬性的即時撤銷保證被撤銷的用戶無法獲得數據的訪問權。同時方案中恒定的密文長度,減輕了云服務器的存儲負擔。最后,在標準模型下,基于DBDH假設完成安全性證明。與同類方案對比,加解密效率較高,并且方案功能性較強,更符合當前云環境的需求。