曾寶葦 羅 銳
(成都理工大學(xué),四川 成都610000)
秘密共享方案分擔(dān)了密鑰的管理風(fēng)險(xiǎn),其主要解決了兩方面的問(wèn)題:(1)部分密鑰泄露,不影響整體秘密信息的安全性;(2)部分密鑰遺忘,不影響整體秘密信息的恢復(fù);但傳統(tǒng)秘密共享方案中還存在一些安全性問(wèn)題:秘密分發(fā)過(guò)程中,秘密分發(fā)者在知道參與者秘密份額的情況才進(jìn)行欺騙;參與者提供的子秘密并不完全真實(shí);秘密恢復(fù)過(guò)程中,未對(duì)子秘密進(jìn)行驗(yàn)證.而區(qū)塊鏈卻可以解決上述秘密共享方案存在的問(wèn)題。區(qū)塊鏈的本質(zhì)是一個(gè)無(wú)可信第三方、點(diǎn)對(duì)點(diǎn)傳輸?shù)姆植际綌?shù)據(jù)庫(kù),具有去中心化、防篡改、防偽造、保護(hù)參與者隱私等特點(diǎn)。
在一個(gè)秘密共享方案中,有一個(gè)秘密分發(fā)者和一組共享秘密的參與者P={p1,…,pn}。需要分配的秘密由分發(fā)者分成個(gè)秘密份額S1,…,Sn,每個(gè)份額Si通過(guò)信道分發(fā)給參與者。其中,為秘密值的范圍,為每個(gè)秘密共享的值空間,是秘密共享的范圍,則
(1)如果P'={pi1,…,pii}?P 是授權(quán)子集,那么能通過(guò)它們的秘密份額{si1,…,sii}重構(gòu)恢復(fù)秘密;
(2)如果P'={pi1,…,pii}?P 不是授權(quán)子集,那么通過(guò)它們的秘密份額{si1,…,sii}則不能恢復(fù)秘密S。
一般來(lái)說(shuō),區(qū)塊鏈?zhǔn)蔷哂袝r(shí)間序列的數(shù)據(jù)塊依次鏈接起來(lái)形成的特定數(shù)據(jù)結(jié)構(gòu),利用哈希散列函數(shù)和數(shù)字簽名技術(shù),使得傳輸?shù)南⑹钦鎸?shí)不可篡改,不可偽造的,具有防篡改、可溯源的特性,同時(shí)保證了其用戶(hù)參與者的匿名隱私性,而p2p 技術(shù)和工作量證明機(jī)制則使其去中心化成為可能。
區(qū)塊鏈?zhǔn)且粋€(gè)單向鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),而塊就是存儲(chǔ)結(jié)構(gòu)的數(shù)據(jù)信息,一個(gè)數(shù)據(jù)區(qū)塊包含區(qū)塊頭和區(qū)塊體兩部分。區(qū)塊頭包含當(dāng)前區(qū)塊版本信息、前一區(qū)塊版本信息的哈希值、目標(biāo)哈希值、隨機(jī)數(shù)、Merkle 樹(shù)根、時(shí)間戳.區(qū)塊體包含當(dāng)前區(qū)塊的所有事務(wù)記錄,這些記錄通過(guò)哈希和Merkle 樹(shù)最終生成Merkle 樹(shù)根,保存在區(qū)塊頭中。所有區(qū)塊按照其時(shí)間順序依次單向連接,形成一條區(qū)塊鏈,其中第一個(gè)區(qū)塊叫做創(chuàng)世區(qū)塊,區(qū)塊鏈的結(jié)構(gòu)示意圖如圖1。
Hash 函數(shù):通過(guò)哈希將任意長(zhǎng)度的輸入轉(zhuǎn)換為固定長(zhǎng)度的輸出,輸出值即為哈希值,Hash 函數(shù)的抗碰撞性、原象不可逆、難題友好性等特點(diǎn),使得區(qū)塊鏈具有防篡改、防偽功能,同時(shí)還可用作區(qū)塊鏈中共識(shí)算法的工作量證明。本方案中用對(duì)數(shù)據(jù)交易加密,用RIPEMD160 生成參與者。
圖1 區(qū)塊鏈結(jié)構(gòu)示意圖
數(shù)字簽名:只有信息發(fā)送方才能生成的數(shù)字字符,其他人不能偽造,用來(lái)證明發(fā)送方發(fā)送信息的真實(shí)性和發(fā)送者身份的驗(yàn)證,具有防抵賴(lài)的作用,本方案使用的是secp256k1 橢圓曲線數(shù)字簽名算法。
基于現(xiàn)有的秘密共享方案的不足,本文提出一種秘密共享方案的改進(jìn),將區(qū)塊鏈技術(shù)和秘密共享方案結(jié)合,改進(jìn)和解決原有方案的缺陷。
本方案將子秘密數(shù)據(jù)封裝成虛擬資產(chǎn)和交易,以參與者錢(qián)包地址作為參與者,以參與者作為P2P 網(wǎng)絡(luò)節(jié)點(diǎn),每個(gè)參與者在區(qū)塊鏈中以對(duì)等的身份互相監(jiān)督、互相協(xié)助。首先通過(guò)區(qū)塊鏈的工作量證明機(jī)制讓參與者自行將秘密分成個(gè)子秘密,每個(gè)子秘密和參與者對(duì)應(yīng),以便查詢(xún)、驗(yàn)證和溯源;每個(gè)子秘密提交給節(jié)點(diǎn)校驗(yàn)后,存儲(chǔ)在區(qū)塊上,在通過(guò)驗(yàn)證的子秘密集合中,至少需要個(gè)子秘密才能恢復(fù)重構(gòu)秘密。
系統(tǒng)參數(shù)描述:定義在有限域上的GF(φ)橢圓曲線E,特征為φ,一個(gè)基點(diǎn)為G∈E(GF(φ)),設(shè)秘密空間和子秘密空間均為有限域GF(φ),需共享的秘密S 是GF(φ)上隨機(jī)選取的,S∈GF(φ)。(1)將子秘密數(shù)據(jù)封裝成虛擬資產(chǎn)和交易
需共享的秘密通過(guò)工作量證明機(jī)制被參與者自行拆分成份子秘密,這些子秘密相當(dāng)于是分配給參與者的虛擬資產(chǎn),參與者通過(guò)挖礦的形式獲得子秘密,將每份子秘密封裝成子秘密塊,塊包含前一個(gè)塊的哈希值、時(shí)間戳、Merkle 樹(shù)根、隨機(jī)數(shù)Nonce。
(2)將參與者錢(qián)包地址作為參與者
a.參與者生成密鑰對(duì)
參與者利用隨機(jī)數(shù)生成器生成一串隨機(jī)數(shù),將隨機(jī)數(shù)經(jīng)過(guò)生成一串256 位二進(jìn)制數(shù),判斷私鑰的二進(jìn)制數(shù)是否處于1-n(n=1.158×1077略小于2256),如果是,則生成私鑰,否則一直重復(fù)上述步驟,直到生成私鑰為止。使用橢圓曲線加密算法,計(jì)算公鑰,為橢圓曲線基準(zhǔn)點(diǎn)。
b.由公鑰生成地址
生成的公鑰經(jīng)過(guò)單向函數(shù)映射得到一個(gè)32 字節(jié)的數(shù)字,再經(jīng)過(guò)RIPEMD-169 映射得到一個(gè)20 字節(jié)的數(shù),再將經(jīng)過(guò)兩次映射,取結(jié)果前4 個(gè)字節(jié)放到20 字節(jié)后面作為校驗(yàn)和,再取前綴為零的12 比特版本號(hào)加到整體前面,就形成了版本號(hào)-160比特- 檢驗(yàn)和結(jié)構(gòu),經(jīng)過(guò)Base58 編碼生成參與者地址字符串,作為參與者。
秘密分發(fā):通過(guò)工作量證明機(jī)制(Pow)實(shí)現(xiàn)子秘密的分發(fā),取消原有方案中秘密分發(fā)者的角色,由參與者自行分配,每個(gè)參與者獲得一個(gè)子秘密,實(shí)現(xiàn)去中心化的秘密分發(fā)。接著參與者對(duì)獲得的子秘密先進(jìn)行SHA-256,再進(jìn)行數(shù)字簽名,將子秘密和簽名結(jié)果蓋上時(shí)間戳,向全網(wǎng)廣播。使用數(shù)字簽名算法和時(shí)間戳可以防止交易數(shù)據(jù)在傳輸過(guò)程中被篡改、偽造,防止參與者抵賴(lài)。所使用的算法如下:
SHA-256 算法輸入消息的最大長(zhǎng)度不超過(guò)2^64 bit,輸入按512-bit 分組進(jìn)行處理,生成的輸出是一個(gè)256-bit 的消息摘要。
(1)附加填充位。填充消息,使消息長(zhǎng)度與448 模512 同余(長(zhǎng)度)一致,填充的比特?cái)?shù)范圍是1 到512,填充比特串的最高位為1,其余位為0。首先在消息后面加一個(gè)1,再加很多個(gè)0,直到長(zhǎng)度 滿(mǎn)足。
(2)附加長(zhǎng)度值。將64bit 原始消息的長(zhǎng)度添加到步驟1 的結(jié)果中(低字節(jié)優(yōu)先)。
(3)初始化緩存。使用256-bit 緩存存儲(chǔ)散列函數(shù)的中間結(jié)果和最終結(jié)果。該緩存表示為, , , , , , , 。
(4)處理512-bit(16 個(gè)字)報(bào)文分組序列。該算法使用六種基本邏輯函數(shù),由64 步迭代運(yùn)算組成。每個(gè)步驟將256-bit 緩存值作為輸入,然后更新緩存內(nèi)容。 每一步使用一個(gè)32-bit的常數(shù)值Kt 和一個(gè)32-bit 的Wt。
(5)輸出:在處理完所有512-bit 數(shù)據(jù)包后,SHA-256 算法的最后一個(gè)數(shù)據(jù)包生成的輸出是一個(gè)256-bit 的消息摘要。
工作量證明:hashcash 算法:
(1)獲取某種公開(kāi)數(shù)據(jù)data(在反垃圾郵件場(chǎng)景下,使用收件人地址;在比特幣中,使用block 頭信息)。
(2)使用一個(gè)計(jì)數(shù)器counter,初始化為0。
(3)計(jì)算data+counter 的hash 值。
(4)檢查hash 值是否滿(mǎn)足某種要求。
a.滿(mǎn)足,結(jié)束
b.不滿(mǎn)足,counter 加1,然后重復(fù)3-4 步驟。
橢圓數(shù)字簽名生成算法:
(1)計(jì)算消息散列,令是的最左邊位;
(2)在之間選擇一個(gè)隨機(jī)整數(shù),計(jì)算;
(3)計(jì)算,檢驗(yàn),如果,則返回執(zhí)行步驟(2);
(4)計(jì)算,如果,返回執(zhí)行步驟(2);
(5)簽名為。
秘密驗(yàn)證:首先通過(guò)參與者ID,驗(yàn)證參與者是否存在,利用公鑰將簽名結(jié)果解密,驗(yàn)證數(shù)字簽名是否有效,將子秘密SHA-256,將結(jié)果和解密后的摘要對(duì)比是否一致。
橢圓曲線簽名驗(yàn)證算法:
(1)驗(yàn)證和是之間整數(shù),否則簽名無(wú)效;
(2)計(jì)算;
(3)計(jì)算;
(4)計(jì)算;
(5)如果,則簽名有效,否則無(wú)效。
秘密重構(gòu):想要恢復(fù)秘密S 的參與者,向全網(wǎng)廣播,收集驗(yàn)證子秘密,至少需要個(gè)已通過(guò)驗(yàn)證的子秘密才能重構(gòu)恢復(fù)秘密S。
該方案是一個(gè)完備的秘密共享方案。
證明:授權(quán)參與者的子集將他們的子秘密組合在一起,秘密可以被恢復(fù); 如果一組未經(jīng)授權(quán)的參與者子集將他們的子秘密組合在一起,則無(wú)法獲得關(guān)于秘密的任何信息。該解決方案可以保證每個(gè)參與者獲得正確的秘密共享?;謴?fù)秘密后,可以保證合作參與方提交正確的秘密份額,否則協(xié)議提前終止。
本文設(shè)計(jì)的秘密共享方案使用區(qū)塊鏈技術(shù),以改進(jìn)分發(fā)者分發(fā)原始秘密共享方案的集中方式。秘密分發(fā)是通過(guò)參與點(diǎn)對(duì)點(diǎn)分散模式進(jìn)行的,這確保了參與者之間的信任,并防止了中央分發(fā)者和參與者作弊。