熊禮治,朱蓉,付章杰
(1.南京信息工程大學計算機學院、軟件學院、網絡空間安全學院,江蘇 南京 210044;2.數字取證教育部工程研究中心,江蘇 南京 210044)
在當今信息爆炸的時代,用戶通信的隱私和信息的安全傳輸越來越被重視。傳統的加密通信方式是直接將明文轉換成密文來實現通信。但是,密文容易引起攻擊方的注意,使攻擊方試圖破解或者破壞密文信息,阻礙通信傳輸。因此,隱蔽通信提供了一種能讓秘密信息的通信過程不被察覺的解決方案。
隱蔽通信模型最早源于Simmons[1]提出的囚徒模型,將其擴展到計算機網絡通信[2]中,如圖1 所示,可以抽象為Alice 與Bob 通過接入網絡的計算機進行交流,Alice 需要選擇一個看似平常的消息M,將秘密信息m 使用密鑰加密后嵌入載體M 中,并且不改變M 原有的特性,使攻擊方Wendy 無法獲悉通信雙方的身份,并且就算截取到載體M 也無法獲得秘密信息。

圖1 網絡通信中的囚徒模型
現有網絡系統中的存儲型隱蔽信道主要運用網絡通信協議的冗余部分,例如在網絡協議、網絡數據包頭部的保留字段嵌入秘密信息;時間型隱蔽信道不改變網絡數據包的信息內容,它運用約定的協議數據單元中網絡流量的時間特征(例如,數據包到達的順序或者規定時間內數據包到達的數量等),來傳遞秘密信息。
隨著科學技術的迅速發展,傳統的網絡隱蔽信道面臨若干挑戰。1)存儲型隱蔽信道的可靠性和隱蔽性依賴于網絡數據包的傳輸,容易被支持向量機方法[3]檢測,被基于內容的方法識別[4],被通信歸一化等基于內容修改的新技術消除[5-6]。2)時間型隱蔽信道受網絡環境影響很大,容易被數據延遲、數據包丟失、噪聲等問題干擾。3)傳統的網絡隱蔽信道中,通信雙方都采用靜態且單一的路徑實現直接通信,其匿名性很難保證。
2009 年,比特幣[7]一詞首次被提出,從中引申出了區塊鏈的概念,區塊鏈是一個由對等(P2P,peer to peer)節點共同參與的數據共享,不可篡改且不可偽造的分布式數據庫系統,不存在中心節點,由一串利用密碼學方式生成的數據區塊組成,每個區塊中包含交易、時間戳、上一區塊的哈希、困難目標等信息,從創世區塊開始通過哈希指針連接到當前區塊,數據結構類似于鏈表。比特幣網絡中的所有節點都包含這些區塊,整個網絡被視為包含交易記錄的分布式賬本。賬本中的交易通過比特幣用戶的公鑰地址完成,每個用戶可擁有多個公鑰地址,且地址與實際身份無關。因此,比特幣區塊鏈具備數據同步、安全可信、匿名性強、去中心化的特點,是構建隱蔽信道的天然載體。
然而,正是因為區塊鏈具有數據可追溯、永久存證[8]的特性,在區塊鏈中構建隱蔽信道存在一些問題。1)新產生的交易和區塊需要在全網節點間進行廣播,網絡中的所有節點都能查看交易和區塊內容;2)交易和區塊被驗證上鏈,意味著隱蔽通信的“證據”被永久記錄在區塊鏈賬本中,所有用戶都可以通過相關的應用程序編程接口(API,application programming interface)無限次地獲取該“證據”,這對隱蔽通信的隱藏算法要求相當高。
針對區塊鏈網絡隱蔽通信技術存在的問題,本文設計了一種基于交易構造和轉發機制的區塊鏈網絡隱蔽通信方法。在本文方法中,隱蔽通信雙方首先利用比特幣底層節點的連接機制成為鄰居節點;然后發送方借助比特幣交易的構造機制創建無效交易,并將秘密信息嵌入其中;最后發送方利用比特幣交易的廣播機制向接收方發送含有秘密信息的無效交易。由于比特幣交易轉發機制的泛洪廣播特性,每次隱蔽通信中,發送方發出的包含秘密信息的無效交易只在其鄰居節點之間傳播。除隱蔽通信接收方之外的節點在交易驗證不通過后會立刻拋棄該交易,因此,無效交易不會永久存儲在區塊鏈賬本中,隱蔽通信的“證據”在通信結束后立即消失。本文方法不僅解決了現有區塊鏈網絡中隱蔽通信技術存在的問題,并且在一定程度上擴大了隱藏容量,提高了通信效率。
本文貢獻點可以總結如下。1)本文方法中傳遞秘密信息使用的交易不會廣播給區塊鏈網絡中的所有節點,并且此交易不會永久存儲在區塊鏈的賬本中,隱蔽通信不會留下“證據”。2)利用比特幣的交易構造機制來構造無效交易,只需要保證數據格式和長度與正常交易相同,所有可修改字段都能用于嵌入秘密信息,擴大了隱蔽通信信道的隱藏容量。3)接收方作為發送方的鄰居節點,在發送方廣播交易的第一輪能立刻收到無效交易,不需要等待交易廣播給所有節點,隱蔽通信的通信效率得到了提升。
當前的比特幣區塊鏈網絡隱蔽通信方案可以分為存儲型和時間型2 種。現有的存儲型隱蔽通信方案中,包含秘密信息的交易在全網范圍的節點間廣播,且最終會被永久存儲在區塊鏈的賬本中,任何人可隨時查看,因此在構建存儲型隱蔽通信信道時,需要特別考慮其隱蔽性和不可感知性,難以兼顧隱藏容量高、通信效率快和隱蔽性強3 種性質。
Partala[9]通過犧牲隱蔽通信信道的隱藏容量和通信效率達到強隱蔽性,首次提出使用比特幣地址的最低有效位(LSB,least significant bit)嵌入秘密信息,在每個區塊中按順序存放一筆包含秘密信息的交易,從而初步完成了隱蔽通信,為相關研究提供了方向。不過該方案在一個區塊生成的時間間隔內僅傳遞了1 bit 的秘密信息,信道的隱藏容量低,同時,Cao 等[10]在區塊鏈中提出了一種基于哈希鏈的隱蔽數據嵌入方案,保證了嵌入數據的隱蔽性和安全性,但是每條交易也只能傳遞1 bit 的秘密信息,此類方案在效率和成本上均不盡人意[11]。
DLchain[12]和ChainChannel[13]使用秘密信息代替簽名算法中的私鑰和隨機數,保證了一定的嵌入容量和信道的隱蔽性,但是接收方在篩選和提取秘密信息時計算量較大,降低了信道的效率。
Gao 等[14]、Plohmann 等[15]、呂婧淑等[16]使用比特幣交易中的默認存儲字段OP_RETURN 和coinbase 嵌入秘密信息,只要保證數據格式和字段長度正常,就能達到高隱蔽性和較高隱藏容量,但默認存儲字段比較特殊,很容易引起攻擊方的注意,導致隱蔽信道被干擾。Zhang 等[17]利用vanitygen 生成特殊比特幣地址,地址中嵌入base58 編碼的信息,并將特殊地址的索引記錄在OP_RETURN 中,從而提高了信息嵌入效率以及默認存儲字段的隱蔽性。
上述關于區塊鏈網絡中存儲型隱蔽通信的方案中,包含秘密信息的交易都在區塊鏈賬本中永久存儲,并且任何人都可以申請查看相關交易。隨著技術的發展和研究的深入,攻擊方有足夠的時間收集數據進行分析,使以這種方案傳輸的秘密信息有泄露的風險。
現有的時間型隱蔽通信方案中,李彥鋒等[18]提出基于業務操作時間間隔的區塊鏈網絡隱蔽信道,利用區塊鏈中的交易發送間隔的不同作為調制方式來傳遞秘密信息,其網絡流量波動較大,與發送正常交易時的網絡流量不同,隱蔽性很低。呂婧淑等[16]提出的地址廣播信道通過比特幣交易中某些參數的排列方式與編碼方式進行映射來傳遞秘密信息,隱蔽性極高,但是其容量和效率完全依賴于地址的個數,可用性和可擴展性不高。
另外,以太坊的研究主要集中在它的安全通信協議——whisper 協議上,whisper 協議中特殊的數據包格式和廣播機制可以保證通信接收方的匿名性。Abdulaziz 等[19]利用whisper 協議構造了去中心化的應用程序,秘密信息可以在其中安全匿名地傳輸。Lee 等[20]在此基礎上提出了一種新的通信應用程序,秘密信息通過whisper 協議進行傳輸,解決了傳統隱蔽通信中的數據偽造和隱私侵犯等問題。Zhang 等[21]使用whisper 協議中的payload 存儲秘密信息,生成的索引填充在padding 字段,從而在已有方案的基礎上增加了隱蔽通信的隱蔽性。
比特幣以去中心化為基礎,信息由網絡中的各個節點共同記錄和維護。一旦網絡中的某個節點花費算力找到滿足比特幣共識機制的隨機值,就能獲得新區塊的記賬權,選擇本地交易池中的交易打包進新區塊,通過比特幣特有的廣播機制向網絡中的其他節點廣播。本文提出的區塊鏈網絡隱蔽通信方法涉及比特幣節點連接機制、比特幣廣播機制,以及比特幣交易,相關介紹如下。
比特幣網絡的一個新節點為了能夠獲取網絡中的信息,必須主動和網絡中已存在的節點進行連接。連接方式有以下2 種。
1)使用種子節點。新節點首先連接比特幣網絡所提供的域名系統種子(DNS,domain name system seed)節點,向其請求所有比特幣活躍節點的IP 地址列表,新節點挑選活躍的比特幣節點進行連接。
2)使用-connect 選項。新節點在加入網絡之前,在配置文件中使用-connect 選項指定已知的若干個活躍的比特幣節點作為自己的鄰居節點。
新節點A 確定好連接的對等節點B 后,會向目標節點B 發送version 消息,目標節點B 每次收到version 后必須回復verack 消息表示收到。若目標節點B 同意被連接,會主動向新節點A 發送自己的version 消息,新節點A 向目標節點B 回復verack消息,即新節點A 和目標節點B 通過圖2 所示的“握手”通信建立連接。

