深入理解比特币系列(17): 密码学基础第三部分(数字签名)

数字签名是用来证明数字消息或文档的真实性的数学方案。 有效的数字签名给予接收者足够的理由相信消息是由已认证的发送者创建的。发送者不能拒绝发送消息,且消息在传输过程中不可以被更改(以确保完整性)。比特币中使用的数字签名算法是椭圆曲线数字签名算法或英文简写为ECDSA。

数字签名在比特币中有三个目的:
1. 签名证明私钥的所有者,拥有支出资金的所有权;
2. 授权证明不可否认;
3. 签名交易(或交易的具体部分)在签名后没有且不能被任何人修改。

数字签名的创建

比特币采用椭圆曲线算法,以私钥及交易哈希为输入计算数字签名。

Sig = (R, S)

公式如上,数字签名包含两个部分,R和S。可依国际标准编码方案或DER将签名序列化为字节流。一个依据DER序列化的签名如下:

3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301

上述签名更详细的解读如下:

– 0x30:DER序列的开始
– 0x45:序列长度(69字节)
– 0x02:后面跟着一个整数值
– 0x21 :整数的长度(33字节)
– R:00884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb
– 0x02:后面跟着一个整数
– 0x20:整数的长度(32字节)
– S:4b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813
– 后缀0x01:指示使用的散列的类型(SIGHASH_ALL)

数字签名的验证

任何人都可以通过交易信息及公钥(对应于用于之前创建签名时的私钥)来验证数字签名的有效性。验证签名意味着“只有生成此公钥的私钥的所有者才能在此交易上产生此签名。”当验证算法返回的布尔值为TRUE时,证明数字签名验证通过。

数字签名哈希类型

数字签名意味着签字人对特定交易数据的承诺。在最简单的形式中,签名适用于整个交易(SIGHASH ALL),从而提交所有输入,输出和其他交易信息。但是在某些场景中,签名也可以只提交一个交易中的子集数据。

比特币签名通过一个SIGHASH标志的设置指示交易数据的哪一部分包含在私钥签名中。 具体标志含义如下表:

SIGHASH flag Value Description
ALL 0x01 Signature applies to all inputs and outputs
NONE 0x02 Signature applies to all inputs, none of the outputs
SINGLE 0x03 Signature applies to all inputs but only the one output with the same index number as the signed input