?

SPHINCS+-SM3: 基于SM3 的無狀態數字簽名算法*

2024-01-11 11:02孫思維劉田雨何逸飛荊繼武張立廷閆海倫
密碼學報 2023年6期
關鍵詞:私鑰公鑰字節

孫思維, 劉田雨, 關 志, 何逸飛, 胡 磊, 荊繼武, 張立廷, 閆海倫

1.中國科學院大學 密碼學院, 北京100049

2.密碼科學技術全國重點實驗室, 北京100878

3.北京大學 軟件工程國家工程研究中心, 北京100871

4.中國科學院大學 網絡空間安全學院, 北京100049

5.中電科網絡安全科技股份有限公司, 北京100070

1 引言

基于雜湊函數設計數字簽名的方法最早可以追溯到1976 年, Diffie 和Hellman 在文獻[1] 中提出了一種基于單向函數的一次性簽名算法, 這個算法只能對1 比特的數據進行簽名.后來, Lamport 對這一方案進行了推廣, 給出了一個適用于任意長度消息的一次性數字簽名算法[2].一次性簽名算法的一個公私鑰對只能對一個消息進行簽名, 多次簽名會破壞算法的安全性.通過將N個一次性簽名的實例作為葉子節點組織在一個Merkle 樹中, 可以構造一個N次簽名算法.經過40 余年的發展, 這種設計數字簽名的技術路線逐漸成熟, 形成了LMS、HSS、XMSS 和XMSSMT等算法.LMS 和HSS 在RFC 8554[3]中進行了標準化, XMSS 和XMSSMT則在文獻[4] 中進行了標準化.同時, 這些算法也是NIST SP 800-208 推薦使用的簽名算法[5].

這類基于雜湊函數的數字簽名算法有諸多優點.首先, 它們可以抗量子計算攻擊, 而且是目前抗量子攻擊數字簽名設計技術路線中從安全角度看最保守的設計.這類方案的安全性只依賴于底層雜湊函數的抗某種變體的(第二) 原像攻擊的安全性, 而不需要依賴其他結構性安全假設.并且, 構造這類方案的底層雜湊函數是可替換的, 一旦發現存在對當前所使用的雜湊函數的有效攻擊, 可以直接替換一個安全的雜湊函數.另外, 基于雜湊函數的簽名體制的參數選擇豐富, 針對具體應用場景有廣泛的調整空間[6–9].這類簽名方案也有其局限性, 除簽名尺寸較大外, 它們都是帶狀態的簽名, 即每次簽名都需要按一定的規則改變私鑰的狀態, 這是為了確保同一個一次性簽名實例不會進行多于一次簽名以確保系統的安全性[10].在部分應用場景下, 安全可靠地管理私鑰狀態是困難的, 限制了這類簽名算法的實際應用.

SPHINCS 是一個基于雜湊函數的無狀態數字簽名算法, 由Bernstein 等人設計[11].SPHINCS 借鑒了XMSS[12]的設計, 通過采用更大的超樹結構(hyper tree, HT) 和其他技術消除了對狀態的需求, 同時也導致了更大的簽名.SPHINCS+[13]是SPHINCS 的一個改進版本.在2022 年11 月29 日, NIST 最終在PQC 競賽參賽算法中選擇了三個簽名算法, 并準備對它們進行標準化, 這其中就包括SPHINCS+.在第四屆NIST 后量子密碼標準化會議中, NIST PQC 團隊Dustin Moody 在他的報告“NIST PQC:Looking into the future” 中指出了選擇SPHINCS+的原因: 堅實的安全性以及其基于與格密碼不同的安全性假設1https://csrc.nist.gov/Presentations/2022/nist-pqc-looking-into-the-future.關于SPHINCS+的安全性證明, 可以參考文獻[14], 在假設其底層使用的雜湊函數具有一定的安全性質后, 該證明都成立, 與具體使用的雜湊函數無關.但需要說明的是, Perlner 等人的工作[15]指出: 使用MD 結構的雜湊函數(如SHA2 和SM3) 實例化的SPHINCS+會有40 比特左右的安全強度削減.因此, 本文給出的SPHINCS+-SM3 的安全強度預計為200 比特以上, 與使用SHA2 實例化的SPHINCS+相當.本文利用雜湊函數SM3 實例化SPHINCS+, 給出了2 組達到NIST PQC CFP 中第1 安全等級的參數實例, 并進行了初步的性能測試.注意, 本文中所給出的實例支持最多264個簽名, 如果降低容許的簽名次數, 則可以通過調整參數給出性能更好且簽名尺寸更小的數字簽名算法[16].