圖2 節點“握手”通信過程
連接完成后,節點A 向節點B 發出包含自己IP的addr 消息并要求節點B 向其鄰居節點進行轉發,使網絡中的更多節點知道新節點A 的加入,并且發出一個getaddr 消息,要求節點B 返回已知的活躍節點以便于尋找更多的節點進行連接,如圖3 所示。

圖3 地址請求過程
已經連接網絡的節點會定期發送addr 信息給鄰居節點來維持連接,若某一節點超過90 min 沒有與網絡中的其他節點進行通信,則默認此節點斷開網絡,連接此節點的其他節點會立刻尋找新的活躍節點進行連接。
區塊鏈網絡中的所有新交易和區塊在創建后都必須向網絡中其他節點進行廣播,在獲得足夠多節點的確認之后,新增的交易和區塊才能被寫入區塊鏈賬本中。但是比特幣的每日交易量大約有60 萬,若隨意進行交易廣播會造成網絡的擁堵和崩潰,為了使傳播和確認效率最大化,比特幣網絡使用Gossip 協議[22]來在各個節點之間同步交易以及區塊的信息。Gossip 協議被設計用來在分布式數據庫的多個節點之間同步和復制數據,讓數據到達網絡中的各個節點,達成“最終一致性”。
在比特幣網絡中,Gossip 協議可認為是包含以下3 個過程的一個簡短循環,直到網絡中的每個節點同步了相同的信息,如圖4 所示。1)從新交易或區塊的信息源開始,選擇一個廣播周期,向其連接的鄰居節點發送inv 消息,其中包括新交易或新區塊的哈希值;2)在每個節點接收消息后,先遍歷本地存儲的交易或區塊的哈希值,若本地存在,則忽略;若不存在,則發送getdata 消息請求此哈希值的全部數據,以驗證交易或區塊的合法性;3)驗證合法后,在下一周期里,向其他的鄰居節點發送相同的inv 消息。

