林潔和,張紹華,李 超,戴炳榮
(1.上海海洋大學信息學院,上海 201306;2.上海計算機軟件技術開發中心,上海 201112)
數據共享傳輸的安全可信是當前研究的熱點問題,尤其是近年來,隨著大數據應用程序的發展,人們對數據共享的需求越來越高,同時又對數據安全提出了更多的挑戰。如何安全且可追溯地共享數據信息,同時保護數據隱私已經成為研究熱點之一。傳統的數據共享解決方案以第三方組織為中心,存在數據源真實性存疑、數據共享流向不透明以及數據易泄漏或篡改等問題,這些問題是設計數據共享系統的最大障礙。
區塊鏈技術的出現為解決數據的安全共享提供了一種嶄新的思路。區塊鏈這一概念最早出現于2008年11月一篇名為《Bitcoin:A peer-to-peer electronic cash system》[1]的論文中。該文提到區塊鏈技術是支撐比特幣數據結構以及加密交易信息傳輸的重要基礎。區塊鏈是一種在對等網絡環境下構建出來的,具有不可偽造、難篡改且可追溯特點的鏈式數據結構,用以實現和管理交易處理,具有去中心化、開放、匿名和難以篡改信息的特征。總的來說,區塊鏈可以被視為去中心化的可信第三方,借助區塊鏈這樣的虛擬受信任第三方,用戶可以實現數據的安全共享。
針對區塊鏈用戶之間的數據安全傳輸和共享問題,有些研究人員希望通過共識算法來保證數據安全,如梅穎[2]使用工作量證明PoW(Proof of Work)機制來防止惡意節點對區塊鏈的攻擊。還有一些研究人員希望利用智能合約來實現數據的安全共享,例如,汪菲等人[3]將區塊鏈技術應用到數據共享中,設計并部署了一種去中心化和保證數據安全共享的智能合約,構造了共享數據的存儲塊結構,提出將共享數據的信息可信地存儲到區塊鏈上,從而實現數據共享的解決方案。Yue等人[4]提出了一種基于區塊鏈技術與智能合約融合的可信大數據共享模型,并為數據擁有者和請求者提供了一個安全可信的數據共享平臺。依靠區塊鏈技術確保了數據的可追蹤性,同時借助智能合約的自動執行為數據安全共享提供了保護。
然而實現數據共享的重中之重還是要通過探索算法來保證數據共享的安全性。例如,Arumugam等人[5]認為RSA算法能夠提供高安全性的數據加密技術。李莉等人[6]為了解決基于區塊鏈的數據共享問題,構建了基于Schnorr的代理重加密方案,通過一個代理重加密密鑰實現了數據的安全共享,但該方案存在通信代價大和計算開銷高的問題。Zhang等人[7]設計了一種基于區塊鏈的安全與隱私保護方案,利用公鑰可搜索加密算法實現了數據安全訪問、隱私保護和安全搜索等功能。然而,這種公鑰可搜索加密方案往往效率較低,其加密算法的運算復雜度以及所生成密文的長度與關鍵詞的個數成正比[8]。郭乃網等人[9]提出了一種基于區塊鏈技術的隱私保護的數據共享協議,該協議利用對稱密鑰對數據進行加密,并用哈希算法完成數據檢驗。該協議雖采用哈希算法保障了數據完整性,但在數據加密方面使用對稱密鑰使得數據共享雙方共用同一密鑰對數據進行加解密,不論是在密鑰的管理上還是加密數據在非安全信道中傳輸時,其安全性都不能得到保障,密鑰泄露的風險大大增加,最終導致數據共享安全性降低。
綜上所述,已有的基于區塊鏈的數據共享方案仍存在效率低、成本高和無法復原篡改數據等問題,難以真正應用于實際。本文提出了一種基于橢圓曲線加密ECC(Elliptic Curve Cryptography)算法的區塊鏈數據共享方案及系統設計。該方案通過智能合約來保證記賬的安全性與完整性,同時借助ECC算法實現數據傳遞雙方密鑰協商以及數據加密,解決了傳統方案效率低、成本高、安全性低和數據被惡意篡改后的復原問題。此外,本文還設計了仿真系統,驗證了該方案的正確性和安全性,并將本文提到的ECC算法與文獻[5]所用的RSA算法在時間效率和空間效率上進行了對比分析。
20世紀80年代,Koblitz[10]和Miller[11]分別提出一種將橢圓曲線原理與密碼學融合的加密算法,即橢圓曲線加密ECC算法。ECC算法是基于橢圓曲線數學理論的一種非對稱加密算法,其安全性基于橢圓曲線離散對數問題求解的困難性。
2.1.1 橢圓曲線的幾何意義
設存在大素數q,整數域Fq以q為模,滿足式(1)的(x,y)稱為Fq域上的橢圓曲線Eq(a,b)的點:
y2modq=(x3+ax+b)modq
(1)
其中,a,b,x,y∈Fq且
Δ=-16(a3+27b2)modq≠0
(2)
2.1.2 橢圓曲線加解密算法原理
設私鑰和公鑰分別為d和Q,即Q=dG,G為基點。
公鑰加密過程為:選擇一個隨機數r,將消息M加密為密文C,該密文是一個點對,即C={rG,M+rQ},其中Q為公鑰。
私鑰解密:根據密文C和私鑰d可計算出消息M,計算公式如式(3)所示:
M+rQ-d(rG)=M+r(dG)-d(rG)=M
(3)
2.1.3 密碼學的困難問題
橢圓曲線密碼學的安全性依賴于被廣泛承認的解決橢圓曲線離散對數問題的困難性上,對應有限域上橢圓曲線的群。故此,對于基于ECC算法的困難問題,給出了如下定義:
定義1(橢圓曲線離散對數問題ECDLP(Elliptic Curve Discrete Logarithm Problem))[12]已知有限域Fq上的橢圓曲線群E(Fq)及其基點U,U的階為大素數n,給定整數x,計算點W=xU很容易。但是,給定點W,計算整數x,使得xU=W卻非常困難。
從橢圓曲線密碼體制提出以來,至今仍沒有有效的方法來破解橢圓曲線的離散對數問題[13]。
1995年,密碼學專家Szabo[14]首次提出了智能合約的概念。其原理類似于狀態機,通過定義多個狀態和規則、設置條件以及觸發相應合同時所需的對應邏輯來自動執行合約。智能合約是利用計算機編程語言實現合約的制定與執行,可通過編輯代碼制定合同的參數、方法和返回值等,并執行合約以實現合同雙方的權利和義務。與傳統合約相比,智能合約可以更好地控制價值的存儲和管理。

