什么是公钥?
公钥是一段可以公开的数字信息,与必须保密的私钥配对使用。钱包用私钥生成签名后,区块链网络可以用公钥检查签名是否有效,而不需要知道私钥。
这个定义比“公钥能证明某人是谁”更准确。签名验证成功,只能说明某份签名对于特定数据和特定密钥有效。要把密钥与现实中的个人、机构或预期交易联系起来,还需要签名算法以外的信息。使用私钥生成签名和使用公钥验证签名,是两个不同的过程。
公钥如何由私钥生成
钱包先生成私钥,再通过约定的数学运算计算出公钥。这个方向容易计算,但在密码学假设成立时,别人不能仅凭公钥倒推出私钥。
具体数学关系取决于签名方案。在椭圆曲线系统中,私钥是允许范围内的一个数,公钥则是根据该数和约定参数计算出的曲线点。椭圆曲线密码学标准 SEC 1 将这种关系写作 Q = dG:d 是私钥,G 是曲线基点。任意一串字节不会自动成为有效公钥,因此系统还需要检查它是否符合曲线规则。
这个计算过程被设计为从私钥得到公钥较为可行;在密码方案假设成立、私钥正确生成的前提下,从公钥恢复私钥在计算上不可行。不过,实际保障仍取决于密钥生成、参数、实现和密钥管理是否正确;“采用公钥密码学”本身不能保证每个钱包或设备都实现无误。
同一公钥也可能有不同编码形式。例如,Bitcoin 椭圆曲线公钥有压缩与未压缩编码。两种编码的字节不同,由这些字节派生的地址也可能不同,但它们可以表示同一个曲线点和签名权限。
签名验证能够说明什么
签名验证成功,说明这份签名与特定数据和公钥相匹配;它不能单独证明签名者的现实身份,也不能证明这笔操作安全或合理。简化后的验证流程包括四步:
- 钱包软件按照网络规则准备需要授权的数据。
- 签名算法使用私钥和这些数据生成签名。
- 验证者使用对应算法,对已签名数据、签名和公钥进行检查。
- 网络另行检查交易格式、花费条件、余额或用于排序和防止重复执行的交易序号等其他规则。
已签名数据发生变化时,原签名通常无法再通过验证。但有效签名并不能说明操作对用户有利、界面完整展示了指令,或密钥控制者理解了现实后果。它是网络授权的一项输入,不是对身份或可信度的通用证明。
公钥、区块链地址和账户的区别
公钥用于验证签名,地址用于让网络识别收款目标或账户,账户则包含余额、交易序号、代码等网络状态。三者有关联,但不是同一个东西:
- 公钥:用于验证签名或执行其他公钥密码学操作的材料。
- 区块链地址:按特定网络规则派生、编码或部署得到的标识。
- 账户:与地址关联的网络状态或授权安排。
以太坊外部账户(EOA)会先用 Keccak-256 算法为公钥计算一段固定长度的数据摘要,再取摘要的最后 20 字节作为地址;合约地址则按其他规则生成,而且合约账户没有自己的私钥。负责确认共识消息的以太坊验证者还使用另一套数字签名密钥,通常称为 BLS 密钥,它与 EOA 密钥对用途不同。由此可见,不能把每个以太坊地址都视作公钥,也不能假设每个地址都与一对密钥一一对应。
Bitcoin 又体现了另一种差异:常见地址类型编码的是花费脚本信息或某种哈希承诺,而不是直接把原始公钥作为地址。相关输出被花费时,公钥才可能公开。因此,地址如何构造、公钥何时暴露,取决于具体网络和输出类型,并不存在适用于所有区块链的单一规则。
普通公钥与扩展公钥不是一回事
普通公钥只对应一对密钥,扩展公钥则可以继续推导出一组后代公钥,因此泄露后的隐私影响更大。比特币改进提案 BIP-32规定的扩展公钥把公钥、链码和派生信息组合在一起,无需私钥就能沿非强化分支派生后代公钥。这可用于只收款或观察用途,但也意味着获得扩展公钥的一方可以看到一组相关公钥。
扩展公钥不能派生强化子密钥,也不能因为它无法签名就简单称为“没有风险”。BIP-32 还说明了一种更严重的组合泄露:如果扩展公钥和相应的某个非强化后代私钥同时泄露,该分支内的祖先和同级私钥也可能被推导出来。这是特定派生方案的性质,不适用于每一把普通公钥。
公钥公开后的隐私边界
公钥本来就可以公开,公开普通公钥通常不会直接暴露私钥;但这不等于没有隐私影响。重复使用密钥或地址、公开扩展公钥,或在交易活动中把多个地址联系起来,都可能让原本分开的活动更容易被关联。
公钥通常也不会隐藏区块链交易内容。公钥密码学还包含加密和密钥协商方案,但签名密钥在交易授权中的作用是验证签名。某个网络是否加密数据,是另一个协议问题。
常见问题
同一公钥能对应不同地址吗?
有可能,具体取决于网络和地址格式。不同编码或脚本可以生成与同一密钥相关的不同地址表示。应用应遵循具体网络规则,不能假定“一把公钥只能有一个地址”。
只有公钥能花费加密资产吗?
通常不能。公钥用于验证;密钥控制型花费还需要有效签名,或满足网络规定的其他花费条件。合约账户和多签安排也可能使用无法归结为单一公钥的授权规则。
相关词条
如需进一步比较两类密钥,可阅读私钥与公钥有什么区别?。
继续了解私钥、区块链地址、助记词和加密货币钱包,或返回加密货币术语表。
参考来源
- NIST FIPS 186-5:数字签名标准——签名生成、验证及签名方案。
- NIST SP 800-57 Part 1 Rev. 5——公私钥类型及密钥管理边界。
- SEC 1 Version 2.0——椭圆曲线密钥对生成、公钥验证和签名操作。
- Ethereum:账户——外部账户密钥、地址派生、合约账户和验证者密钥。
- BIP-32——普通、强化及扩展公钥派生。
- Bitcoin Developer Guide:钱包——密钥编码、地址关系和分层确定性钱包。