圖4 比特幣廣播過程
區塊鏈交易在2 個“地址”之間進行可靠的、具有公信力的數據傳遞。簡單而言,就是原比特幣的擁有者授權把比特幣轉賬給他人,而新擁有者也可以繼續授權,轉賬給該區塊鏈網絡中的其他人,這個轉賬的過程就是交易。這里說的“地址”是由用戶的公鑰通過橢圓加密算法計算得到的,對外公開,用于發送或接收交易。每個用戶可擁有多個公鑰地址,私鑰由用戶本人保存,用于對交易進行簽名。
根據比特幣源碼中的checktransaction 函數可知,一條有效的比特幣交易需要滿足以下所有條件,若有其中任意一條不滿足,則為無效交易。
1)所有字段的語法和數據格式正確。
2)鎖定時間在規定范圍內。
3)交易大小不低于100 B。
4)解鎖腳本能正確解鎖前置交易。
5)每一個輸入的前置交易不能在節點本地的交易池中。
6)每一個輸入必須要有其前置交易存在,并且未被花費。
7)輸入的總值大于輸出的總值。
8)交易費用不能小于當前網絡的最小值。
比特幣的交易數據格式如表1 所示,包括版本號、輸入輸出數量、輸入輸出數組和鎖定時間。

表1 比特幣的交易數據格式
交易輸入列表的數據格式如表2 所示,包括前向交易的哈希值和索引、解鎖腳本及其長度和交易序列號。

