子公钥派生
在第59页的“公钥”部分,我们学习了如何使用椭圆曲线密码学(ECC)从私钥创建公钥。虽然在椭圆曲线上的操作并不直观,但它们类似于常规算术中使用的加法、减法和乘法操作。换句话说,可以对公钥进行加法、减法或乘法操作。考虑我们在第59页的“公钥”部分中使用的操作,用主私钥(k)和生成器点(G)生成公钥(K):
K = k × G
通过简单地将相同的值添加到等式的两边,可以创建一个派生密钥对,称为子密钥对:
K + 123 × G == k + 123 × G
在本书中的方程中,我们使用单个等号表示诸如 K = k × G 这样的操作,其中计算了变量的值。我们使用双重等号来显示方程两边是等价的,或者如果两边不等价,则操作应返回 false(而不是 true)。
这样做的一个有趣的结果是,可以使用完全公开的信息将123添加到公钥中。例如,Alice生成了公钥K并将其提供给Bob。Bob不知道私钥,但他知道全局常数G,因此他可以向公钥添加任何值,以生成一个派生的公共子键。然后,如果他告诉Alice他向公钥添加的值,她可以将相同的值添加到私钥中,从而生成与Bob创建的公共子键相对应的派生私有子键。
换句话说,即使你不知道父私钥的任何信息,也可以创建子公钥。添加到公钥的值称为密钥调整值。如果使用确定性算法来生成密钥调整值,那么即使某人不知道私钥,也可以从单个公共父键创建一系列基本上无限的公共子键。控制私有父键的人可以使用相同的密钥调整值创建所有相应的私有子键。
这种技术通常用于将钱包应用的前端(不需要私钥)与签名操作(需要私钥)分离。例如,Alice的前端向想要支付她的人分发她的公钥。稍后,当她想要花费收到的钱时,她可以向硬件签名设备(有时令人困惑地称为硬件钱包)提供她使用的密钥调整值,该设备安全地存储她的原始私钥。硬件签名者使用这些调整值来推导所需的子私钥,并使用它们来签名交易,然后将已签名的交易返回给较不安全的前端以广播到比特币网络。
公共子键派生可以产生与先前看到的图5-2类似的线性键序列,但现代钱包应用程序使用一种更巧妙的技巧来提供键树而不是单个序列,如下一节所述。
Last updated