曾寶葦 羅 銳
(成都理工大學,四川 成都610000)
秘密共享方案分擔了密鑰的管理風險,其主要解決了兩方面的問題:(1)部分密鑰泄露,不影響整體秘密信息的安全性;(2)部分密鑰遺忘,不影響整體秘密信息的恢復;但傳統秘密共享方案中還存在一些安全性問題:秘密分發過程中,秘密分發者在知道參與者秘密份額的情況才進行欺騙;參與者提供的子秘密并不完全真實;秘密恢復過程中,未對子秘密進行驗證.而區塊鏈卻可以解決上述秘密共享方案存在的問題。區塊鏈的本質是一個無可信第三方、點對點傳輸的分布式數據庫,具有去中心化、防篡改、防偽造、保護參與者隱私等特點。
在一個秘密共享方案中,有一個秘密分發者和一組共享秘密的參與者P={p1,…,pn}。需要分配的秘密由分發者分成個秘密份額S1,…,Sn,每個份額Si通過信道分發給參與者。其中,為秘密值的范圍,為每個秘密共享的值空間,是秘密共享的范圍,則
(1)如果P'={pi1,…,pii}?P 是授權子集,那么能通過它們的秘密份額{si1,…,sii}重構恢復秘密;
(2)如果P'={pi1,…,pii}?P 不是授權子集,那么通過它們的秘密份額{si1,…,sii}則不能恢復秘密S。
一般來說,區塊鏈是具有時間序列的數據塊依次鏈接起來形成的特定數據結構,利用哈希散列函數和數字簽名技術,使得傳輸的消息是真實不可篡改,不可偽造的,具有防篡改、可溯源的特性,同時保證了其用戶參與者的匿名隱私性,而p2p 技術和工作量證明機制則使其去中心化成為可能。
區塊鏈是一個單向鏈式存儲結構,而塊就是存儲結構的數據信息,一個數據區塊包含區塊頭和區塊體兩部分。區塊頭包含當前區塊版本信息、前一區塊版本信息的哈希值、目標哈希值、隨機數、Merkle 樹根、時間戳.區塊體包含當前區塊的所有事務記錄,這些記錄通過哈希和Merkle 樹最終生成Merkle 樹根,保存在區塊頭中。所有區塊按照其時間順序依次單向連接,形成一條區塊鏈,其中第一個區塊叫做創世區塊,區塊鏈的結構示意圖如圖1。
Hash 函數:通過哈希將任意長度的輸入轉換為固定長度的輸出,輸出值即為哈希值,Hash 函數的抗碰撞性、原象不可逆、難題友好性等特點,使得區塊鏈具有防篡改、防偽功能,同時還可用作區塊鏈中共識算法的工作量證明。本方案中用對數據交易加密,用RIPEMD160 生成參與者。

