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

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