2 預備知識與符號

令F2={0,1}表示二元域, B = F82表示所有字節(即8 位二進制數據) 的集合.我們用log(i) 表示正整數i的以2 為底的對數.因此, log(23)=3.另外, 本文中給出的SPHINCS+-SM3 最多只能進行264次簽名, 我們稱其容量為264.

2.1 SPHINCS+ 的構成組件和參數

SPHINCS+-SM3 使用SM3 實例化SPHINCS+.構成SPHINCS+的組件包括FORS (forest of random subset) 多次簽名[11]和WOTS+一次性簽名[17], 這些組件被組織在一個超樹結構中構成SPHINCS+.這些組件和結構的相關參數如下, 后續本文在描述FORS、WOTS+和超樹結構的實例時,都采用以下參數.

-n: 表示安全參數為n字節, 同時也是XMSS 樹節點的字節數, WOTS+實例私鑰元素的字節數和FORS 實例私鑰元素的字節數.

-w: WOTS+實例的Winternitz 參數, 在本文中w ∈{4,16,25}.

- len: WOTS+私鑰中所包含的n字節元素的個數.len=len1+len2, 其中

分別為n字節消息中所包含的w比特無符號整數的個數, 以及n字節消息所對應的校驗值中所包含的w比特無符號整數的個數.

-k: 一個FORS 實例所對應的FORS 樹中包含的高度相同的完美二叉樹的個數.

-a: 一個FORS 樹中有k個完美二叉樹, 每個樹的高度為a.

-t: 一個FORS 樹中的每個完美二叉樹有t=2a個葉子節點.

-h: 超樹的總高度.

-d: 超樹的層數, 每層中有若干高度為h/d的XMSS 樹.

-h′:h′=h/d為超樹結構中XMSS 樹的高度.

-m: SPHINCS+在對任意長的消息M進行簽名時, 會先用一個雜湊函數對消息M進行處理, 這個雜湊函數的輸出長度為m字節, 我們將它分為長度分別為mmd、midxTree和midxLeaf字節的3段, 即m=mmd+midxTree+midxLeaf, 其中mmd=?(ka+7)/8」,midxTree=?(h ?h/d+7)/8」,midxLeaf=?(h/d+7)/8」.我們取第1 段的前ka比特記為md, 第2 段的前h ?h/d比特記為idxTree, 第3 段的前h/d比特記為idxLeaf.

2.2 SPHINCS+-SM3 中雜湊函數的使用

在SPHINCS+-SM3 中需要使用如下函數:

其中

在SPHINCS+-SM3 中, 我們取安全參數n= 16, 這意味著SPHINCS+-SM3 的安全強度對應于NIST PQC CFP[18]中第4.A.5 節給出的第1 安全等級.在SPHINCS+-SM3 中, 方程(1)中給出的函數是用SM3 實例化的.其中,Hmsg(R,PK.seed,PK.root,M) 的定義為

其他函數的定義為

最后, 我們定義

SPHINCS+-SM3 分成兩版, 即正常版和加強版.在正常版中, 我們定義X⊕=X.在加強版中, 對于F的輸入M, 我們定義M⊕=M ⊕MGF1-SM3(PK.seed‖ADRSc,n).對于H和T的輸入, 我們定義