Figure 1 Data sharing scheme圖1 數據共享方案
雖然智能合約這一概念提出較早,然而直到區塊鏈技術的隔空問世,智能合約才真正開始在實踐中應用。這是因為智能合約的執行需要能夠支持可編程合約的數字系統和技術,以此來確保合約內容能夠被可靠執行,而非傳統的計算機程序所依賴的可信第三方。經過雙方達成共識后,智能合約的代碼和狀態存儲在區塊鏈上,以實現代碼執行和保障存證記錄的永久性。可見,使用智能合約不僅可以提高交易自動化水平,降低交易成本,而且可以確保交易的安全性。
在詳細描述基于ECC算法的數據共享方案過程之前,先給出方案涉及的符號及其含義,如表1所示。

Table 1 Symbol design表1 符號設計
當前公有鏈上主要承載數字貨幣等資產,聯盟鏈則主要由業務相關方搭建和維護。在諸如比特幣等公有鏈上,用戶間可以便捷、安全地進行資產轉移,礦工只需要驗證并通過交易的哈希值和數字簽名等信息便可以打包生成區塊,存儲在區塊鏈上,任何人無法篡改交易信息。而在聯盟鏈上,機構與機構、用戶與用戶之間更多的是業務和數據上的交互。如圖1所示,即便是基于同一條區塊鏈,不同應用平臺上的數據擁有者與數據請求者之間也需要進行身份認證、協商數據傳輸以及密鑰交換等一系列操作,才能夠實現跨應用平臺的數據共享。只有在保障數據共享安全可靠的前提下,區塊鏈上跨機構間的數據共享流通才能更好地進行,數據價值才得以實現。
本文方案所考慮的應用場景為在聯盟鏈上實現跨機構間數據的安全共享。依托區塊鏈技術實現不可偽造、難篡改且可追溯的記錄數據的共享情況;采用ECC算法對數據加密,提高數據安全;使用協商密鑰加密,實現數據的可逆性驗證,并通過部署智能合約實現區塊鏈上跨機構間的安全和可信數據共享。
3.1.1 數據共享過程設計
基于ECC算法的數據共享過程如圖2所示。

