上一篇文章讲了密码学领域的非对称加密技术,这篇就来讲讲它的另一个重要应用,数字签名。
1.
什么是数字签名?
提起签名,你肯定不会感到陌生。签名就是在文件上手写下自己的名字。这是一种历史悠久的证明自己身份的方式。在古代,就有把“签字画押”作为某个人看过某个文件,并对该文件的内容表示认可的证明。签字在今天仍是很多正式文件的必备,像去银行等机构办理业务、签订合同等,都少不了最后需要我们签字。究其原因,则是因为我们每个人的字迹是不一样的,因此我们的签字可以证明我们的身份。
可见,从古至今,签名是证明我们自己身份,以及对某些内容表示同意的一种极为重要的方式。
那么在数字化时代,很多时候是没有纸质文件的,这样又该如何证明我们的身份呢?
就是使用数字签名技术。
我在上一篇文章中讲了非对称加密技术有一对密钥,公钥和私钥。公钥是公开的,所有人都可以知道。而私钥是不公开的,只有我们自己知道。我还说公钥用于加密,而私钥用于解密。这样别人可以用我们的公钥对内容进行加密,然后把加密结果发送给我们。我们再用私钥去解密,这样就可以达到加密通信的目的了。
但其实私钥也可以对数据进行加密,而加密的结果也只有公钥能去解开,这就是数字签名技术。
2.
数字签名的过程
数字签名的关键步骤分为签名(私钥加密)和验证(公钥解密)两部分,如下图所示:
首先是签名,对一个文件进行签名的步骤如下:
- 对原文内容进行哈希计算,得到一个固定长度的哈希值,即该信息的摘要(关于哈希见之前的文章)
- 签名者用自己的私钥对哈希值进行加密,得到密文,这个密文即数字签名
- 签名者将原文和密文(数字签名)一同发送给接收者
然后接收者在收到签名者发送的原文和密文之后,进行验证,步骤如下:
- 用签名者的公钥对签名进行解密,得到原文内容的哈希值h1
- 接收者自己再对收到的原文内容进行一遍哈希计算,得到哈希值h2
- 比较h1和h2,如果 h1 = h2,则说明签名者确实对该文件进行了签名;否则验证不通过,签名无效。
3.
数字签名在比特币中的应用
从上图可以看到,数字签名技术在比特币的交易过程中是非常重要的。
因为比特币中记录的是交易双方的公钥地址,因此你必须拿出你的私钥才能证明其中的公钥确实是你的,而不是别人的。这就可以保证你不能花别人的钱。
当你需要把自己的比特币转给下一个人时,你需要将上一笔交易(即你获得该比特币的交易记录,该交易记录可以证明你确实拥有要交易的比特币)和你的转账接收者的公钥进行哈希计算,并对得到的哈希值进行数字签名,然后把这些信息发送给你的转账接收者。
你可以把发的这个信息理解为一张付款证明。证明中写了你(假如你叫李四)要向我(李五十)转一个比特币,然后在证明最后签上了自己的名字。如下图所示:
你的转账接收者在收到消息后,可以用你的公钥对你的签名结果验证,这样就可以明确信息的真假。