在以上定義中, HMAC-SM3 和MGF1-SM3 分別為HMAC-SHA2-256[19]和MSG1[20]將雜湊函數替換成SM3 的版本.另外, 由于SM3 壓縮函數輸入消息分組的長度為512 位即64 字節, 我們將PK.seed 補全成一個消息分組BlockPad(PK.seed) = PK.seed‖toByte(0,64?n).因為SM3 采用了Merkle-Damg?rd 結構, 這樣做可以使F、H和Tl在計算時重用計算完第一個消息分組后的中間狀態.最后, ADRSc表示ADRS 的壓縮地址(見第4 節), ADRSc的layerAddr 和addrType 只取原地址結構中相應字段的最低字節, 其treeAddr 則只取原地址結構中相應字段的最低8 字節.因此, ADRSc的大小為22 個字節, 而ADRS 的大小為32 字節.使用壓縮地址的目的是為了減少SM3 壓縮函數的調用次數.

3 SPHINCS+ 的超樹結構

每個SPHINCS+實例對應于一個由大量相同高度的完美二叉樹構成的超樹結構.這些完美二叉樹按一定的規則分布在不同的層上.此后,令每個完美二叉樹的高度為h′,它們分布在d層中,則稱這個超樹結構的總高度為h=h′d.每一層中的每一個完美二叉樹實際上是XMSS 樹的變種[12],以下簡稱XMSS 樹,每個XMSS 樹有2h′個葉子節點, 每個葉子節點的值為一個WOTS+實例的公鑰(n個字節).

在這個超樹結構中,第d?1 層(最頂層)只有20=1 個XMSS 樹,第i層有2h?(i+1)h′個XMSS 樹,第0 層(最底層) 有2h?h′個XMSS 樹.最底層的XMSS 樹共有2h個葉子節點, 其值為2h個WOTS+實例的公鑰.這2h個WOTS+實例還對應了2h個FORS 實例(見第5 節).每個FORS 實例對應于一個FORS 樹, 其中包含了k個高度為a的完美二叉樹.每個FORS 實例可以給多個長度為ka比特的消息進行簽名.

一個SPHINCS+實例的私鑰為(SK.seed,SK.prf,PK.root,PK.seed)∈Bn×Bn×Bn×Bn, 公鑰為(PK.root,PK.seed)∈Bn×Bn, 其中SK.seed 和SK.prf 是秘密的, PK.root 是最頂層的XMSS 樹的根節點的值, PK.seed 為一個公開的隨機種子.使用一個SPHINCS+實例對某一消息M ∈F?2進行簽名的大體流程如下.首先, 計算

其中, opt 的值為PK.seed 或一個新鮮的隨機數, 在后一種情況下, SPHINCS+為一個非確定性簽名.然后, 將m字節的digest 分成長度為?(ka+7)/8」字節、?(h ?h/d+7)/8」字節和?(h/d+7)/8」字節的3 段.取第1 段的前ka比特記為md, 第2 段的前h ?h/d比特記為idxTree, 第3 段的前h/d比特記為idxLeaf.接下來, 用第0 層的第idxTree 個XMSS 樹的第idxLeaf 個葉子節點對應的FORS 實例對md 進行簽名.用第0 層的第idxTree 個XMSS 樹的第idxLeaf 個葉子節點對應的WOTS+實例對該FORS 樹的根節點進行簽名.然后, 根據idxTree 選擇第1 層的一個XMSS 樹的一個葉子節點對應的WOTS+實例對第0 層的這個XMSS 樹的根節點進行簽名, 以此類推一直到第0 層.因此, 一個SPHINCS+簽名包含了1 個FORS 簽名、d個WOTS+簽名以及相應的認證路徑.圖1 給出了一個總高度為9、層數為3 的SPHINCS+的超樹結構.該SPHINCS+實例使用的FORS 實例的參數為k=3和t=2a=23=8.

圖1 SPHINCS+ 超樹結構Figure 1 Structure of SPHINCS+ hyper tree

4 地址ADRS 數據結構

