第一集 哈希签名始祖 Lamport 方案及其改进版本(Merkle,Winternitz)
第二集 哈希签名树 Merkle Tree Authentication
第三集 HORS Hash to Obtain Random Subset 2002、DBS算法 2008
第四集 GMSS、XMSS、Multi Tree XMSS
第五集 SPHINCS 2015 SPHINCS+ 2019(完结撒花)
一、GMSS
Johannes Buchmann在2007年的论文《Merkle Signatures with Virtually Unlimited Signature Capacity》中提出了GMSS方案。
最重要的是第一次提出了“超树”这个念。
在这个“超树”中,每一个节点是一颗Merkle树。
假设“超树”有
T
T
T层,最底层的节点(Merkle树)从左到右为
T
T
,
0
,
T
T
,
1
,
…
\mathcal T_{T,0},\mathcal T_{T,1},\dots
TT,0,TT,1,…
我们可以拆开“超树”的节点来看看,里面是什么,如上图所示,假设图中被拆开的节点是
T
2
,
4
\mathcal T_{2,4}
T2,4,我们可以看到
T
2
,
4
\mathcal T_{2,4}
T2,4是一棵树,就是一颗正常的Merkle树,其根节点
R
O
O
T
T
ROOT_{\mathcal T}
ROOTT签名过后,连接到的是
T
1
,
0
\mathcal T_{1,0}
T1,0的第
4
4
4个叶子节点(从左往右数)。同理的,我们可以想象,
T
2
,
4
\mathcal T_{2,4}
T2,4的di3个叶子节点连接到的是
T
3
,
15
\mathcal T_{3,15}
T3,15根节点的签名(假设每个
T
\mathcal T
T都有四个叶子节点,4*3+3=15)。
1.1 WOTS & 超树
这里对根节点的签名用的方法是WOTS(WOTS 即Winternitz One Time Signature,在第一集的 第三代改进 Winternitz 1979 中详细讲述过。)
我们可以回顾一下WOTS是怎么运作的:
- 首先是将消息分块,比如说每一块是2 bit,每一块 x i x_i xi换成十进制表示,得到一个十进制的数 m i m_i mi,数的范围为0-3。
- 然后就是对私钥做
m
i
m_i
mi次的哈希函数,得到签名
σ
i
\sigma_i
σi。做0次函数运算就是私钥本身,做15次函数运算就是公钥。
所以呈现的总体结构如下:
来解释一下图中WOTS的结构是什么意思。首先看每一条,一条就对应“一块”消息(因为WOST要对消息分块),这一条就是上图类似的结构。蓝色是公钥,红色是私钥,绿色是签名。
仔细看,还可以看到树中有一些绿色的签名,这里就是用到了第三集讲到的DBS算法。
1.2 最底层的树用的签名方法
最底层的每一棵树的叶子节点就是OTS(One Time Signature)的公钥,这里的OTS可以是最原始的Lamport方案,也可以是Winternitz改良后的的方案(WOTS)这都在第一集中详细讲述过。GMSS原文中使用的是WOTS。到后面的SPHINCS用的是FTS(Few Time Signature),所以我们这里先不用详细讲述整个流程。
二、XMSS(eXtended Merkle Signature Scheme)2011
XMSS没有强调使用“超树”,更多是强调了其算法的安全性,以及满足安全性对哈希函数的要求很小(不需要抗碰撞性 Collision resistant )。
同时,在两节点结合前,先使用随机掩码
b
b
b对节点进行修饰,进一步增加了安全性。
三、Multi Tree XMSS 2013
《Optimal Parameters for XMSSMT》这篇文章结合了XMSS和GMSS,在掩码机制上做了一些修改,如下图
整个架构如下图,现在开始初步又了SPHINCS的样子了。