Figure 2 Process of data sharing 圖2 數據共享過程
數據擁有者用戶A發布數據索引。用戶A選定橢圓曲線參數T=(m,f(x),a,b,G,n,h),其中,G為基點,n為點G的階。根據所選的參數T生成私鑰dA、公鑰QA=dAG=(xA,yA),以及隨機取一整數rA∈[1,n-1],生成隨機點(x1,y1)=RA=rAG。用戶A設置交易時間t,以保證交易快速進行,并將數據索引、身份信息、隨機生成點RA和T等參數發送到系統,同時把數據索引與真實數據之間的映射關系存儲在本地數據庫中。
數據請求者用戶B向系統發送數據索引請求,系統中找到對應的數據擁有者用戶A。在系統中創建一個符合交易的智能合約。合約創建后,系統向用戶B發送用戶A的身份信息、參數T和RA。
用戶B根據用戶A選定的橢圓曲線參數T生成密鑰對(私鑰dB、公鑰QB=dBG=(xB,yB)),并隨機取一整數rB∈[1,n-1],生成隨機點(x2,y2)=RB=rBG。用戶B將數據索引、B的身份信息與隨機生成點RB通過區塊鏈底層P2P網絡單播給用戶A,可通過參數選擇是否需要TLS/SSL安全信道進行傳輸。與此同時,用戶B將RB發送給系統。
用戶A接受到請求后,將會對用戶B的身份信息進行驗證。驗證通過后,通過數據索引與真實數據之間的映射關系,從本地數據庫中找到真實數據,并根據用戶B發送的RB、用戶B的公鑰QB計算K。使用用戶B的公鑰QB對真實數據RealData加密后,上傳EQB(RealData)到系統,系統將EQB(RealData)存儲到代理服務器上。同時用K進行對稱加密,發送DK(RealData)給用戶B,用于驗證數據的完整性。
用戶A計算密鑰K的步驟如式(4)和式(5)所示:
sA=rA+x1dAxA
(4)
K=sA(RB+x2xBQB)=rArBG+rBx1xAdAG+
rAx2xBdBG+x1x2xAxBdAdBG=sAsBG
(5)
用戶B利用用戶A發送的RA和用戶A的公鑰QA計算K。將獲取加密后的數據EQB(RealData),使用私鑰dB解密得到真實數據RealData。同時使用K對獲得的真實數據進行對稱加密,與所獲得的驗證數據DK(RealData)進行對比。若對比結果一致,則數據在傳輸過程中是安全的且未被篡改的。若不一致,則用K對獲得的驗證數據DK(RealData)進行解密,即可獲得真實數據。
用戶B計算密鑰K的步驟如式(6)和式(7)所示:
sB=rB+x2dBxB
(6)
K=sB(RA+x1xAQA)=rArBG+rBx1xAdAG+
rAx2xBdBG+x1x2xAxBdAdBG=sAsBG
(7)
3.1.2 智能合約設計
本系統所設計的去中心化和可信數據共享的智能合約包含共享數據上傳、共享數據訪問請求和身份驗證功能,最終完成雙方之間的數據共享。智能合約為數據供需雙方提供了各種所需的調用接口,以方便與區塊鏈進行交互實現各項功能。一旦智能合約部署在區塊鏈上,其預定義代碼將作為合約賬戶存在于區塊鏈網絡中,并且無法更改。當然,合約一旦部署,其預定義的接口函數也可供其他賬戶調用。
該智能合約[14]主要包含以下4個部分:
(1)用戶注冊。利用以太坊(Ethereum network)上的用戶注冊系統,每個用戶可隨機生成一組公私鑰對作為用戶的唯一標識,以便用戶登錄區塊鏈數據共享系統時使用,用戶可以使用私鑰與智能合約進行交互,以實現設備注冊和數據訪問的功能。
(2)設備注冊。數據擁有者僅需在通過身份驗證后提供設備的標識符deviceID,即可完成對多個設備的注冊。通過使用數據擁有者的地址和deviceID的組合作為哈希映射中的鍵,實現了數據的快速定位。
(3)數據上傳。在智能合約允許數據上傳之前,先要將數據上傳到區塊鏈的設備,需要提供數據擁有者的地址、deviceID和上傳的數據。由智能合約檢查數據擁有者是否已經注冊deviceID對應的設備,從而確保只有設備所有者才能執行數據上傳操作。此后,再對共享數據進行加密,將密文存儲至系統的代理服務器,以便后續數據共享。
(4)數據獲取。在進行數據請求時,數據請求者發出一個讀取數據的請求許可,并提供自身地址和deviceID,用于身份驗證。若身份驗證通過,則數據請求者可獲得數據擁有者上傳至系統的密文和相關參數,并通過計算最終獲得共享數據。
智能合約算法如算法1所示:
算法1智能合約算法
輸入:owner_Address,Requester_Address,Data。
輸出:數據交易ID或不具備訪問權限。
1.Begin
2.HashMapdeviceRegistry(owner_Address)
3.returnList[DeviceIDs];
4.HashMapEncryptedData(owner_Address,deviceID)
5.returnList[TxId]//返回交易ID
6.HashMapDataIsAllowed(owner_Addresss,Requester_Address,deviceID)
7.returnboolisAllowed/*審核請求方是否有權限訪問*/
8.FunctionREGISTERDEVICE(owner_Address,deviceID)
9.InsertToHashMap(deviceRegistry)/*數據擁有者注冊*/
10.EndFunction
11.FunctionUPLOADDATA(owner_Address,deviceID,Data)
12.ifowner==owner_Address/*驗證數據擁有者并上傳數據*/
13.EncryptedData[owner,deviceID].List.InsertData(encrypt(Data))
14.EndFunction
15.FunctionGETDATA(owner_Address,Requester_Address,deviceID)
16.ifDataIsAllowed(Requester_Address)==true/*審核通過則可讀取數據*/
17.returnEncryptedData[hash(owner_Address,deviceID])
18.EndFunction
19.FunctionPASSACCESS(owner_Address,Requester_Address,deviceID)/*身份驗證通過*/
20.ifowner==owner_Address
21.DataIsAllowed[hash(owner_Address,Requester_Address,deviceID)]=true
22.EndFunction
23.FunctionREJECTACCESS(owner_Address,Requester_Address,deviceID)/*身份驗證失*/
24.ifowner!=owner_Address
25.DataIsAllowed[hash(owner_Address,Requester_Address,deviceID)]=false
26.EndFunction
27.End
基于ECC算法的區塊鏈數據共享方案主要包含3個模塊:前端模塊、代理服務器模塊和區塊鏈模塊。總體結構如圖3所示。

