目录:https://blog.csdn.net/qq_40452317/article/details/89646633

先参考关于椭圆曲线:https://blog.csdn.net/qq_40452317/article/details/90075982

比特币中使用的数字签名算法是椭圆曲线数字签名算法(EllipticCurveDigital SignatureAlgorithm)或 ECDSA

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

数字签名是一种由两部分组成的数学方案:第一部分是使用私钥(签名密钥)从消息(交易)创建签名的算法; 第二部分是允许任何人验证签名的算法,给定消息和公钥。

在比特币的 ECDSA 算法的实现中,被签名的“消息”是交易,或更确切地说是交易中特定数据子集的哈希值。 签名密钥是用户的私钥。

私钥签名

设私钥公钥为k和K,即前面提到的

                                      K=k*G,其中G是椭圆曲线上的点。

选择一个随机数,k(零时私钥),生成相对应的临时公钥P,P=k*G(椭圆曲线上点)。临时工要P的x坐标就是数字签名的R值。通过计算,可以得出数字签名的S值。

                                   S=k^{-1}(Hash(m)+dA*R) mod p(Hash(m)+dA*R)mod p

其中,k是临时私钥,R是临时公钥P的x坐标,dA是私钥,m是交易数据,p是椭圆曲线主要顺序。

我们计算出了两个值,R和S,它们就序列化为字节流(使用一种称为“分辨编码规则”(DistinguishedEncodingRules)或 DER 的国际标准编码方案。)形成签名,拼接在一起和消息一起发送出去。例如:

3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4a
e24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e 381301
  • 0x30 表示 DER 序列的开始
  • 0x45- 序列的长度(69 字节)
  • 0x02- 一个整数值
  • 0x21- 整数的长度(33 字节)
  • R-00884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb
  • 0x02- 接下来是一个整数  0x20- 整数的长度(32 字节)
  • S-4b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813
  • 后缀(0x01)指示使用的哈希的类型(SIGHASH_ALL)

公钥验证

接收方收到消息和签名。要验证签名,必须有签名(R 和 S)、序列化交易和公钥(对应于用于创建签名的 私钥)。本质上,签名的验证意味着“只有生成此公钥的私钥的所有者,才能在此交易上产生此签名。”

签名验证算法采用消息(交易或其部分的哈希值)、签名者的公钥和签名(R 和 S 值),如果签名对该消息和公钥有效,则返回TRUE值。

验证是签名生成函数的倒数,使用 R,S 值和公钥来计算一个值P, 该值是椭圆曲线上的一个点(签名创建中使用的临时公钥):

                               P=S^{-1}*Hash(m)*G+S^{-1}*R*Qa

其中:R和S是签名值,Qa是发送方的公钥,m是签署的交易数据,G是椭圆曲线上的点。

如果计算点P的x坐标等于R,则验证者可以得出结论,签名是有效的。在验证签名时,私钥既不知道也不显示。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