区块链|区块链学习笔记1——密码学原理

一、密码学原理 比特币被称为加密货币(crypto-currency)
哈希函数(cryptographic hash function) 重要性质
collision resistance:哈希碰撞

  1. 两个输入x,y,且x不等于y,哈希函数H,有H(x)=H(y),两个不同的输入算出的哈希值相等=>哈希碰撞
  2. 哈希表里也有哈希碰撞,不同的输入会映射到哈希表的同一位置,哈希碰撞不可避免
  3. 一般输入远远大于输出,比如256位哈希值,输出空间是2的256次方,但输入空间是无限大的,按照鸽笼原理必然会出现,由两个不同输入映射到同一输出的情况
  4. collision resistance在其他书中也称collision free
没有什么高效的方法人为制造哈希碰撞H(x)=H(y),除非蛮力求解(brute-force),遍历所有输入的可能性算出来看看哪一个哈希值相等,比如输入空间比较大,哈希值是256位的话,实际不可行,工作量太大。
collision resistance作用:
  1. 可以对message求digest
    假如一个message是m,H(m)就是它的digest
  2. 用来检测对message的篡改
    比如有人改message的内容,这个H(m)就会发生变化
总的来说,你找不到一个m1,使得H(m1)=H(m),没有办法篡改内容而又不被检测出来。
比如说,你有一个很大的文件,你想把它存放到云存储服务上,将来要用到它的时候,又把它下载回来,那么你怎么知道你下载的版本和你上传的版本是一样的呢,这就可以用到这个哈希函数的collision resistance性质,在你上传这个文件之前,先算一个哈希值出来,存到本地,将来你下载之后,再算一个哈希值,跟原来的哈希值比较,如果一样,就说明下载的文件没有被篡改,下载的还是当初那个版本。
【注意】
没有哪个哈希函数在数学上证明是collision resistance的,也就是说刚刚讲的重要的性质在理论上是证不出来的,只能靠实践中的经验,有些哈希函数,经过长期的实践检验,世界上有那么多密码学的专家,谁也没有找到人为制造哈希碰撞的方法,所以我们就认为哈希函数是collision resistance的,也就是实践经验,也有一些哈希函数,以前我们认为是collision resistance的,但是后来人们找到了制造哈希碰撞的方法,这里一个著名的例子就是MD5,曾经是个很流行的哈希函数,原来很安全,但现在不行了,我们已经知道怎么去认为的制造哈希碰撞了。
hiding:哈希函数的计算过程是单向的 给定一个输入x—>H(x),但是从H(x)无法反推出x,换句话说,这个H(x)没有泄露原来的信息x,但其实想想,要知道这个x的话也是有办法的,还是用那种蛮力的办法,把这个输入所有可能的取值遍历一遍,看看哪个哈希值与H(x)相等,hiding这个性质存在的前提是这个输入空间要足够大,使得蛮力求解的办法是不可行的,而且这个输入分布要比较均匀,各种取值的可能性都是差不多的,如果这个输入空间很大,但是所有的取值空间都是集中在少数几个值,那么也是比较容易被破解的
hiding性质的作用:
可以和collision resistance性质结合在一起用来实现digital commitment(有时候也叫做digital equivalent of a sealed envelope)
sealed envelope 干嘛用的,接下行
比如说有一个人说他能够预测股市,可以预测第二天哪些股票会涨停,怎么证明这个人预测是不是准确呢,一种办法是这个人在电视台上公布预测结果:我预测明天**股票会涨停。第二天收盘之后呢,看一下股票是不是真的涨停,就知道预测准不准了,但这样做会带来问题,预测公布可能会影响第二天的股市,比如说,这个人很有名气,是个股神,本来这个股票不会涨停的,他这么一公开预测,大家拼命去买,结果变成了涨停,当然反方向的情况也可能发生,这个股票本来是要涨停的,有人想踢场子,你不是预测会涨停吗,我就偏不让它涨停,拼命的砸盘,所以都有可能发生。
这说明了一个道理,预测结果不能够提前公开,但是等第二天收盘之后再公开,那怎么知道这个预测结果有没有被篡改过,最后公开的结果是不是最后一天做出来的,这个就要用来 sealed envelope,把预测的结果写到纸上,放到信封里,给封好,这个信封要交给第三方的公证机构报关,等第二天收盘之后再把它打开,验证这个结果准不准,这个是现实生活中的,但如果是digital sealed envelope呢,接下行
把这个预测结果作为输入x—>H(x),然后公布H(x),因为有hiding 的性质,不知道预测结果是什么,然后第二天收盘之后,再把预测结果公布出去,因为有collision resistance的性质,所以这个预测结果是不可能被篡改的,如果改的话,就跟当初公布的哈希值对不上了
细节:
hiding存在的前提就是输入空间要足够大,且要分布均匀,但股票一共就那么几千支,预测股市的输入空间并不大,常见的办法就是输入后面拼接随机数,然后一起取哈希值H(x||nonce),nonce:随机数,保证拼接之后,整个输入是足够随机的,分布也是足够均匀的
比特币还要求第三个性质
puzzle friendly:H(x)事先是不可预测的,光看输入,很难猜出H(x)是什么 比如说,想得到一个哈希值,前面六位都是0
区块链|区块链学习笔记1——密码学原理
文章图片

