以下为翻译文章,英文原版链接在这里,文章中的“我”指的是原文作者

椭圆曲线数字签名

现在你已经可以生成EC密钥对,下一步就是用它来签名和验证消息。我说的消息是指任何数据,文字或者二进制,总之是需要证伪的信息。比特币客户端用电子签名来认证交易,矿工则用它来授权并广播他们的有效交易记录。 这篇文章只设计通用消息。之后,我们会在比特币交易签名流程中了解到都有哪些不同的消息。

ECDSA 签名

很容易理解EC签名算法的简称是ECDSA,全称是椭圆曲线数字签名算法。在这个算法里面,所有参与者都得在一个哈希函数H上取得共识,因为我们要签名的是消息的哈希映射,而不是消息本身。如果只是签署方S有访问私钥的权限,而签署方V保管着对应的公钥,这是没有意义的。我将继续使用上一章生成的私钥和公钥。 下面这个例子是在SHA-256摘要上进行操作,请记住,比特币特指的H函数是一个256位哈西函数,同时也是个双重哈西函数(这里有关于哈西函数的解释文章)

签名过程

第一步把我们的消息放入一个文件:ex-message.txt:

1
This is a very confidential message

它的SHA-256摘要是(别忘了末尾的换行符:\n):

1
2
3
4
45 54 81 3e 91 f3 d5 be
79 0c 7c 60 8f 80 b2 b0
0f 3e a7 75 12 d4 90 39
e9 e3 dc 45 f8 9e 2f 01

之后,我们用私钥再给这段摘要签名:

1
$ openssl dgst -sha256 -sign ec-priv.pem ex-message.txt >ex-signature.der

这个ex-signature.der文件就是DER格式的消息签名。 OpenSSL可以对任何二进制格式进行DER编码,我在这里胜率这其中的细节。我们没有必要指导ECDSA签名的语意,只需要记住这个签名实际上是一对非常大的数字(r,s)

你可能已经察觉到这个签名在每次运行完程序后都不一样,这是因为,这个默认的签名过程是非确定性的。这有在给区块链交易信息签名的时候可能导致问题,因为签名是交易数据段的一部分,你应该还记得交易数据段哈西映射后转化到txid的过程。结果是这个txid在你每签名一个交易时都会变化。这种现象就是所谓的交易延展性。

用-hex参数可以显示签名的16进制格式:

1
$ openssl dgst -sha256 -hex -sign ec-priv.pem ex-message.txt

为了使结果可以重复利用,最好将DER文件按16进制格式导出:

1
$ hexdump ex-signature.der

验证过程

Comments