3、数字签名(ECDSA)

比特币中使用的数字签名算法是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)或ECDSA。 ECDSA是用于基于椭圆曲线私钥/公钥对的数字签名的算法,如椭圆曲线章节[elliptic_curve]所述。 ECDSA用于脚本函数OP_CHECKSIG,OP_CHECKSIGVERIFY,OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY。每当你锁定脚本中看到这些时,解锁脚本都必须包含一个ECDSA签名。

数字签名在比特币中有三种用途:
● 第一,签名证明私钥的所有者,即资金所有者,已经授权支出这些资金。
● 第二,授权证明是不可否认的(不可否认性)。
● 第三,签名证明交易(或交易的具体部分)在签字之后没有也不能被任何人修改。

创建数字签名
在比特币的ECDSA算法的实现中,被签名的“消息”是交易,或更确切地说是交易中特定数据子集的哈希值(参见签名哈希类型(SIGHASH))。
签名密钥是用户的私钥,结果是签名:
((Sig = F{sig}(F{hash}(m), dA)))
这里的:
● dA 是签名私钥
● m 是交易(或其部分)
● Fhash 是散列函数
● Fsig 是签名算法
● Sig 是结果签名
ECDSA数学运算的更多细节可以在ECDSA Math章节中找到。
函数Fsig 产生由两个值组成的签名Sig,通常称为R和S:
Sig = (R, S)
签名序列化(DER)
解锁脚本序列化之后:
3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301
包含以下9个元素:
● 0x30表示DER序列的开始
● 0x45 - 序列的长度(69字节)
● 0x02 - 一个整数值
● 0x21 - 整数的长度(33字节)
● R-00884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb
● 0x02 - 接下来是一个整数
● 0x20 - 整数的长度(32字节)
● S-4b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813
● 后缀(0x01)指示使用的哈希的类型(SIGHASH_ALL)

你可能感兴趣的:(3、数字签名(ECDSA))