2.2 比特币系统中用到的密码学原理 – 签名

前面提到比特币中用到了密码学的两个功能,一个是哈希,另一个是签名。上一篇讲了哈希,下面讲签名。
要讲签名,得先讲一下比特币系统中的账户管理。日常生活中,如果你想开一个账户的话,你得带上证件去银行办理开户手续。这是中心化系统的账户管理方式。,比特币是去中心化的,它没有像银行这样的执业机构,那怎么开账户呢?每个用户自己完成开户,不需要任何人批准。开户的过程很简单,就是创立一个公钥和私钥的对。

在本地创立一个公私钥对就是一个账户,这个在比特币中就代表了一个账户。公私钥这个概念来源于非对称加密体系,叫做asymmetric encryption algorithm。最早的加密体系是对称的,就是没有这个a,叫做symmetric encryption algorithm。比如,两个人之间要进行通讯,我要把某个信息发给你,但是这个通讯的网络是有可能被窃听的。那怎么办呢?咱们俩事先商量好一个秘钥,一个叫encryption key。我把这个信息加密之后发给你,你收到之后再用这个秘钥解密。因为这个加密和解密用的是同一个秘钥,所以这种叫做对称的加密体系。这个前提是,假设有某种安全的渠道能够把这个秘钥分发给通讯双方。你显然不能够说把这个秘钥以明文的形式在网络上传输。我们假设网络本身就是不安全的,有可能被窃听。这是对称加密体系的一个弱点,就是秘钥的分发不方便。为了解决这个问题,就提出了非对称加密体系。即不是用一个秘钥,而是用一对秘钥。有一个公钥和一个私钥。加密用的是公钥,解密用的是私钥。比如,我要把一个信息发给你,我用你的公钥给这个信息加密;你收到之后,再用你的私钥解密,得到原来的信息。要注意,这个加密和解密用的是同一个人的公钥和私钥,即都是这个接收方的公钥和私钥。

这有什么好处呢?这个公钥是不用保密的,你可以告诉所有人,有的人他的homepage上就列出他的public key。私钥是要保密的,因为解密是使用私钥解密的。但是,私钥只要保存在本地就行,不用传给对方,就是说和你通讯的那个人不需要知道你的私钥。他是用你的公钥加密。你如果要回复他,你就用他的公钥加密。双方都不需要知道对方的私钥。这就解决了对称加密当中秘钥分发不方便的问题。

比特币系统中,要创建一个账户,就在本地产生一对公钥和私钥。这个公钥就相当于你的银行账号,别人要给你转账,只要知道你的公钥就行,这个私钥相当于你的账户密码。知道这个私钥就可以把这个账户上的钱转走。那么有一个问题,前面说比特币系统是不加密的,它虽然叫加密货币,但他其实是不加密的,信息都是公开的。那要这个公钥和私钥干嘛呢?实际上是用来做签名。

假如我要转十个比特币给你,我把这个交易发布到区块链上。别人怎么知道这个交易确实是我发起的呢?会不会是有人冒名顶替,想偷偷地把我的账上的钱转走?这就需要我在发布这个交易的时候,用我自己的私钥对这个交易做签名,那其他人收到这个交易的信息之后,再用我的公钥去验证这个签名的正确性。也就是说,签名用的是私钥,验证签名用的是这个人的公钥,仍然是同一个人的公私钥对。

这里你可能有一个疑问。既然每个人是独立的产生账户,在本地独立的生成公私钥对,不需要任何人批准,那么如果两个人生成的公钥恰好相同怎么办?比如有人想偷取比特币,一种方法是就不停的产生大量的公私钥,然后对比一下我产生的这个公钥跟区块链上某个已有的公钥是不是相同。如果相同,就可以用对应的私钥把这个账上的钱给偷走。这种攻击方法从理论上似乎可行,但实际中是不可行的。因为如果是256位的哈希值,产生相同的公私钥的可能性是微乎其微的。要强调一点,就是我们是假设产生公私钥的时候是有一个好的随机源,叫做a good source of randomness。生成公私钥的过程显然是随机的,如果不是随机的,那等于大家都生成同样的公私钥。如果选取的这个随机源不好,那么前面的分析就不成立了。比如,就有可能出现两个人生成的公私钥对是一样的情况。比特币中用的签名算法只是生成公私钥的时候要有好的随机源,之后每次签名的时候也要有好的随机源。只要有一次签名的时候用的随机源不好,就有可能泄露私钥,然后整个比特币系统就全完了。这一点一定要特别注意。

这一章讲了两个功能,一个是哈希,一个是签名。这两个功能是可以结合起来用的。比特币系统中,一般是先对一个message取一个哈希,然后再对这个哈希值签名。关于密码学的部分就到这里了。