puzzle friendly就是说事先不知道哪个输入更有可能算出这个哈希值,那你要得到这个哈希值就得一个一个去试,没有捷径,就是比特币挖矿,就是照找这个随机数nonce,这个nonce和区块头里的其他信息合到一起,作为输入,取出一个哈希来,那个哈希值要小于等于某个指定的目标域值H(block header)<=target。
比特币是区块链,区块链就是一个一个区块组成的链表,每个区块有一个块头block header,block header有很多域,其中有一个域是我们可以设置的随机数,挖矿的过程就是不停的去试随机数,使得整个block header去哈希值后落在指定的范围内,小于等于一个target space
区块链|区块链学习笔记1——密码学原理
文章图片

puzzle friendly是说,挖矿的过程没有捷径,只能靠不停地去试nonce,才能找到符合要求的解,所以这个过程才可以作为工作量证明(proof of work),你挖到矿了,找到符合要求的nonce,一定是因为做了大量的工作,因为没有别的捷径,虽然这个挖矿的过程需要很多工作量,才能找到符合要求的nonce,但是一旦有人找到了这个nonce,发不出去之后,其他人要验证这个nonce是不是符合要求,是很容易的,只要算一次哈希值就行了,挖矿很难,验证很容易,这个性质叫做difficult to solve but easy to verify。
比特币用到的哈希函数叫做SHA-256,Secure Hash Algorithm
签名 比特币的账户管理,日常生活中,如果想开个账户,带上证件去银行办理手续,这就是中心化的账户管理方式,但比特币是去中心化的,没有银行这类的机构,那怎么开账户呢?
给出的解决方案:每个用户自己决定开户,不需要任何人批准,开户的过程很简单,就是创立一个公钥和私钥的对儿(public key,private key),在本地创立一个公私钥对,就是一个账户,这个在比特币中就代表一个账户
公私钥
非对称加密体系叫做asymmetric encryption algorithm,最早的加密体系是对称的symmetric encryption algorithm。
比如说,两个人要进行通讯,我要把这个信息发给你,但是这个通讯的网络,有可能被窃听,那怎么办呢?
我们可以先商量一个密钥叫encryption key,我把这个信息加密之后发给你,你收到后,再把这个信息解密,因为加密和解密用的是同一个密钥,所以叫做对称的加密体系,前提是有种安全的渠道能够把密钥发送给通讯的双方,因为显然不能把这种密钥以明文的形式在网络上传输,假设网络本身就是不安全的,容易被窃听,这个其实是对称的加密体系的一个弱点,密钥的分发不是很方便。
而非对称加密体系就提出来我们不是一个密钥,而是一对密钥<公钥,私钥>,加密用公钥,解密用私钥,比如说,我要把信息传给你,我用你的公钥把信息加密之后发给你,你再用你的私钥解密得到原来的信息,加密和解密用的是同一个人的公钥和私钥,都是接收方的公私钥,这有什么好处呢?
公钥不是保密的,可以告诉所有人,私钥要保密,但是私钥是保存在本地的,不用传给对方,对方也不需要你的私钥,如果要回复对方,也有他的公钥回复,他用他的私钥加密,都不需要知道对方的私钥,这就解决了对称加密体系中密钥分发不方便的问题。
比特币系统中,你要创建一个账户,就在本地产生一个公钥和私钥,公钥相当于你的银行账户,别人要给你转账,知道你的公钥就行了,私钥相当于你的账户密码,知道这个私钥,就可以把账户里的钱转走。
那么有一个问题,比特币是不加密的,他叫加密货币但是不加密,信息都是公开的,那要公钥和私钥干啥,其实呢,实际上是签名,比如说我要转10个比特币给你,我把这个交易发到区块链上,别人怎么知道这个交易确实是我发起的呢,会不会有人冒名顶替,想偷偷地把我账户里的钱转走呢,就是要在我发布这个交易的时候,要用我的私钥对这个交易签名,其他人收到这个交易后,再用我的公钥去验证这个签名的正确性,那万一两个人产生的公钥,私钥相同怎么办,就比如说,有人想用这个相同的私钥偷走别人账户上的钱怎么办,理论上说是可行的,但实际上是不行的,假如256位的哈希值,产生相同的公私钥的可能性是微乎其微的,这个概率比地球爆炸还小,这里假设产生了一个公私钥的时侯有一个好的随机源 a good source of randomness ,产生公私钥的过程是随机的。
如果选取得随机源不好的话,就有可能出现两个人生成得公私钥是一样得,比特币中用的签名算法,不光是生成公私钥的时候要有好的随机源,之后每一次签名的时候也要有好的随机源,只要有一次签名用的随机源不好的话,就有可能泄露私钥,然后就全完了
【区块链|区块链学习笔记1——密码学原理】哈希和签名可以结合用,比特币系统当中,一般是对一个message取一个哈希,然后对这个哈希值签名

    推荐阅读