表2 交易輸入列表的數據格式
交易輸出列表的數據格式如表3 所示,包括每筆交易的比特幣數量、鎖定腳本及其長度。

表3 交易輸出列表的數據格式
本節首先定義一個基于交易構造和轉發機制的區塊鏈網絡隱蔽通信模型,然后以此模型為基礎,以比特幣的交易字段為隱蔽通信載體,利用比特幣的交易轉發機制在比特幣底層的 P2P網絡上構建一個基于交易構造和轉發機制的區塊鏈網絡隱蔽通信信道。在比特幣區塊鏈網絡中,同時擁有路由、交易轉發和交易驗證的節點只有全節點,因此,模型中出現的節點默認為比特幣全節點。
基于交易構造和轉發機制的區塊鏈網絡隱蔽通信模型包含信息發送方、信息接收方、秘密信息、交易傳播。對秘密信息的操作包括信息處理、嵌入、提取和恢復,交易傳播包括有效交易的廣播和上鏈以及無效交易的廣播和拋棄。整體隱蔽通信模型分為偽裝階段和傳輸階段兩部分。
偽裝階段的隱蔽通信模型如圖5 所示。

圖5 偽裝階段的隱蔽通信模型
1)隱蔽通信的發送方和接收方通過節點連接機制加入比特幣網絡,進行正常的路由通信。假設發送方Ps有x個一級鄰居節點,節點關系表示為Ps?x,如式(1)所示。

其中,Pr表示接收方。
假設其一級鄰居節點的鄰居節點也有x個,則發送方Ps的二級鄰居節點關系表示為Ps?x?x,如式(2)所示。

2)通信雙方節點進行正常交易的廣播和驗證,維護網絡穩定。比特幣網絡使用Gossip 協議,信息由起始節點發送給一級鄰居節點,再由一級鄰居節點發送給二級鄰居節點,迭代轉發,直到所有的節點都收到信息。假設網絡中節點Po向鄰居節點Ps發送交易TX 表示為To,s,如式(3)所示。

節點Ps對收到的交易進行驗證,將符合驗證規則的交易繼續轉發給Po的二級鄰居節點(即Ps的一級鄰居節點),那么節點Po發送一條有效交易TX在網絡中的傳播可以表示為To,如式(4)所示。

3)有效交易上鏈。網絡中的節點驗證交易TX有效后,將其放入本地的交易池。礦工得到新區塊的記賬權后,選擇本地交易池中的交易打包進新區塊,將新區塊添加到已經形成鏈式存儲的區塊之后。
傳輸階段的隱蔽通信模型如圖6 所示。

圖6 傳輸階段的隱蔽通信模型
1)發送方利用交易的構造機制構造無效交易。首先,發送方Ps利用某種加密方法E 加密原始秘密信息M(m1,m2,…,mn),再通過某種編碼方式R 處理密文M′,使它能更好地嵌入交易中,該過程分別表示為,如式(5)和式(6)所示。

編碼完成后,通過某種方案F 將M′嵌入無效交易TX′中,得到含密無效交易TX′′,過程表示為M′,,如式(7)所示。
2)發送方通過無效交易的轉發驗證機制,向接收方傳輸秘密信息。發送方Ps得到處理完畢的含密無效交易TX′′后,向包含接收方節點Pr在內的鄰居節點發送此交易,表示為,如式(8)所示。

由于TX′′是不符合驗證規則的無效交易,因此包括接收方Pr在內的鄰居節點會拋棄該交易,并且返回拋棄信息給發送方Ps,驗證交易無效后返回的拋棄信息表示為Merror,如式(9)所示。

3)接收方提取信息。接收方Pr收到無效交易后先根據交易的公鑰判斷是否由發送方構造,若是,根據協商好的方案F 對應的提取方案F′對TX′′進行提取,得到編碼后的密文M′,通過編碼規則R 對應的解碼規則R′,以及加密方法E 對應的解密方法E′對密文M′進行解碼,得到最終的秘密信息M(m1,m2,…,mn),過程分別表示為,如式(10)和式(11)所示。