在使用雜湊函數計算SPHINCS+超樹結構中的數據元素時, 地址ADRS 會作為雜湊函數的輸入使用.ADRS 標識了當前函數所計算出的數據元素在SPHINCS+超樹中所處的位置.地址ADRS 的大小為32 個字節, 根據其類型(addrType) 的不同, 我們共有7 種地址.這7 種類型的ADRS 共有的數據項有3 個, 即layerAddr、treeAddr 和addrType.

layerAddr 占1 個字的空間, 標識了所計算的數據元素所在的層數, 取值范圍為{0,1,···,h ?1}.treeAddr 占 3 個字的空間, 若所計算的數據元素在第i層, 則 treeAddr 的取值范圍為{0,1,···,2h?(i+1)h′?1}, 標識了所計算的數據元素在第i層中的哪個XMSS 樹中.addrType 占1個字的空間, 標識了ADRS 的類型, 取值范圍為{0,1,···,6}, 其中0 表示WOTS+雜湊地址, 如圖2 所示.5 表示WOTS+私鑰生成地址, 如圖3 所示.1 表示WOTS+公鑰壓縮地址, 如圖4 所示.2 表示XMSS 樹雜湊地址, 如圖5 所示.3 表示FORS 樹雜湊地址, 如圖6 所示.6 表示FORS 私鑰生成地址,如圖7 所示.4 表示FORS 樹根節點壓縮地址, 如圖8 所示.

圖2 WOTS+ 雜湊地址Figure 2 WOTS+ hash address

圖3 WOTS+ 私鑰生成地址Figure 3 WOTS+ key generation address

圖4 WOTS+ 公鑰壓縮地址Figure 4 WOTS+ public key compression address

圖5 XMSS 樹雜湊地址Figure 5 XMSS tree address

圖6 FORS 樹雜湊地址Figure 6 FORS tree hash address

圖7 FORS 私鑰生成地址Figure 7 FORS key generation address

圖8 FORS 樹根節點壓縮地址Figure 8 FORS tree roots compression address

圖9 FORS 樹Figure 9 FORS tree

WOTS+雜湊地址(如圖2 所示) 在生成WOTS+實例的公鑰中計算哈希鏈調用F時被使用.key-PairAddr 標識了該WOTS+實例對應于XMSS 樹的哪一個葉子節點, 其取值范圍為{0,1,···,2h′?1}.chainAddr 確定了目前計算的是哪一條哈希鏈, 其取值范圍為{0,1,···,len?1}.hashAddr 標識了F是作用于當前哈希鏈中的第幾個節點, 其取值范圍為{0,1,···,w ?2}.

WOTS+私鑰生成地址(如圖3 所示) 在通過密鑰中的秘密種子生成WOTS+實例的私鑰時作為PRF 的輸入使用, keyPairAddr 標識了該WOTS+實例對應于XMSS 樹的哪一個葉子節點, 其取值范圍為{0,1,···,2h′?1}.chainAddr 確定了目前計算的是哪一條哈希鏈, 其取值范圍為{0,1,···,len?1}.hashAddr 則為常數0.

WOTS+公鑰壓縮地址(如圖4 所示) 在對WOTS+實例哈希鏈的終點節點進行壓縮從而形成該實例對應的葉子節點時作為Hlen的輸入使用.keyPairAddr 標識了該WOTS+實例對應于子樹的哪一個葉子節點, 其取值范圍為{0,1,···,2h′?1}.

XMSS 樹雜湊地址(如圖5 所示)在構建超樹結構中的XMSS 樹時作為H的輸入使用.treeHeight 標識了被計算的節點的高度, 其取值范圍為{1,2,···,h′}, 其中葉子節點的高度為 0, 根節點的高度為h′.treeIndex 標識了被計算的節點處于它所在的高度中所有節點的相對位置, 其取值范圍為{0,1,···,2h′?ˉh}, 其中ˉh是當前被計算的節點的高度.

