Digital signatures
数字签名被用来展示你拥有与公钥相关联的私钥,而无需透露该私钥。
所以,如果有人问你是否拥有某个特定公钥(或地址)的私钥,你可以给他们一个数字签名来证明这一点。
为什么我们在比特币中使用数字签名?¶
为此,你需要证明你“拥有”该输出。这可以通过证明你拥有该输出被锁定的地址对应的私钥来实现:
但是,如果你直接把私钥放入交易数据中,网络上的每个人都能够看到它:
而如果任何人获得了你的私钥,他们就可以用它来解锁并花费锁定在相同地址下的任何其他输出。
那么,我们如何在不泄露私钥的情况下解锁输出呢?
数字签名登场¶
数字签名可以由私钥创建,以证明我们拥有该地址对应的私钥。
这意味着我们可以使用数字签名来解锁输出,而无需泄露我们的私钥:
这就是为什么我们使用数字签名,而不是直接把私钥放入交易数据中的原因。
什么能防止别人重复使用数字签名?¶
好问题。毕竟,如果私钥能解锁锁定在某个地址下的任意输出,为什么别人不能把这个数字签名拿去用来做同样的事情呢?
答案:因为每个数字签名都与一笔特定的交易绑定。
换句话说:你不仅仅是使用你的私钥来生成数字签名,你使用的是你的私钥以及原始交易数据本身:
因此,每个数字签名都与它正在使用的交易相连:
所以如果有人尝试在不同的交易中使用这个数字签名,它将与用于生成它的原始交易数据不匹配,比特币网络上的节点将会拒绝它。
此外,数字签名还能防止任何人篡改交易。因为如果交易数据被更改(例如有人企图更改发送的金额或发送的目的地),数字签名将不再起作用。
数字签名是如何工作的?¶
数学,纯粹的数学。
使用数字签名有两个部分:
- 签名 (Signing): 你将私钥 +
交易数据结合,并使用一些数学方法来生成数字签名。 - 验证 (Verifying): 然后你可以把数字签名 +
交易数据+ 公钥拿来进行另外一些数学计算,结果将证实是否使用了合法的私钥来创建该数字签名。
因为请记住,使用数字签名的目标是证明你是公钥的拥有者。
不要忘记地址只是公钥的编码形式。所以即使你把比特币发送到一个地址,你实际上是将它们锁定到一个公钥上。
我知道这个过程一开始看起来像是魔法,但实际上在它底层只是数学。
你如何生成数字签名?¶
数字签名包含两个部分:
- 一个随机部分。
- 一个签名部分。
1. 随机部分¶
首先生成一个很大的随机数。
然后,你将此随机数与椭圆曲线上的生成点(也就是在生成公钥时所使用的相同生成点)相乘:
我们得到的数字签名中的随机部分,就是曲线上的那个点。但我们只需要取它的 x 坐标值:
我们简称为 r。
- 这基本上与生成私钥和公钥的过程相同。只不过在这里,我们这样做是为了在我们的数字签名中加入一个随机元素。
- 这个随机元素有助于确保每个数字签名都是唯一的。
现在我们已经准备好了数字签名的第一部分,但我们还没有把私钥用在任何地方。这就是第二部分起作用的地方……
2. 签名部分¶
接下来,我们使用我们的私钥,并乘以 r(也就是我们刚刚找到的曲线上的那个随机点的 x 坐标)。
接着,我们加上我们要签名的内容。这被称为 message(消息)。在比特币中,这个 message 就是包含我们想要解锁的输出的整个交易数据的哈希值:
包含交易哈希会将签名绑定到某一笔特定交易上(这样它就不能被用于其他不同的交易中)。
最后,为了达到效果,我们把所有这些除以我们最开始生成的那个初始随机数:
好了!我们就得到了数字签名中至关重要的“签名”部分。我们简称为 s。
数字签名先生。
这整个签名随后会被放入交易的解锁代码部分中:
注意:我们用来创建签名的私钥是与输出锁定的公钥相关联的那一个。
现在有趣的地方来了……
如果有人要求我们证明我们拥有某个公钥对应的私钥,我们可以向他们提供我们的数字签名(r 和 s)作为证明。
但是,别人究竟该如何利用这个作为证明呢?
你如何验证数字签名?¶
要验证一个数字签名是否由正确的私钥创建,你向其提供该数字签名的对象需要使用这两个部分在椭圆曲线上找到两个新点:
点 1¶
将 message(消息)除以 s。第一个点就是生成点乘以这个值:
点 2¶
将 r 除以 s。第二个点就是公钥乘以这个值:
验证¶
现在如果我们把这两个点加在一起,我们将在曲线上得到第三个点:
如果这第三个点的 x 坐标与我们开始时的那个随机点的 x 坐标(也就是 r)相同,那么这就是该数字签名确实是使用与该公钥相关联的私钥所生成的证明。
这是对数字签名所涉数学原理的简化解释。 更技术性的解释请参阅 ECDSA。
资源¶
- Bitcoin 101: The Magic of Signing & Verifying – 极好的入门视频,涵盖了签名生成与验证的实际数学细节。


