根據以上隱蔽通信模型,構建隱蔽通信信道的方式如下。
首先,偽裝階段是指隱蔽通信的接收方節點先加入比特幣網絡,進行正常的路由通信以及交易(區塊)的轉發。
在區塊鏈中有n個區塊的前提下,接收方節點加入網絡后,一條有效交易被轉發上鏈的過程如下。
步驟1Alice創建一個向Bob轉賬的有效交易TX1。
步驟2Alice 將構造好的交易TX1交給網絡中任意一個節點進行廣播。
步驟3.1信息源節點根據2.3 節的規則驗證TX1是否為有效交易,若為有效交易,則將交易TX1放入本地的交易池中,并且轉發給其一級鄰居節點,執行步驟3.2;若為無效交易,則拋棄交易TX1,并且給用戶Alice 返回信息表示交易被拋棄。
步驟3.2一級鄰居節點接收到新交易TX1后,也會對其進行驗證,若有效,則將交易TX1放入本地的交易池中,并將交易發送給二級鄰居節點(此時接收方節點偽裝成正常節點隱藏在二級鄰居節點中),執行步驟3.3;若無效,則拋棄交易并且向發送此交易的前一級節點返回交易無效的信息。
步驟3.3二級鄰居節點(包括接收方節點)執行步驟3.2 的操作,向下一級節點發送有效交易或者拋棄無效交易。
步驟3.4每一級鄰居節點重復步驟3.2 的操作,直到網絡中的所有節點都接收到交易TX1。
步驟4網絡中的某個礦工節點根據工作量證明協議(POW,proof of work)獲得第n+1 個區塊的記賬權后,將本地交易池中包括TX1交易在內的m個交易打包成第n+1個區塊,區塊數據結構如圖7所示。

圖7 區塊數據結構
步驟5礦工節點將打包好的區塊廣播到網絡中。
步驟6網絡中的其他節點對新生成的區塊進行驗證。
步驟7當新區塊被全網大多數節點驗證合法之后,其中包含的交易(包括TX1交易)才被寫入整個區塊鏈賬本。
發送方節點加入網絡時,使用2.1 節中的節點連接方法2),指定接收方節點作為自己的一級鄰居節點,其他的鄰居節點隨機連接。發送方加入網絡后和接收方節點類似,參與網絡中的所有活動,維持網絡穩定。至此,隱蔽通信的偽裝階段結束,如圖8 所示。

圖8 隱蔽通信的偽裝階段
隱蔽通信的傳輸階段由發送方節點創建包含秘密信息的無效交易TX2開始,傳輸階段分為信息嵌入階段、交易廣播階段和信息提取階段。
1)信息嵌入階段主要是根據2.3 節中列舉的條件來構造無效交易。為了簡化發送方和接收方對信息的處理,選擇將秘密信息編碼后,作為交易相應字段的參數,直接嵌入發送方構造的無效交易中,如文獻[14-15]。
發送方在構建無效交易時,可以將處理后的秘密信息嵌入比特幣交易規定的所有可變字段,例如前置交易哈希、簽名、接收方公鑰等。但是,選擇交易的所有可變字段進行秘密信息的嵌入會增加無效交易的特殊性。為了最大化隱蔽信道的不可感知性以及最大化單次通信的隱藏容量,本文把秘密信息嵌入用戶可自定義字段中容量最大的解鎖腳本(或鎖定腳本)字段,如表2 所示,且遵循其數據格式。
解鎖腳本由數字簽名、公鑰和一些操作碼組成,最后經過編碼變成hex 格式,這樣可以確保只有持有私鑰的用戶才能將交易解鎖,在構造多輸入交易時,解鎖腳本的長度會隨著輸入的個數線性增加。因此,交易包含的輸入個數越多,可以用來進行數據嵌入的空間就越大。
當構造一個輸入一個輸出的有效交易時,轉換為hex 格式的解鎖腳本大約占100~120 B,如圖9 所示。

圖9 一個輸入一個輸出的有效交易
發送方先將秘密信息編碼,然后在編碼完的信息后加上endflag 作為秘密信息結束的標志,未滿足正常解鎖腳本長度的部分使用冗余字段填補,保證字段長度為100~120 B,如圖10 所示。