FORS 樹雜湊地址(如圖6 所示)在計算FORS 實例對應的FORS 樹時作為H的輸入使用.注意,一個參數為k和t=2a的FORS 樹實際上包含k個高度為a的完美二叉樹.keyPairAddr 標識了該FORS實例對應于XMSS 樹的哪一個葉子節點, 其取值范圍為{0,1,···,2h′?1}(其意義與WOTS+公鑰壓縮地址中的keyPairAddr 一致).treeHeight 標識了被計算的節點的高度, 其取值范圍為{1,2,···,a}, 其中葉子節點的高度為0, 根節點的高度為a.因為FORS 樹中包含k個高度為a的完美二叉樹, 因此高度為b的節點共有k·2a?b個.treeIndex 標識了被計算的節點處于它所在的高度中所有節點的相對位置, 其取值范圍為{0,1,···,k·2a?b ?1}, 其中b是當前被計算的節點的高度.最后, FORS 樹雜湊地址的layerAddr 為0, treeAddr 的取值范圍為{0,1,···,2h?h′?1}.

FORS 私鑰生成地址(如圖7 所示) 在生成FORS 實例的私鑰與元素時作為PRF 的輸入使用.keyPairAddr 標識了該FORS 實例對應于XMSS 樹的哪一個葉子節點, 其取值范圍為{0,1,···,2h′?1}(其意義與WOTS+公鑰壓縮地址中的keyPairAddr 一致).因為FORS 樹中包含k個高度為a的完美二叉樹, 因此共有k·2a個葉子節點.treeIndex 標識了FORS 私鑰元素對應的葉子節點的相對位置, 其取值范圍為{0,1,···,k·2a ?1}.最后, FORS 私鑰生成地址的layerAddr 為0, treeAddr 的取值范圍為{0,1,···,2h?h′?1}.

FORS 樹根節點壓縮地址(如圖8 所示) 在通過FORS 樹中的k個根節點計算FORS 的公鑰時作為Tk的輸入使用.keyPairAddr 與FORS 私鑰生成地址中keyPairAddr 的意義一致.最后, FORS 樹根節點壓縮地址的layerAddr 為0, treeAddr 的取值范圍為{0,1,···,2h?h′?1}.

5 無狀態多次簽名算法FORS

FORS 是一種多次簽名方案, 它是HORST[11]多次簽名的改進版本, 而HORST 則是HORS[21]多次簽名的一個變體.注意, 為保證安全性, FORS 多次簽名的輸入必須是一個雜湊函數的輸出.

5.1 FORS 的私鑰和公鑰

參數為(n,k,t= 2a) 的FORS 實例的私鑰包含kt個n字節的元素(第0 個元素到第kt ?1 個元素), 第j個元素的值為PRF(PK.seed,SK.seed,ADRS), 其中ADRS 的addrType 值為6, treeIndex 的值為j.這kt個元素被分成k組, 第0 個元素到第kt ?1 個元素為第0 組, 第it個元素到第(i+1)t ?1個元素為第i組, 第(k ?1)t個元素到第kt ?1 個元素為第k ?1 組.

利用這kt ?1 個元素, 我們可以得到kt ?1 個葉子節點, 其中第j個葉子節點的值為F(PK.seed,ADRS,x),其中x為第j個私鑰元素.類似地,這kt?1 個葉子節點也可以分成k組.每一組中共有t=2a個葉子節點, 可以構造一個高度為a的完美二叉樹, 其各節點的計算規則為: 若z為u和v的父節點, 則z=H(PK.seed,ADRS,u‖v).設這k個樹的根節點為rootFORS0,rootFORS1,···,rootFORSk?1,則這個FORS 實例的公鑰為Tk(PK.seed,ADRS,rootFORS0‖rootFORS1‖···‖rootFORSk?1).

5.2 FORS 的簽名與驗簽

