Bitcoin

有意思的数字签名

前面我们曾经提过的互联网上的加密通信。收信人把自己的公钥发送给发信人,发信人用公钥加密信息后发送给收信人,这样,收信人用私钥来解密信息后就可以读到信了。这个过程应该说是简单而巧妙,基于的一个技术就是,公钥加密过的信息,是可以通过私钥来解密的。这也就是为什么我们也会把公钥叫做“加密钥”,而把私钥叫做“解密钥”了。但是,逻辑之美,美在对称,其实图景的另一半是:私钥也可以做加密,然后由公钥来解密。读到这里你肯定会奇怪:我为何要加密一个东西,而同时让地球人都可以解密呢(公钥是公开的,对公钥和私钥不了解的话,可有空看看我的《有意思的加密通信》那篇文章)?

数字签名与纸上签名的异同

其实上面所述的这个概念的实际应用就是非常非常有用的数字签名。数字签名的过程,就是给一个文件配上一串公开的看似随机的数字。数字签名其实在很多方面跟纸上签名是完全一样的。当我们在纸上签名的时候,其实就是把一串字符,我们的名字,写在一个文件上,基本的作用就是告诉他人我们认可了这份文件。字要写的龙凤凤舞,目的就是很难让他人伪造,其实数字签名就是用计算机数字的方法,来达到相同的目的。

不过也有一些不同。数字签名是依赖于文件内容本身的,意思是,如果文件本身的内容变了,那个原来那个数字签名也会自动失效。这一点在后面我们介绍数字签名的具体过程的时候就会变得很显然了。所以说,这一点就跟纸上签名有很大的不同,如果我们把名字签到合同的最后一页,那么前面几页的内容就算全都换了,那我们的签名也还是有效的。

具体操作过程

具体操作过程是这样,我先生成一对 key,注意这个和我们在加密通信中提过的是一样的。一个是要绝对自己保密的,所以叫做私钥,那在这里又有了另外一个名字叫做”签名 key“,一个是可以公开给他人的,叫公钥,这里的作用是用来验证一个数字签名是否真的是那个私钥签署的,所以也叫“验证 key”

先来看怎么签署一份文件,我拿出我的私钥和那份我要签署的文件,两段数据同时传人一个签名算法进行运算,最终得到一串数,这个就是所谓的”签名“了。这样,人们如何能验证这个文件确实是我签署的,而不是他人伪造的呢?这个很简单,他们只需要拿到我的公钥,连同文件本身和”签名“,这三段数据同时交给一个验证算法来进行运算,运算结果就有两种:一个是 YES,验证成功,一个是 NO,验证失败。

现实应用

所以前面我们能看到,数字签名不但可以证明文件是谁发出的,而且可以保证文件内容丝毫未被改动过,所以可以认为是比纸上签名更为安全的一种签名方式,所以在世界上很多国家,数字签名的合同和文件是有实际法律效力的。再举一个例子,在茫茫互联网上,如果我要签署一笔交易,保证一种特定的数字资产确实是经过我的授权,从我的账号转到了另外一个账号,那么这个过程也可以用数字签名来实现,比特币就是一个这样的实际应用。可汗学院有一门比特币的课程( https://www.khanacademy.org/economics-finance-domain/core-finance/money-and-banking/bitcoin/v/bitcoin-digital-signatures ),其中还专门有一集是讲数字签名的,本文中就参考了这集里面的大量内容。特此感谢。

好了,数字签名就跟大家聊到这里。