区块链技术与应用(一)之比特币中的密码学原理
一.写在前面
本系列的内容主要是来自于肖臻老师的区块链技术于应用的公开课和一些自己的理解。这节的主要内容为比特币中运用到的密码学原理,主要是两部分hash和签名。以下内容按这两部分来展开。
二.cryptographic hash fucntion
在密码学中用到的hash被称为cryptographic hash fucntion,中文译为密码散列函数。它主要有三个特性,分别是collision resistance、hiding和puzzle friendly
2.1 collision resistance
collision resistance即抗碰撞性。所谓的碰撞就是在使用hash的过程中所无法避免的hash冲突。hash冲突是指假设有输入x,y以及hash函数h,当有x不等于y时,却出现h(x) = h(y)。由于输入空间和对应映射的输出空间的差距,hash碰撞是不可避免的。具体而言假设hash输出的结果为256比特位,则输出空间为2256,而输入空间是无限的,显然碰撞是一定会发生的。那这里所谓的抗碰撞性是指什么呢?其实是指当你已有x以及h(x)这两个值,除了使用暴力求解的方式,没有什么有效的方式去找到一个y使h(y)=h(x),同时暴力求解的代价非常高。简单的说就是人为制造hash碰撞几乎是不可能。那么这个特性可以运用在什么地方呢?通过上述所讲可以发现,几乎是找不到一个y使它的hash值与x的hash值相同,也就意味着一旦x发生修改,对应的hash值也会发生改动,可以运用这点对信息做摘要。比方说你将一个文件进行hash得到hash值,并将hash值保存在本地,然后将文件上传到网盘保存,当你再次从网盘下载回文件时如何判断文件是否被修改,只需要再对网盘计算一次hash值即可,比较这次的hash值与之前保存在本地的hash值是否一致即可判断出文件是否被修改。
2.2 hiding
hiding即隐匿性。简单的说就是指hash的过程是不可逆的。具体而言现在有x和它的hash值h(x),除了暴力求解遍历所有输入的方式,没什么好的办法能从hash值h(x)推出x的内容,即hash值不会泄露输入的信息。要做到hiding的这一特性,它对输入是有要求的,必须满足输入空间足够大和各种输入的可能性较为平均这两点。只有满足这两点才可以做到除了暴力求解没什么有效的方式可以进行逆hash运算且暴力求解的代价极大。在实际的使用当中为了做到这两点常常需要对输入的数据x再连接上一连串的随机数从而满足上述的要求。当某hash函数具备了collision resistance和hiding这两点时,我们就可以实现digital commitment(数字化承诺)或者a digital sealed envelope(数字密封信封)。举个例子,假设这么一个情景,甲表明自己可以预测明日哪支股票大涨,那么该如何证明甲的预测是否正确,显然如果在当下直接公布甲的预测结果并等到明日观察股市情况来验证这种方式是不可行,因为股市很可能受到甲预测的影响,比方说甲是巴菲特,那么明日的股市或多或少都将受到影响,这样验证的过程就将变得不准确。一种可行的方式是将甲预测的结果写入信封,密封好交由第三方安全机构等明日股市情况出来后再公开。而当hash函数具有collision resistance和hiding这两种特性时,我们就可以先对预测进行hash然后直接公布于众,首先由于hiding的特性,预测的内容是无法知晓的,也就无法影响到股市的发展,其次由于collision resistance的原因,预测的内容是无法篡改的,也就做到了和信封一样的效果。
2.2 puzzle friendly
puzzle friendly即谜题的友好性。除了通过使用hash函数去计算hash的值,没有其他什么方法能让你仅仅通过输入的数据判断出它的hash值是怎么样的。举个例子假设为256比特位的hash结果,现在需要的是前k位为0的hash的结果,除了去一个个试探每个输入值的hash结果判断结果是否满足这个特征之外没有其他有效的办法能让你直接看出哪个输入会有这样的hash输出。这个特性有什么作用呢?它主要体现在它是比特币挖矿过程工作量证明的基础。常说的比特币挖矿的过程,其实就是求解一个长随机数n,这个n和区块链中的区块的块头组成输入信息x,使x的hash值h(x)落在某个指定的范围内。由于puzzle friendly的原因,只能通过一个个遍历输入的方式去寻找这个n而没有其他捷径寻找到这个随机数n,而这个寻找随机数的过程就是工作量的证明。
三.签名
签名是属于非对称的加密方法。有非对称加密算法自然也就有对称算法,两者的区别在于在加密和解密的过程中是否使用相同的密钥。对称加密算法在加密和解密的过程中使用相同的密钥,这就带来了密钥分配和运输的问题。而非对称密钥很好的解决了这个问题,每个个体都拥有一对密钥,称为公钥和私钥,私钥保存在本地,公钥则向全体公开,解决了密钥分配和运输的问题。是否可能通过不断产生公私钥对同时比较是否有和其他人一致的公钥从而破解出私钥的情形?这种情况发生的概率极低,可以忽略不记。当采用非对称加密算法时,当某个个体想向另一个个体发送信息时,只需要将信息使用对方的公钥加密即可,当对方收到后,再用自己的私钥解密。而所提到的签名就是要证明信息是本人发送的,只需要对所发送的信息使用私钥进行加密,接受方想进行验证只要使用公钥进行解密即可,若为其他人冒名,则解密出来的信息将是无法被理解的,也就知晓冒名现象的发生。
四.写在最后
对区块链方面感兴趣的同学可以加个好友,大家一起讨论一下。