一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法
【專利摘要】本發(fā)明涉及一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法,該方法利用完全二叉樹的性質(zhì),以及雙棧結(jié)構(gòu),獲取Merkle簽名樹中葉子節(jié)點(diǎn)的認(rèn)證路徑。本發(fā)明的方法不僅適合于完全二叉樹,也適合于其它的認(rèn)證樹,比如H-CRT(Huffman?Certification?Revocation?Tree)樹,該方法簡單、明了、可行性好。
【專利說明】—種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及信息安全領(lǐng)域,特別是涉及一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法,應(yīng)用于數(shù)字簽名領(lǐng)域。
【背景技術(shù)】
[0002]數(shù)字簽名是安全通信應(yīng)用中不可缺少的部分。以往的數(shù)字簽名機(jī)制,如DSA(Digital Signature Scheme)簽名機(jī)制和RSA簽名機(jī)制依賴于解決離散對數(shù)問題和大因子分解問題的困難性。目前,還沒有解決這些困難問題的有效辦法。但這并不意味著沒有解決這些問題的算法存在,而且,在量子計(jì)算機(jī)存在的情況下已有相關(guān)算法能解決這些困難問題。因此,在DSA簽名機(jī)制和RSA簽名機(jī)制不再安全的情況下有必要提出新的簽名機(jī)制。Merkle簽名機(jī)制正是這樣的簽名方案。
[0003]Merkle簽名機(jī)制是依賴于安全hash函數(shù)的一次簽名機(jī)制。一次簽名機(jī)制存在的主要問題是密鑰的管理。因此,1979年Merkle提出了 Merkle簽名方案MSS(MerkleSignature Scheme),該方案中只需一個(gè)公鑰就可實(shí)現(xiàn)多個(gè)消息的簽名。怎樣有效地求得各葉子節(jié)點(diǎn)的認(rèn)證路徑是Merkle簽名方案中非常重要的一環(huán)。目前,認(rèn)證路徑節(jié)點(diǎn)值計(jì)算使得Merkle簽名方案效率低下,并且認(rèn)證路徑節(jié)點(diǎn)值龐大的計(jì)算量也使Merkle簽名方案很難應(yīng)用于實(shí)際。
[0004]如圖1所示,若有8個(gè)消息A8..A15需要簽名,Merkle簽名方案的思想是根據(jù)這8個(gè)消息的hash值作為葉子節(jié)點(diǎn)構(gòu)建完全二叉樹,內(nèi)部節(jié)點(diǎn)是其左右孩子節(jié)點(diǎn)值級聯(lián)后的hash值。根節(jié)點(diǎn)的值Ii1即為簽名機(jī)制的公鑰。
[0005]如圖2所示,葉子節(jié)點(diǎn)Node11對應(yīng)消息m的簽名為sig=(sig’ I Node1 NodeE |Nodec)。其中,sig’即為消息m的hash值,斜線節(jié)點(diǎn)定義為葉子節(jié)點(diǎn)Nodea的認(rèn)證路徑節(jié)點(diǎn),它是葉子節(jié)點(diǎn)Nodea到根節(jié)點(diǎn)NodeA路徑上各節(jié)點(diǎn)的兄弟節(jié)點(diǎn)。
[0006]怎樣有效地求得各葉子節(jié)點(diǎn)的認(rèn)證路徑是Merkle簽名方案中非常重要的一環(huán)。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的在于提出一種新的方法用于產(chǎn)生Merkle樹簽名方案的認(rèn)證路徑。本發(fā)明根據(jù)完全二叉樹的性質(zhì),利用雙棧結(jié)構(gòu),獲取Merkle簽名樹中葉子節(jié)點(diǎn)的認(rèn)證路徑。
[0008]本發(fā)明的目的可以通過以下措施來達(dá)到:
[0009]一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法,包括以下步驟:
[0010]首先設(shè)置兩個(gè)棧,分別為stackNode和stackAuth,并將所述兩棧初始化為空棧,分別用于存儲簽名樹中的當(dāng)前訪問的節(jié)點(diǎn)及其認(rèn)證路徑節(jié)點(diǎn),并將棧中的當(dāng)前訪問節(jié)點(diǎn)和認(rèn)證路徑節(jié)點(diǎn)分別設(shè)置一個(gè)標(biāo)志位flag,用于記錄棧中節(jié)點(diǎn)的左右孩子是否已經(jīng)入棧。當(dāng)標(biāo)記為O時(shí)表示其孩子節(jié)點(diǎn)未曾入棧,當(dāng)標(biāo)記為I時(shí)表示其孩子節(jié)點(diǎn)已經(jīng)入棧,執(zhí)行如下的步驟:
[0011 ] 第一步,將Merkle簽名樹的根節(jié)點(diǎn)左右孩子節(jié)點(diǎn)分別入棧stackNode和stackAuth,并設(shè)進(jìn)棧元素的flag標(biāo)志為O ;
[0012]第二步,判斷棧stackNode是否為空?若不為空則進(jìn)行第三步,若為空,則結(jié)束;
[0013]第三步,獲取stackNode棧中的棧頂元素curNode,判斷curNode是否為內(nèi)部節(jié)點(diǎn)?若是,則進(jìn)行第四步,否則進(jìn)行第五步;
[0014]第四步,判斷curNode節(jié)點(diǎn)的flag標(biāo)志?
[0015](I)若curNode節(jié)點(diǎn)的flag標(biāo)志為0,則其對應(yīng)的左右孩子分別進(jìn)棧,并設(shè)置curNode節(jié)點(diǎn)的flag標(biāo)志為I,跳轉(zhuǎn)到第二步;
[0016](2)若curNode節(jié)點(diǎn)的flag標(biāo)志為I,則判斷curNode節(jié)點(diǎn)與另一棧stackAuth的棧頂節(jié)點(diǎn)即stackAuth.Top O的關(guān)系?
[0017](a)若 curNode 節(jié)點(diǎn)的右兄弟為 stackAuth.Top (),則兩棧 stackNode 和stackAuth 的棧頂兀素交換位置,即 stackNode.Top O〈一>stackAuth.Top O ;
[0018](b)若curNode節(jié)點(diǎn)是stackAuth.TopO的右兄弟,則兩棧棧頂元素出棧,即stackNode.pop O,并且 stackAuth.pop O,跳轉(zhuǎn)到第二步;
[0019]第五步,輸出stackAuth棧中的全部節(jié)點(diǎn),這些節(jié)點(diǎn)即為curNode節(jié)點(diǎn)的認(rèn)證路徑上的所有節(jié)點(diǎn),并判斷curNode節(jié)點(diǎn)與stackAuth棧棧頂元素的關(guān)系?
[0020](I)若stackAuth棧棧頂元素即stackAuth.Top O是curNode節(jié)點(diǎn)的右兄弟,則兩棧 stackNode 和 stackAuth 的棧頂兀素交換位置,即 stackNode.Top () <—>stackAuth.Top O ;
[0021](2)若curNode節(jié)點(diǎn)的右兄弟為為空,則兩棧stackNode和stackAuth的棧頂元素出棧,即 stackNode.pop O , stackAuth.pop (),跳轉(zhuǎn)到第二步。
[0022]當(dāng)前訪問的節(jié)點(diǎn)curNode是葉子節(jié)點(diǎn)時(shí),stackAuth中存儲的節(jié)點(diǎn)即為該葉子節(jié)點(diǎn)的認(rèn)證路徑。
[0023]當(dāng)前訪問的節(jié)點(diǎn)curNode是內(nèi)部節(jié)點(diǎn)時(shí),stackAuth中存儲的節(jié)點(diǎn)即為該內(nèi)部節(jié)點(diǎn)的認(rèn)證路徑。
[0024]本發(fā)明相比現(xiàn)有技術(shù)具有如下優(yōu)點(diǎn):
[0025]1.不僅適合于完全二叉樹,也適合于其它的認(rèn)證樹,比如H-CRT (HuffmanCertification Revocation Tree)樹和 Skew Merkle 樹。方法簡單明了,很容易理解。
[0026]2.利用兩個(gè)棧實(shí)現(xiàn)認(rèn)證路徑節(jié)點(diǎn)的輸出,效率高,可行性好。
【專利附圖】
【附圖說明】
[0027]圖1.是Merkle簽名方案中簽名樹的建立示意圖。
[0028]圖2.是簽名樹中葉子節(jié)點(diǎn)H及其認(rèn)證路徑示意圖。
[0029]圖3.是本發(fā)明stackNode棧的棧頂元素為內(nèi)部節(jié)點(diǎn),且flag標(biāo)志為O時(shí)的變化示意圖。
[0030]圖4.是本發(fā)明stackNode棧的棧頂元素為內(nèi)部節(jié)點(diǎn),flag標(biāo)志為1、右兄弟節(jié)點(diǎn)是stackAuth棧棧頂元素時(shí)的變化示意圖。
[0031]圖5.是本發(fā)明stackNode棧的棧頂元素為內(nèi)部節(jié)點(diǎn),flag標(biāo)志為1、是stackAuth棧棧頂元素的右兄弟時(shí)的變化示意圖。
[0032]圖6.是本發(fā)明stackNode棧的棧頂元素為葉子節(jié)點(diǎn),首先輸出葉子節(jié)點(diǎn)的所有認(rèn)證路徑節(jié)點(diǎn),葉子節(jié)點(diǎn)的右兄弟節(jié)點(diǎn)是stackAuth棧棧頂元素時(shí)的變化示意圖。
[0033]圖7.是本發(fā)明stackNode棧的棧頂元素為葉子節(jié)點(diǎn),首先輸出葉子節(jié)點(diǎn)的所有認(rèn)證路徑節(jié)點(diǎn),葉子節(jié)點(diǎn)沒有右兄弟時(shí)的變化示意圖。
【具體實(shí)施方式】
[0034]以下結(jié)合附圖對本發(fā)明進(jìn)行詳細(xì)說明,圖中當(dāng)前訪問的葉子節(jié)點(diǎn)用菱形表示,入stackNode棧中的節(jié)點(diǎn)用點(diǎn)填充表示,入stackAuth棧中的節(jié)點(diǎn)用斜線填充表示。
[0035]本發(fā)明一種新的Merkle樹簽名方案認(rèn)證路徑產(chǎn)生方法實(shí)施步驟通過以下部署可以達(dá)到:
[0036]首先設(shè)置兩個(gè)棧stackNode和stackAuth,初始化為空棧,分別用于存儲簽名樹中的當(dāng)前訪問的節(jié)點(diǎn)及其認(rèn)證路徑節(jié)點(diǎn)。
[0037]設(shè)置一個(gè)標(biāo)志位flag,用于記錄棧中節(jié)點(diǎn)的左右孩子是否已經(jīng)入棧。當(dāng)標(biāo)記為O時(shí)表示其孩子節(jié)點(diǎn)未曾入棧,當(dāng)標(biāo)記為I時(shí)表示其孩子節(jié)點(diǎn)已經(jīng)入棧。
[0038]第一步,將Merkle簽名樹的根節(jié)點(diǎn)左右孩子節(jié)點(diǎn)分別入棧stackNode和stackAuth,并設(shè)進(jìn)棧元素的flag標(biāo)志為O。
[0039]第二步,判斷棧stackNode是否為空?若不為空則進(jìn)行第三步,若為空,則結(jié)束。
[0040]第三步,獲取stackNode棧中的棧頂元素curNode,判斷其是否為內(nèi)部節(jié)點(diǎn)?若是,則進(jìn)行第四步,否則進(jìn)行第五步。
[0041]第四步,判斷curNode節(jié)點(diǎn)的flag標(biāo)志?
[0042](I)若curNode節(jié)點(diǎn)的flag標(biāo)志為0,則其對應(yīng)的左右孩子分別進(jìn)棧。并設(shè)置curNode節(jié)點(diǎn)的flag標(biāo)志為I。跳轉(zhuǎn)到第二步。
[0043](2)若curNode節(jié)點(diǎn)的flag標(biāo)志為I,則判斷curNode節(jié)點(diǎn)與另一棧stackAuth的棧頂節(jié)點(diǎn)即stackAuth.Top O的關(guān)系?
[0044](a)若 curNode 節(jié)點(diǎn)的右兄弟為 stackAuth.Top O,則兩棧 stackNode 和stackAuth 的棧頂兀素交換位置,即 stackNode.Top O〈一>stackAuth.Top O。
[0045](b)若curNode節(jié)點(diǎn)是stackAuth.Top O的右兄弟,則兩棧棧頂元素出棧,即stackNode.pop O,并且 stackAuth.pop O °
[0046]跳轉(zhuǎn)到第二步。
[0047]第五步,輸出stackAuth棧中的全部節(jié)點(diǎn),這些節(jié)點(diǎn)即為curNode節(jié)點(diǎn)的認(rèn)證路徑上的所有節(jié)點(diǎn)。并判斷curNode節(jié)點(diǎn)與stackAuth棧棧頂元素的關(guān)系?
[0048](I)若stackAuth棧棧頂元素即stackAuth.Top O是curNode節(jié)點(diǎn)的右兄弟,貝丨J兩棧 stackNode 和 stackAuth 的棧頂兀素交換位置,即 stackNode.Top () <—>stackAuth.Top O。
[0049](2)若curNode節(jié)點(diǎn)的右兄弟為為空,則兩棧stackNode和stackAuth的棧頂元素出找,即 stackNode.pop O , stackAuth.pop ()。
[0050]跳轉(zhuǎn)到第二步。
[0051]本發(fā)明將結(jié)合附圖作進(jìn)一步詳述:[0052]圖3,圖4,圖5,圖6,圖7顯示了本發(fā)明工作的工作過程。
[0053]如圖3所示,變化前(左側(cè))stackNode棧的棧頂元素為B,為內(nèi)部節(jié)點(diǎn),flag標(biāo)志為O,則根據(jù)本發(fā)明提供的方法,節(jié)點(diǎn)B的左右孩子分別入棧stackNode和stackAuth,變化后如右則所示。
[0054]如圖4所示,變化前(左側(cè))stackNode棧的棧頂元素為D,D為內(nèi)部節(jié)點(diǎn),flag標(biāo)志為I。則根據(jù)本發(fā)明提供的方法,判斷其與stackAuth棧棧頂節(jié)點(diǎn)E的關(guān)系,E為D節(jié)點(diǎn)的右兄弟,則D,E交換位置。變化后如右則所示。
[0055]如圖5所示,變化前(左側(cè))stackNode棧的棧頂元素為E,E為內(nèi)部節(jié)點(diǎn),flag標(biāo)志為I。則根據(jù)本發(fā)明提供的方法,判斷其與stackAuth棧棧頂節(jié)點(diǎn)D的關(guān)系,E為D節(jié)點(diǎn)的右兄弟,則E,D分別出棧。變化后如右則所示。
[0056]如圖6所示,變化前(左側(cè))stackNode棧的棧頂元素為H,H為葉子節(jié)點(diǎn),則根據(jù)本發(fā)明提供的方法,H對應(yīng)的認(rèn)證路徑節(jié)點(diǎn)即為stackAuth棧中的所有元素,即節(jié)點(diǎn)1、E、C。輸出認(rèn)證路徑后,判斷stackNode棧的棧頂元素為H與stackAuth棧的棧頂元素I的關(guān)系,I為H的右兄弟,則H,I交換位置。變化后如右則所示。
[0057]如圖7所示,變化前(左側(cè))stackNode棧的棧頂元素為I,I為葉子節(jié)點(diǎn),則根據(jù)本發(fā)明提供的方法,I對應(yīng)的認(rèn)證路徑節(jié)點(diǎn)即為stackAuth棧中的所有元素,即節(jié)點(diǎn)H、E、C。輸出認(rèn)證路徑后,判斷stackNode棧的棧頂元素是否有右兄弟,I沒有右兄弟,則兩棧stackNode和stackAuth的棧頂元素出棧,變化后如右則所示。
[0058]應(yīng)當(dāng)理解,以上借助優(yōu)選實(shí)施例對本發(fā)明的技術(shù)方案進(jìn)行的詳細(xì)說明是示意性的而非限制性的。本領(lǐng)域的普通技術(shù)人員在閱讀本發(fā)明說明書的基礎(chǔ)上可以對各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。
【權(quán)利要求】
1.一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法,其特征在于:包括以下步驟: 首先設(shè)置兩個(gè)棧,分別為StackNode和stackAuth,并將所述兩棧初始化為空棧,分別用于存儲簽名樹中的當(dāng)前訪問的節(jié)點(diǎn)及其認(rèn)證路徑節(jié)點(diǎn),并將棧中的當(dāng)前訪問節(jié)點(diǎn)和認(rèn)證路徑節(jié)點(diǎn)分別設(shè)置一個(gè)標(biāo)志位flag,用于記錄棧中節(jié)點(diǎn)的左右孩子是否已經(jīng)入棧,當(dāng)標(biāo)記為O時(shí)表示其孩子節(jié)點(diǎn)未曾入棧,當(dāng)標(biāo)記為I時(shí)表示其孩子節(jié)點(diǎn)已經(jīng)入棧,執(zhí)行如下的步驟: 第一步,將Merkle簽名樹的根節(jié)點(diǎn)左右孩子節(jié)點(diǎn)分別入棧StackNode和stackAuth,并設(shè)進(jìn)棧元素的flag標(biāo)志為O ; 第二步,判斷棧StackNode是否為空?若不為空則進(jìn)行第三步,若為空,則結(jié)束; 第三步,獲取StackNode棧中的棧頂元素curNode,判斷curNode是否為內(nèi)部節(jié)點(diǎn)?若是,則進(jìn)行第四步,否則進(jìn)行第五步; 第四步,判斷curNode節(jié)點(diǎn)的flag標(biāo)志? (1)若curNode節(jié)點(diǎn)的flag標(biāo)志為0,則其對應(yīng)的左右孩子分別進(jìn)棧,并設(shè)置curNode節(jié)點(diǎn)的flag標(biāo)志為I,跳轉(zhuǎn)到第二步; (2)若curNode節(jié)點(diǎn)的flag標(biāo)志為I,則判斷curNode節(jié)點(diǎn)與另一棧stackAuth的棧頂節(jié)點(diǎn)即stackAuth.Top O的關(guān)系? (a)若curNode 節(jié)點(diǎn)的右兄弟為 stackAuth.Top O ,則兩棧 stackNode 和 stackAuth 的棧頂兀素交換位置,即 stackNode.Top O <—>stackAuth.Top O ; (b)若curNode節(jié)點(diǎn)是stackAuth.Top O的右兄弟,則兩棧棧頂元素出棧,即stackNode.pop O,并且 stackAuth.pop O,跳轉(zhuǎn)到第二步; 第五步,輸出stackAuth棧中的全部節(jié)點(diǎn),這些節(jié)點(diǎn)即為curNode節(jié)點(diǎn)的認(rèn)證路徑上的所有節(jié)點(diǎn),并判斷curNode節(jié)點(diǎn)與stackAuth棧棧頂元素的關(guān)系? (1)若stackAuth棧棧頂元素即stackAuth.TopO是curNode節(jié)點(diǎn)的右兄弟,則兩棧 stackNode 和 stackAuth 的棧頂兀素交換位置,即 stackNode.Top () <—>stackAuth.Top O ; (2)若curNode節(jié)點(diǎn)的右兄弟為為空,則兩棧stackNode和stackAuth的棧頂元素出棧,即 stackNode.pop O , stackAuth.pop (),跳轉(zhuǎn)到第二步。
2.根據(jù)權(quán)利要求1所述的一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法,其特征在于:當(dāng)前訪問的節(jié)點(diǎn)curNode是葉子節(jié)點(diǎn)時(shí),stackAuth中存儲的節(jié)點(diǎn)即為該葉子節(jié)點(diǎn)的認(rèn)證路徑。
3.根據(jù)權(quán)利要求1所述的一種用于產(chǎn)生Merkle樹簽名方案認(rèn)證路徑的新方法,其特征在于:當(dāng)前訪問的節(jié)點(diǎn)curNode是內(nèi)部節(jié)點(diǎn)時(shí),stackAuth中存儲的節(jié)點(diǎn)即為該內(nèi)部節(jié)點(diǎn)的認(rèn)證路徑。
【文檔編號】H04L9/32GK103441845SQ201310341001
【公開日】2013年12月11日 申請日期:2013年8月7日 優(yōu)先權(quán)日:2013年8月7日
【發(fā)明者】彭雙和, 韓臻, 劉吉強(qiáng) 申請人:北京交通大學(xué)