Figure 3 Structure of scheme圖3 方案結構
前端模塊主要為數據擁有者和數據請求者提供可視化的操作接口。數據擁有者可在此上傳數據,對數據請求者的申請進行驗證以及為數據請求者提供檢索相關數據、申請數據和下載數據等功能的操作。
代理服務器模塊扮演半可信第三方的角色,主要有3個功能:(1)保存數據擁有者上傳的數據密文和相應的加密參數;(2)根據數據請求者提供的關鍵字搜索對應的數據,并將數據擁有者的地址信息和加密參數返回給請求者;(3)確認請求者是否有權限下載數據。將請求者的地址信息和請求的數據信息發送給區塊鏈模塊,由區塊鏈模塊驗證用戶是否有對應這個數據的下載權限,區塊鏈模塊驗證權限之后,會對此次請求結果生成日志上鏈。
區塊鏈模塊分為2個部分:智能合約和底層數據區塊。智能合約是一組定義了區塊鏈系統邏輯的核心合約代碼,由管理員編寫,在系統初始化階段部署在各個節點上,提供遠程接口供用戶調用[15]。智能合約不僅能夠免除因為人工失誤造成的錯誤,還能夠避免操作者對數據進行惡意修改和破壞。在本文方案中,智能合約主要負責管理2種數據:加密數據和訪問控制數據。系統通過調用智能合約的API將數據的密文和訪問控制數據上鏈。底層數據區塊主要負責存儲相關交易數據,即鏈上數據,包含父區塊、時間戳、交易ID、數據共享雙方地址、數據雙方設備ID和隨機數等,它是一個類似鏈表的數據結構,每個節點保存了上一個節點的哈希值,以保證鏈上數據的不可篡改。
本節將對所設計的數據共享方案進行簡單的正確性與安全性分析。仍假設數據擁有者為用戶A,數據請求者為用戶B,數據索引用index表示,真實數據用RealData表示。
在本文方案中,每個真實數據都擁有一個相應的數據索引。用戶之間預先溝通或通過某種手段對這個數據索引達成一致。只有獲取正確的數據索引才有權利共享數據擁有者擁有的真實數據,從而實現對數據擁有者的隱私保護。
用戶A事先在本地數據庫中存儲RealData與index之間的映射關系。用戶A把index和自己的身份信息公布到系統中,當用戶B希望通過某種途徑獲取RealData時,用戶B可以成功地在區塊鏈系統上找到index對應的區塊,并獲取用戶A的身份信息。
用戶B將index、id(B)和RB發送給用戶A后,用戶A可查找本地是否有對應的索引,并驗證用戶B身份標識的有效性。若索引存在且通過身份檢查,則需要向用戶B提供index對應的真實數據。用戶A在本地計算出K后,將真實數據用用戶B的公鑰進行加密,然后將加密后的EQB(RealData)存儲到代理服務器,并發送EQB(RealData)給用戶B。用戶B使用自己的私鑰即可成功解密獲取真實數據。
用戶A在本地用K對真實數據RealData加密,將DK(RealData)發送給用戶B。同樣,用戶B可以對獲得的真實數據RealData用K加密與獲得的驗證數據DK(RealData)進行比較,由于已知破解協商密鑰K是基于一個離散對數問題,難以破解,因此可以用來對數據在傳輸過程中的完整性進行驗證。
從以上步驟可以看出數據共享的整個過程是可行且正確的。在雙方的合作下,只有具有數據索引的數據請求者才可以成功地從數據擁有者獲取數據。
假設數據共享的過程中存在攻擊者,攻擊者可能通過登錄成為了網絡中合法的成員。攻擊者試圖基于數據共享系統中的現有信息或通過竊聽節點之間的通信流來攔截真實數據。但是,本文方案能夠保證以下2點:
(1)攻擊者無法獲得真實數據。用戶A將真實數據的加密形式EQB(RealData)存儲在代理服務器上,即真實數據已經被用戶B的公鑰加密,其中使用的是橢圓曲線加密算法。由于橢圓曲線加密算法的安全性是基于解決橢圓曲線離散對數問題的困難性,因此攻擊者在有限的時間內對其進行破解是十分困難的,也就是說,他無法獲得任何真實數據。此外,攻擊者還可能通過監聽網絡信息來進行主動攻擊。通過模擬用戶B的身份信息,假裝為用戶B,使用戶A認為是用戶B發出的數據請求,有權利獲取真實數據RealData;盡管通過模擬用戶B,將欺騙用戶A并把加密后的真實數據上傳到系統中,但由于攻擊者沒有rB和用戶B的私鑰,攻擊者不能計算出密鑰K,如式(8)和式(9)所示:
sC=rC+x2dCxB≠sB
(8)
K=sB(RA+x1xAQA)≠sC(RA+x1xAQA)
(9)
故此,攻擊者通過嗅探網絡上的數據包進行主動攻擊無法得到真實數據。
(2)攻擊者難以篡改數據。由于用戶A還會發送DK(RealData)給用戶B,用于驗證數據傳遞的完整性,即便攻擊者對EQB(RealData)進行了篡改,也不能對DK(RealData)進行篡改,使得2個密文解密后相同。
因此,從以上角度來看,本文方案具有較強的安全性,能夠抵御惡意篡改和數據竊取等攻擊。
本文實驗所使用的硬件環境為 Intel(R)CoreTMi7-8700 CPU @3.20 GHz,8 GB RAM;操作系統為64位Windows 10;編譯器是IntelliJ IDEA 2020.03和Remix-Ethereum IDE;編程語言為 Java和Solidity;外部資源庫為JPBC和web3.js。在加密過程中,通過 JPBC 實現對數據的加密,并引入相關jar包實現ECC算法加密功能。通過在以太坊平臺搭建的聯盟鏈上進行仿真和測試。
系統可選用的橢圓曲線有sect113r1,sect113r2,sect131r1,sect131r2,sect571r1等18種,本次實驗數據擁有者選用的是sect113r2,因此雙方所生成的隨機密鑰及其他參數如表2所示。