圖10 含密解鎖腳本的生成
發送方將生成的解鎖腳本使用接收方的公鑰加密,嵌入無效交易中的解鎖腳本字段,生成的無效交易如圖11 所示。

圖11 嵌入秘密數據后的無效交易
2)交易廣播階段由發送方節點發起,向其一級鄰居節點(包括接收方節點)發送構造的無效交易TX2,接收方收到交易TX2后,對其進行驗證,由于交易TX2不滿足有效交易的驗證規則,因此其為一條無效交易。接收方再驗證無效交易TX2創建者的公鑰,若公鑰與發送方一致,則表示交易TX2是一條包含秘密信息的無效交易,對它進行信息提取。其他一級鄰居節點驗證交易TX2無效后將其拋棄,并且返回一條交易被拒絕的消息給發送方節點。
3)信息提取階段是指接收方節點收到發送方節點發送的含密無效交易后,用其私鑰解密無效交易的解鎖腳本,解密成功后,接收方根據endflag找到發送方編碼后的秘密信息,使用通信雙方約定的編碼規則還原秘密信息。至此,隱蔽通信的傳輸階段結束,如圖12 所示。

圖12 隱蔽通信的傳輸階段
隱蔽信道的評價從2 個方面進行:安全性和傳輸效率。安全性是指對于普通節點來說,包含秘密信息的無效交易是無法感知的,并且其特征在統計上不可區分,即在不影響網絡通信和不被普通節點發覺的前提下進行秘密信息的傳輸。傳輸效率包括2 個方面,一是信道單次通信的隱藏容量,二是信道單次通信所需的時間。本節將從安全性和傳輸效率2 個方面分析本文提出的隱蔽通信信道。
4.1.1 抗檢測性
在傳統網絡隱蔽通信中,通常從以下2 個方面檢測是否存在隱蔽信道。1)分析網絡流量。一些時間型隱蔽信道,通常以時間特性為調制方式,會在網絡中造成短暫的流量異常,攻擊方可以通過流量的波動情況檢測出隱蔽信道。2)分析數據包。一些存儲型隱蔽信道,使用協議數據包的冗余字段嵌入秘密信息,攻擊方可以根據數據包內容的規律性和相關性檢測隱蔽信道。
在區塊鏈網絡中,由于嵌入數據時完全按照交易字段的數據格式,且交易內容經過已有規則層層加密,攻擊方想要通過分析交易內容識別隱蔽信道比較困難,因此常用分析網絡流量的方法檢測隱蔽信道,即攻擊方會持續監控網絡中節點造成的流量波動。當發送方節點受到持續監控時,攻擊方分析其發送交易的頻率。假設比特幣區塊鏈的正常網絡活動中,節點發送每條交易的正常時間間隔為σ,5 min 內正常轉發ε條交易,分別使用以下3 種方案(方案A、方案B 和方案C)在網絡中發送秘密信息“001110110110”,造成的網絡流量波動與正常情況的對比如圖13 所示。

圖13 不同方案與正常網絡流量對比
方案A發送方使用每5 min 發送的交易個數“ε?5,ε,ε+5,ε+10”分別表示“00,01,10,11”,那么發送方在傳遞秘密信息時,每5 min 的時間間隔內分別發送的交易個數為“ε?5,ε+10,ε+5,ε+10,ε,ε+5”。
方案 B發送方使用發送交易的時間間隔“σ?10,σ?5,σ+5,σ+10”分別表示“00,01,10,11”,那么發送方在傳遞秘密信息時,發送交易的間隔為“σ?10,σ+10,σ+5,σ+10,σ?5,σ+5”。
方案C發送方使用本文方案將秘密信息嵌入無效交易中,在傳遞秘密信息時,仿照網絡中正常的交易間隔σ發出含有秘密信息的無效交易。
從圖13(a)中可以發現,前25 min 正常通信狀態,每5 min 的交易個數在ε上下波動;25~55 min 時,使用方案A 時每5 min 的交易個數顯著增加,網絡流量波動很大,直到55 min 后通信結束,網絡流量才趨于穩定。從圖13(b)中可以發現,在發送前5 個交易時,方案B 遵循正常交易發送的時間間隔,在σ上下波動;進入信息傳遞階段,在發送第6~第11 個交易的時間內,發送交易的時間間隔與正常時間間隔區別較大,直到發送完第11 個交易后通信結束,網絡流量才趨于平緩。然而,使用本文方法的方案C 在正常通信過程中夾雜著含密交易,整個過程不受時間性質的影響,與正常的交易頻率相似,攻擊方無法通過分析網絡流量的方法檢測到方案C 使用的隱蔽信道。
4.1.2 不可感知性
為了確定網絡中正常節點發送交易的時間間隔,通過調用比特幣測試網絡的開放接口bitcoincore 接入Bitcoin Testnet,設置探針節點監測鄰居節點的活動狀況。當監測x個鄰居節點時,若它們在hh 內向探針節點發送y條交易,那么網絡中的節點每秒大約發送N條交易,如式(12)所示。

