区块链-椭圆曲线签名算法

目录:http://www.javashuo.com/article/p-nitsjfvy-ey.htmlgit

先参考关于椭圆曲线:http://www.javashuo.com/article/p-ufmqlzjk-es.html算法

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

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

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

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

私钥签名

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

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

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

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

其中,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,则验证者能够得出结论,签名是有效的。在验证签名时,私钥既不知道也不显示。