圖1 區塊鏈結構示意圖
數字簽名:只有信息發送方才能生成的數字字符,其他人不能偽造,用來證明發送方發送信息的真實性和發送者身份的驗證,具有防抵賴的作用,本方案使用的是secp256k1 橢圓曲線數字簽名算法。
基于現有的秘密共享方案的不足,本文提出一種秘密共享方案的改進,將區塊鏈技術和秘密共享方案結合,改進和解決原有方案的缺陷。
本方案將子秘密數據封裝成虛擬資產和交易,以參與者錢包地址作為參與者,以參與者作為P2P 網絡節點,每個參與者在區塊鏈中以對等的身份互相監督、互相協助。首先通過區塊鏈的工作量證明機制讓參與者自行將秘密分成個子秘密,每個子秘密和參與者對應,以便查詢、驗證和溯源;每個子秘密提交給節點校驗后,存儲在區塊上,在通過驗證的子秘密集合中,至少需要個子秘密才能恢復重構秘密。
系統參數描述:定義在有限域上的GF(φ)橢圓曲線E,特征為φ,一個基點為G∈E(GF(φ)),設秘密空間和子秘密空間均為有限域GF(φ),需共享的秘密S 是GF(φ)上隨機選取的,S∈GF(φ)。(1)將子秘密數據封裝成虛擬資產和交易
需共享的秘密通過工作量證明機制被參與者自行拆分成份子秘密,這些子秘密相當于是分配給參與者的虛擬資產,參與者通過挖礦的形式獲得子秘密,將每份子秘密封裝成子秘密塊,塊包含前一個塊的哈希值、時間戳、Merkle 樹根、隨機數Nonce。
(2)將參與者錢包地址作為參與者
a.參與者生成密鑰對
參與者利用隨機數生成器生成一串隨機數,將隨機數經過生成一串256 位二進制數,判斷私鑰的二進制數是否處于1-n(n=1.158×1077略小于2256),如果是,則生成私鑰,否則一直重復上述步驟,直到生成私鑰為止。使用橢圓曲線加密算法,計算公鑰,為橢圓曲線基準點。
b.由公鑰生成地址
生成的公鑰經過單向函數映射得到一個32 字節的數字,再經過RIPEMD-169 映射得到一個20 字節的數,再將經過兩次映射,取結果前4 個字節放到20 字節后面作為校驗和,再取前綴為零的12 比特版本號加到整體前面,就形成了版本號-160比特- 檢驗和結構,經過Base58 編碼生成參與者地址字符串,作為參與者。
秘密分發:通過工作量證明機制(Pow)實現子秘密的分發,取消原有方案中秘密分發者的角色,由參與者自行分配,每個參與者獲得一個子秘密,實現去中心化的秘密分發。接著參與者對獲得的子秘密先進行SHA-256,再進行數字簽名,將子秘密和簽名結果蓋上時間戳,向全網廣播。使用數字簽名算法和時間戳可以防止交易數據在傳輸過程中被篡改、偽造,防止參與者抵賴。所使用的算法如下:
SHA-256 算法輸入消息的最大長度不超過2^64 bit,輸入按512-bit 分組進行處理,生成的輸出是一個256-bit 的消息摘要。
(1)附加填充位。填充消息,使消息長度與448 模512 同余(長度)一致,填充的比特數范圍是1 到512,填充比特串的最高位為1,其余位為0。首先在消息后面加一個1,再加很多個0,直到長度 滿足。
(2)附加長度值。將64bit 原始消息的長度添加到步驟1 的結果中(低字節優先)。
(3)初始化緩存。使用256-bit 緩存存儲散列函數的中間結果和最終結果。該緩存表示為, , , , , , , 。
(4)處理512-bit(16 個字)報文分組序列。該算法使用六種基本邏輯函數,由64 步迭代運算組成。每個步驟將256-bit 緩存值作為輸入,然后更新緩存內容。 每一步使用一個32-bit的常數值Kt 和一個32-bit 的Wt。
(5)輸出:在處理完所有512-bit 數據包后,SHA-256 算法的最后一個數據包生成的輸出是一個256-bit 的消息摘要。
工作量證明:hashcash 算法:
(1)獲取某種公開數據data(在反垃圾郵件場景下,使用收件人地址;在比特幣中,使用block 頭信息)。
(2)使用一個計數器counter,初始化為0。
(3)計算data+counter 的hash 值。
(4)檢查hash 值是否滿足某種要求。
a.滿足,結束
b.不滿足,counter 加1,然后重復3-4 步驟。
橢圓數字簽名生成算法:
(1)計算消息散列,令是的最左邊位;
(2)在之間選擇一個隨機整數,計算;
(3)計算,檢驗,如果,則返回執行步驟(2);
(4)計算,如果,返回執行步驟(2);
(5)簽名為。
秘密驗證:首先通過參與者ID,驗證參與者是否存在,利用公鑰將簽名結果解密,驗證數字簽名是否有效,將子秘密SHA-256,將結果和解密后的摘要對比是否一致。
橢圓曲線簽名驗證算法:
(1)驗證和是之間整數,否則簽名無效;
(2)計算;
(3)計算;
(4)計算;
(5)如果,則簽名有效,否則無效。
秘密重構:想要恢復秘密S 的參與者,向全網廣播,收集驗證子秘密,至少需要個已通過驗證的子秘密才能重構恢復秘密S。
該方案是一個完備的秘密共享方案。
證明:授權參與者的子集將他們的子秘密組合在一起,秘密可以被恢復; 如果一組未經授權的參與者子集將他們的子秘密組合在一起,則無法獲得關于秘密的任何信息。該解決方案可以保證每個參與者獲得正確的秘密共享?;謴兔孛芎?,可以保證合作參與方提交正確的秘密份額,否則協議提前終止。
本文設計的秘密共享方案使用區塊鏈技術,以改進分發者分發原始秘密共享方案的集中方式。秘密分發是通過參與點對點分散模式進行的,這確保了參與者之間的信任,并防止了中央分發者和參與者作弊。