APP下载

SPHINCS+-SM3: 基于SM3 的无状态数字签名算法*

2024-01-11孙思维刘田雨何逸飞荆继武张立廷闫海伦

密码学报 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椭圆曲线公钥密码算法综述