一個參數為(n,k,t= 2a) 的FORS 實例可以對長度為ka比特的消息M進行簽名.令M=(M[0],M[1],···,M[k ?1])∈Fka2, 其中M[j]∈Fa2.則簽名包括該FORS 實例的第M[0],t+M[1],···,(k ?1)t+M[k ?1] 個私鑰元素, 以及這k個私鑰元素相對于該FORS 實例的公鑰的認證路徑.例如,圖10 給出了一個參數為(n,k= 3,t= 23) 的FORS 實例對消息M= (2,6,4) 進行簽名時需要給出的私鑰元素和認證路徑.

圖10 參數為(n,k =3,t=23) 的FORS 實例Figure 10 A FORS tree with (n,k =3,t=23)

6 一次性簽名算法WOTS+

WOTS+是一種一次性簽名體制, 這意味著一個WOTS+實例(即一個公私鑰對) 只能進行一次簽名, 否則該體制的安全性會遭到破壞.WOTS+包括以下系統參數: 安全參數n(在SPHINCS+-SM3 中n= 16), Winternitz 參數w ∈{4,16,256}, 私鑰中n字節秘密元素的個數len, 其中len = len1+len2,且

6.1 WOTS+ 公私鑰對生成方法

6.2 WOTS+ 簽名與驗簽

一個WOTS+實例可以給一個長度為n字節的消息M進行簽名.令M ∈Bn, 首先把M分成log(w) 比特的len1= 8n/log(w) 段, 每一段代表一個介于0 到w ?1 之間的整數, 這len1個整數記為msg[0],···,msg[len1?1].根據這len1個整數, 可計算一個校驗值

類似地, 我們把csum 看成一個len2· log(w) 比特的數據, 將其分成len2段, 每一段代表一個介于0到w ?1 之間的整數, 這len1個整數記為msg[len1],···,msg[len1+len2?1].這樣, 我們一共得到了len=len1+len 個整數:

那么, 消息M的簽名包括len 個n字節元素: 第0 個哈希鏈的第msg[0] 個元素, 第1 個哈希鏈的第msg[1] 個元素,···, 第len?1 個哈希鏈的第msg[len?1] 個元素.

在驗證簽名時, 可以通過這len 個節點和公鑰通過F得到哈希鏈的最終節點, 并通過Tk得到一個候選公鑰, 若這個候選公鑰和真實的公鑰一致, 則簽名驗證通過.圖11(b)給出了一個使用w= 4, len = 5的WOTS+實例對(msg[0]=1,msg[1]=2,msg[2]=0,msg[3]=3,msg[4]=2) 進行簽名的實例.

圖11 WOTS+ 一次性簽名Figure 11 WOTS+one-time signature

7 SPHINCS+-SM3 簽名算法

首先確定當前使用的SPHINCS+-SM3 實例的相關參數.這里根據SPHINCS+v.3[22]給出兩組參數實例, 這兩組參數對應的SPHINCS+-SM3 實例安全性和NIST PQC CFP[18]中第4.A.5 節給出的第1 安全等級相當.第一組參數實例傾向于降低簽名的大小, 其中安全參數n= 16, 超樹結構的總高度為h= 63, 超樹的層數為d= 7, FORS 樹中有k= 14 個高度為a= log(t) = 12 的完美二叉樹,Winternitz 參數w= 16.在第一組參數下, len1= 32, len2= 3, len = len1+len2= 35.可用FORS 進行簽名的消息的長度為ka=168 比特即21 個字節,m=21+7+2=30.在FORS 簽名中, md 的長度為168 比特, idxTree 的長度為54 比特, idxLeaf 的長度為9 比特.

第二組參數實例傾向于提高簽名算法的性能, 其中安全參數n= 16, 超樹結構的總高度為h= 66,超樹的層數為d= 22, FORS 樹中有k= 33 個高度為a= log(t) = 6 的完美二叉樹, Winternitz 參數w= 16.在第一組參數下, len1= 32, len2= 3, len = len1+len2= 35.可用FORS 進行簽名的消息的長度為ka=198 比特,m=25+8+1=34.在FORS 簽名中, md 的長度為198 比特, idxTree 的長度為63 比特, idxLeaf 的長度為3 比特.

