cargo 中的语义版本控制系统
Cargo 和其他很多工具一样,遵循语义版本控制系统,程序库以
$$\text{major.minor.patch}$$
格式指定,其中
major
:项目进行重大更新,且包含不向后兼容的功能minor
:仅在以向后兼容的方式添加新功能patch
:仅在以向后兼容的方式修复错误,并且没有添加任何新的功能
Cargo 和其他很多工具一样,遵循语义版本控制系统,程序库以
$$\text{major.minor.patch}$$
格式指定,其中
major
:项目进行重大更新,且包含不向后兼容的功能minor
:仅在以向后兼容的方式添加新功能patch
:仅在以向后兼容的方式修复错误,并且没有添加任何新的功能本文建立在 WOTS 签名系统基础上,若还尚不熟悉该签名系统,可参考另一篇文章 Winternitz One Time Signature,论文见 W-OTS+ – Shorter Signatures for Hash-Based Signature Schemes,该算法产生的一对密钥只能签名一条消息。
下面按照 $(GEN, SIG, VER)$ 三元组描述该算法。
$$(pk, sk) \leftarrow GEN(1^k)$$
首先,我们需要确定 $w$ 参数该参数决定哈希私钥多少次构造公钥,此外还需确定哈希之后摘要的长度 $m$ ,或者可以认为是采用的哈希函数族,$n$ 为其他哈希值长度。
HORST 属于 FTS,由 HORS 改进而来,相比较 HORS 而言,牺牲了运行时间,但是减少了公钥的大小,同时算法中引入了掩码的计算。
HORST 中的公钥是二叉哈希树 (binary hash tree) 的根节点,叶子节点是 HOSR 公钥的 $(t=2^\tau)$ 个 $block$ 。
本文的介绍建立在 HORS 之上,若还尚未了解 HORS 签名系统机制,可以参考另一篇文章 Hash to Obtain Random Subset (HORS),此外,提出 HORST 的论文见 SPHINCS: practical stateless hash-based signatures。
Merkle Tree 又称 Hash Tree,实现一般为二叉树,当然也可以用多叉树实现,本质是一样的,WiKi 上也有相关介绍,点击这里传送。
树的叶子节点处存放数据的哈希值,其他的非叶子节点通过子节点进行构造,按照下方公式:
$$node_i = hash(node_{2i+1} || node_{2i+2})$$
其中,节点 $i$ 是节点 $2i+1$ 和 $2i+2$ 的父结点,$||$ 表示串接,或者简单的说拼接,比如 $a = 0001_2, b = 1100_2$ 则
$$ c = a || b = 00011100_2$$
HORS(Hash to Obtain Random Subset)属于 FTS, 其生成的公私钥对,可以多次用来签名消息,但是每一次签名之后,系统的安全性会降低,签名能够被伪造的概率上升。论文可见 Better than BiBa: Short One-time Signatures with Fast Signing and Verifying。
下面以三元组 $(GEN, SIG, VER)$ 对 HORS 签名系统进行介绍。
$$(pk, sk) \leftarrow GEN(1^k)$$
首先,我们需要确定参数 $k$ 和 $t = 2^\tau$,哈希函数输出的摘要长度为 $n = k \times \log_2t = k \times \tau$ bits。