Table 2 Experimental parameters表2 實驗參數
用戶在數據共享時首先要對設備進行注冊,系統將自動分配設備ID,該設備ID與用戶地址相關聯,如圖4所示。

Figure 4 Device registration圖4 設備注冊
如圖5所示,數據擁有者收到數據請求,若對請求者進行授權則validate為“true”,并將數據加密上傳。上傳時需要向智能合約提供使用數據請求者公鑰加密的dataQ、協商密鑰以及用協商密鑰加密的驗證數據dataK。智能合約自動生成鏈上交易ID(txID)和時間戳(txTimestamp),并將加密數據傳輸給數據請求者。

Figure 5 Encrypted data upload圖5 加密數據上傳
如圖6所示,數據請求者用戶B用私鑰dB對加密數據encrypted進行解密,得到數據decrypedQ,即RealData。并計算協商密鑰K,用其對真實數據加密,生成的calData與用戶A所發的驗證數據srcDataK進行對比。對比結果一致則validate返回的為true;若結果不一致,則返回false。可用協商密鑰對srcDataK進行解密,獲得真實數據。此外系統還會將本次數據共享用戶雙方的地址與設備ID記錄上鏈,以便后續溯源。

Figure 6 Data decryption verification圖6 數據解密驗證
本節在Matlab環境下模擬仿真文獻[5]使用的加密算法RSA和ECC這2種算法。由于安全性與破解時間(以每秒處理100萬條指令的處理器運算一年為單位,即MIPS-YEARS)成正相關,本文選用具有相同安全性的密鑰長度,如表3所示。