實驗設置探針節點對其8 個鄰居節點[23]進行監測,在24 h 內收到了275 440 條交易,因此可知,一個正常比特幣網絡節點每2.5 s 轉發一條交易。則隱蔽通信的發送方仿照正常發送交易的頻率,每間隔2.5 s 發送一條交易,將無效交易夾雜其中發送,不會造成網絡流量的波動,對于其他節點來說是不可感知的。
另外,本文方案中的發送方節點和接收方節點是通過網絡提供的協議正常加入比特幣節點網絡的,沒有修改協議本身的內容,加入之后參與網絡正常活動,維護網絡的穩定性。因此在偽裝階段,發送方節點和接收方節點都是無法感知的。在數據傳輸階段,本文提出的隱蔽信道利用了無效交易作為秘密信息的載體,但是沒有改變交易的數據格式和長度,因此不影響網絡的正常通信。所以,對于普通節點來說,隱蔽信道是無法感知的。
由于比特幣為公鏈性質的區塊鏈,網絡中的所有節點都能夠隨意加入和退出,它們對于交易和區塊的廣播沒有第三方可以控制,因此會出現作惡節點——占用帶寬以及發布不實消息、浪費計算資源的節點(廣播無效交易也是其中之一)。然而,得益于交易轉發機制的泛洪廣播特性,作惡節點每一次的惡行只會影響其鄰居節點,為了網絡中節點的穩定,比特幣網絡設計了對鄰居節點的懲罰機制,偽代碼如算法1 所示。

由算法1 可以發現,當作惡節點發送一條惡意消息后,其鄰居節點不一定會立即斷開。只有當作惡節點的分數減少到閾值以下后,鄰居節點會斷開與它的連接,默認斷開24 h,之后斷開的鄰居節點可以重新連接。此時,作惡節點不會斷開整個比特幣網絡,它會選擇其他節點進行連接。
假設節點將懲罰閾值設為T,懲罰值設為S,那么它可以收到鄰居節點發送的無效交易M條,如式(13)所示。

因此,隱蔽通信雙方連接后,接收方在本地配置文件中將懲罰閾值調整為T<100?MS,即可保持與發送方的穩定連接。
區塊鏈網絡中攻擊方對于網絡流量和交易的監測是通過部署探針節點完成的,假設整個網絡中有α個節點,攻擊方擁有β個節點,若想監測發送方發送的無效交易,攻擊方必須作為發送方的鄰居節點,因為無效交易會在第一輪轉發后被拋棄。假設發送方有γ個鄰居節點,那么攻擊方作為發送方鄰居節點的概率為P1,如式(14)所示,其中C 表示組合數。以此類推,在第i輪中,攻擊方有節點作為發送方鄰居節點的概率為Pi。

隱蔽通信中,若發送方有鄰居節點斷開連接,則替換新的鄰居節點。當進行V輪通信時,攻擊方節點在V輪中一直作為發送方鄰居節點的概率為PV,如式(15)所示。PV隨著通信輪次的增加而逐步減小,因此隱蔽信道對于攻擊方節點來說是不可感知的。

隱蔽通信的共同目標是高效、隱蔽、安全地在用戶之間秘密地傳遞秘密信息。本節從以下幾個方面將本文提出的隱蔽通信方法與現有區塊鏈環境下的隱蔽通信方法進行比較,如表4 所示。