SPHINCS+-SM3 的私鑰為(SK.seed,SK.prf,PK.seed,PK.root), 公鑰為(PK.seed,PK.root), 其中SK.seed、SK.prf 和PK.seed 是獨立生成的n字節隨機數, PK.root 是SPHINCS+超樹結構中最頂層的XMSS 樹的根, 可由SK.seed 和PK.seed 計算得到, 計算過程如下.首先, 生成2h′個WOTS+實例, 并以這2h′個WOTS+實例的公鑰作為葉子節點構造一個高度為h′的XMSS 樹, 這個樹的樹根即為PK.root.注意, 在計算這個樹中的數據元素時所使用的ADRS 的layerAddr 為d ?1.

對一個消息M ∈F?2的簽名如圖12 所示,R= PRFmsg(SK.prf,opt,M), 其中, opt 的值為PK.seed或一個新鮮的隨機數, 在后一種情況下, SPHINCS+-SM3 為一個非確定性簽名.SIGFORS的結構如圖13 所示, SIGHT的結構如圖14 所示, SIGXMSS的結構如圖15 所示.在進行簽名驗證時, 可以通過M、R和SIGFORS計算出簽名時所使用的FORS 實例的假想公鑰, 通過這個假想公鑰和SIGHT可以計算出SPHINCS+-SM3實例的假想公鑰, 若這個公鑰和PK.root 的值相同, 則簽名驗證通過.

圖12 SPHINCS+-SM3 簽名結構Figure 12 Structure of a SPHINCS+-SM3 signature

圖13 FORS 簽名結構Figure 13 Structure of a FORS signature

圖14 超樹簽名結構Figure 14 Structure of a HT signature

圖15 WOTS+ 簽名結構Figure 15 Structure of a WOTS+ signature

8 實現與性能測試

我們基于SPHINCS+設計者給出的代碼2https://csrc.nist.gov/Projects/post-quantum-cryptography/selected-algorithms-2022和第7 節中給出的2 組參數, 實現了4 個SPHINCS+-SM3 實例, 每組參數都有一個正常版(simple) 和一個加強版(robust), 包括SPHINCS+-SM3-128ssimple, SPHINCS+-SM3-128s-robust, SPHINCS+-SM3-128f-simple 和SPHINCS+-SM3-128f-robust.在一臺處理器為2.9 GHz 的AMD EPYC-ROME、系統為Linux ubuntu 18.04 的32 核服務器上進行性能測試, 具體結果見表1.與其他數字簽名相比, SPHINCS+的簽名尺寸明顯過大.目前, 存在一些技術[9]在一定程度上壓縮SPHINCS+的簽名尺寸, 但這類方法也會對簽名和驗簽效率產生一定影響.

表1 SPHINCS+-SM3 性能測試Table 1 Performance test of SPHINCS+-SM3

9 結論與討論

我們對基于雜湊函數的后量子數字簽名算法SPHINCS+進行了雜湊函數SM3 的實例化適配, 并進行了初步的實現和性能測試.這一工作表明了在SPHINCS+中使用SM3 的可行性.后續還需要在多種平臺上對相關算法進行實驗和測試.最后指出, 本文給出的簽名算法支持最多264個簽名, 如果降低容許的簽名次數, 則可以通過調整參數給出性能更好且簽名尺寸更小的數字簽名算法.這些簽名算法可以在軟件更新簽名、操作系統安全啟動及根CA 證書簽發等場景中進行應用.

猜你喜歡
私鑰公鑰字節
清掃機器人避障系統區塊鏈私鑰分片存儲方法
比特幣的安全性到底有多高
No.8 字節跳動將推出獨立出口電商APP
基于改進ECC 算法的網絡信息私鑰變換優化方法
No.10 “字節跳動手機”要來了?
一種基于混沌的公鑰加密方案
一種基于虛擬私鑰的OpenSSL與CSP交互方案
簡談MC7字節碼
HES:一種更小公鑰的同態加密算法
SM2橢圓曲線公鑰密碼算法綜述
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合