Table 3 Key bits corresponding to the two public key systems under the same security 表3 同等安全性下公鑰體制對應的密鑰位
為了保證數據的安全性,需要不斷增加RSA 的密鑰長度。然而,密鑰長度的增加將不可避免地占用更多的存儲空間,與使用ECC算法對數據加密的應用對比,使用RSA算法在空間效率上劣勢明顯。此外在相同安全性下,ECC算法所對應的密鑰長度明顯短于RSA算法所對應的密鑰長度,有利于用戶雙方更快地對共享數據進行加解密運算,進而提高數據共享效率。

Figure 7 Comparison diagram of key pair generation speed圖7 密鑰對生成速度對比圖
由圖7可見,RSA算法若想生成難破解的密鑰對需要消耗更長的時間,而本文所采用的ECC算法密鑰在生成時間上有著明顯優勢,這意味者在保障安全性的前提下,ECC算法能更高效地實現數據在區塊鏈系統上共享。且與傳統算法相比,ECC算法在許多方面都具有絕對的優勢,尤其體現在抗攻擊性、資源占用、網絡消耗和加密速度等方面[16]。綜上分析,基于ECC算法的區塊鏈數據共享系統具有耗時短、成本低和安全性高的特點。
本文基于區塊鏈技術在數據共享方面的國內外研究現狀,設計并模擬了基于ECC算法的區塊鏈數據共享系統,且對比驗證了該算法的效率。該系統有如下特點:(1)利用ECC算法這種耗時短、成本低、安全性高的非對稱加密算法對數據進行加密;(2)使用協商密鑰實現數據的可逆性驗證;(3)執行智能合約完成數據共享。該系統既保證了跨機構間數據共享的安全性與完整性,又基于區塊鏈技術使得數據在共享過程中具有不可偽造、難篡改且可追溯的特點。未來將深入研究跨區塊鏈數據共享方案,在保障數據安全的條件下,實現2條獨立區塊鏈之間的數據共享。