表4 隱蔽通信方法對比
4.2.1 隱藏容量
由于隱蔽通信每輪只通過一條交易完成,因此隱藏容量定義為每條交易可以嵌入的秘密信息比特數(bpt)。
BLOCCE[9]使用交易接收方比特幣地址的最低有效位嵌入秘密信息,每條交易的接收地址只有一個,因此一條交易只能傳輸1 bit 的信息。DLchain[12]通過生成簽名時使用的橢圓曲線算法隱藏秘密信息,用秘密信息代替簽名時的私鑰,由于私鑰固定是 256 bit,則實現了 256 bpt 的隱藏容量。ChainChannels[13]與DLchain 類似,用秘密信息代替簽名時使用的隨機數,由于隨機數固定為256 bit,則它也只實現了 256 bpt 的隱藏容量。KBCC(kleptography-based covert channel )[14]使用交易的OP_RETURN 字段嵌入信息,OP_RETURN 字段的最大容量為40 B,若全部使用可實現320 bpt 的隱藏容量。BDTX[16]使用交易的coinbase 字段嵌入信息,coinbase 字段最大容量為69 B,全部使用可以實現552 bpt 的隱藏容量。
本文方案由于無效交易只在與發送方連接的鄰居節點間傳播,不被區塊鏈賬本永久保存,大部分其他節點無法獲取,因此可以選擇交易的多個字段進行秘密信息嵌入。
當構造一個輸入一個輸出的無效交易時,交易中的前置交易(TXHASH)字段的32 B、解鎖腳本字段120 B、輸出的目的地址字段20 B 都是可變字段,可以用來嵌入秘密信息,若都投入使用,一條交易可以實現172 B 即1 376 bpt 的隱藏容量。另外在構造無效交易時,可以選擇構造多輸入多輸出的交易。因此,本文提出的方案,隱藏容量至少為1 376 bpt,是BDTX 方案的兩倍以上。
4.2.2 通信時間
單次通信時間即發送方傳遞一條密文,從發送方創建交易開始到接收方收到交易為止所需的時間。
比特幣網絡中為了區塊穩定,減少分叉,通過調整難度系數Difficulty 來平衡全網算力,保證新區塊的平均出塊時間為10 min,計算式如式(16)所示,其中Time2016為生成過去2 016 個區塊的時間。若網絡中不產生新的有效交易,那么每10 min 新生成的區塊中只包含創塊交易,即輸出地址為礦工賬戶的區塊獎勵。

BLOCCE[9]要求接收方等待發送方發送的交易被包含進新生成的區塊后,才能從大量交易中篩選出含密交易,因此該方案的單次通信時間即新區塊生成需要的時間。BDTX[16]使用交易的coinbase 字段嵌入信息,但是只有創塊交易含有這個字段,即發送方處理完秘密信息后需要等待新區塊生成,才能隨著創塊交易發出秘密信息。因此,這2 個方案的單次通信時間都為10 min。
DLchain[12]、ChainChannels[13]和KBCC[14]這3 種方案都需要發送方發出交易后,接收方在網絡中監聽篩選特殊交易,當網絡中的所有節點都收到發送方發出的交易后,才能確保接收方節點能夠收到此交易。比特幣網絡使用的是Gossip 協議,節點周期性地向8 個鄰居節點廣播交易信息,當網絡中共有k個節點時,一條有效交易廣播給全網節點需要K=log8k個輪次。目前比特幣網絡中存在節點36 186 個,一條交易廣播給所有的節點需要接近5.05 個輪次。由式(15)可知,交易的一輪廣播需要2.5 s,因此DLchain[12]、ChainChannels[13]和KBCC[14]3 種方案的單次通信時間約為12.5 s。
在本文方案中,接收方的身份是發送方的鄰居節點,接收方可以在發送方廣播交易的第一輪收到含密交易,因此單次通信時間為2.5 s。
本文針對現有區塊鏈網絡下隱蔽信道存在的問題,提出了一種基于交易構造和轉發機制的區塊鏈網絡隱蔽通信方法。利用比特幣交易的構造機制,將秘密信息嵌入交易的可自定義字段,來構造無效交易。由于構造無效交易時不需要遵循復雜的交易規則,只需數據格式和長度滿足條件。因此,可根據秘密信息的長度選擇嵌入秘密信息的字段,隱藏容量是BDTX 方案的兩倍以上。利用交易轉發機制,使無效交易只在發送方的鄰居節點之間傳播,并且不存儲于區塊鏈的賬本中,不會留下隱蔽通信的“證據”,安全性高。此外,本文通過實驗和理論分析論證了該方法的抗檢測性和不可感知性,并且通過計算分析得到,所提方案的隱藏容量和通信效率皆優于現有方案。之后的研究重點是將提出的方法擴展到群隱蔽通信中,在保證含有秘密信息的交易不被保存的前提下,實現多個接收者共同接收秘密信息。