术语表 /地址与密钥
子密钥
又称 Child key、子公钥、子私钥、派生密钥。
- 子密钥是什么?
- 子密钥由派生步骤产生,而非随机数生成器,并以其父密钥生成它时所用的索引来标识。
规定于 BIP-32。
子密钥并不比其上一级密钥更弱。子密钥是一个完整的256位私钥,拥有自己的链码,既能签署交易,也能继续派生出下一级子密钥。这个词描述的是树状结构中的位置,而在标准钱包中,真正存放您比特币的密钥位于根节点以下第五层。
运作方式
派生一个子密钥只需一次哈希和一次加法。父密钥的链码成为 HMAC-SHA512 的密钥,数据为父密钥材料后接一个四字节的索引,得到的64字节结果被对半拆分。右侧的32字节成为子密钥的链码。左侧的32字节与父私钥相加,并对 secp256k1 曲线的阶取模,所得的和即为子私钥。
正是这一加法使公钥派生成为可能。将一个数与私钥相加,相当于将一个点与公钥相加,因此只持有公钥部分的软件无需接触任何秘密,就能算出相同的子公钥。BIP-32还规定了哈希输出超出有效范围的情形,并将其概率定为低于1/2的127次方,处理方式是跳过该索引,改用下一个。
同级密钥不会泄露任何信息。同一父密钥派生出的两个子密钥,在地址上不存在任何可被观察者察觉的共同点,这正是每笔付款使用新地址的价值所在。只有持有父扩展公钥的人才能还原这种关系。
在哪里会遇到它
钱包实际上就是由子密钥构成的,因此您看到的是索引编号,而不是密钥本身。
在 Sparrow 或 Electrum 的币控界面中,每个地址都带有其路径:m/84'/0'/0'/0/7是第一个账户的第8个收款地址(从零开始计数)。在 Trezor 或 Ledger 上确认提币时,设备会在地址旁显示同样的路径,您可据此核实目标地址属于您自己的密钥树,而不是属于入侵了电脑的人。
深度同样值得查看。主密钥位于深度0,在 BIP-44风格的路径下,为付款签名的密钥位于深度5。两者之间的每一层都是上一层的子密钥,同时又是下一层的父密钥,因此这两个词描述的是一种关系,而不是等级。
由此可得出一个习惯:除非您打算彻底放弃该分支,否则不要从 HD 钱包中导出单个子私钥。非硬化子私钥与父扩展公钥结合,会暴露父扩展私钥,因此一次疏忽的导出就可能让整个账户失守,而不只是一个地址。
子密钥 vs 父密钥
子密钥和父密钥是同一种对象,只是从同一个派生步骤的两端来看。除主密钥外,每个密钥都是某个密钥的子密钥,而每个被用来派生的密钥又是某个密钥的父密钥,因此位于 m/84'/0'/0' 的节点同时兼具两种身份。不对称之处在于两者各自能够计算的内容。父密钥可以无限派生其子密钥,而子密钥本身无法透露其上一级密钥的任何信息。这种单向性就是整棵密钥树的全部安全模型,而硬化派生正是让它保持单向的手段。