密码学原理比特币中主要用到了密码学中的两个功能:哈希和签名。哈希密码学中的哈希称为Cryptographichashfunction,具有三个性质:collisionresistance(哈希碰撞)和Hiding、puzzlefriendly比特币中用的哈希函数是:SHA-256,即
比特币中主要用到了密码学中的两个功能:哈希和签名。
密码学中的哈希称为Cryptographic hash function,具有三个性质:collision resistance(哈希碰撞)和Hiding、puzzle friendly
比特币中用的哈希函数是:SHA-256,即Serure Hash Algorithm。
定义:当x不等于y时,H(x)=H(y)。
collision resistance是客观存在的,但是发生的概率极低,很难在x不等于y时,找到一个H(y)刚好等于H(x)。
collision resistance 的作用在于有人一旦对一组信息摘要(m)进行修改后,几乎不可能找到一个(n) 使得 H(m)=H(n),因此可以根据H(m)不等于H(n) 断定有人对信息进行了修改。
collision resistance 目前无法通过认为制造,MD5已经确认可以人为制造collision resistance。
Hiding 是指哈希计算的过程是单向不可逆的。
已知x,可以计算出H(x);但是已知H(x),无法推算出x。
$ x --->H(x);H(x) --//-- >x$
Hidding的作用是可以和collison resistance结合在一起形成digital commitment(digital equival of sealed envelope 电子信封)。比如股票预测的结果不能提前公布,否则预测的结果可能会影响股民购买的意志,从而导致预测结果不准确;若预测结果不提前公布,则存在预测者根据信息修改预测结果的可能。因此使用hash先将预测者的预测结果x,生成H(x),并将H(x)的值公布出去,等待第二天开奖时,只需将开奖结果通过hash计算一边,其值等于H(x)则表示预测成功,否则预测失败。这里使用的就是Hash算法中的collison resistance和Hidding两个特性。
除了密码学要求的两个性质collision resistance 和Hidding外,比特币还要求哈希函数中的另一个性质,puzzle friendly,它是指:哈希的计算是事先不可预测的。
知道输入值X,很难知道输出哈希值H(X)是什么。
如果想知道算出来的哈希值H(X)是否落在某个范围之内?目前是没有好的办法,只能通过遍历每个输入值X去试,看哪个X算出来的哈希值H(X)恰好落在要求的那个范围之内。
其实挖矿就是寻找一个Nonce随机数,这个Nonce跟区块里面的信息组合到一起,作为输入值X,求出哈希值H(X),使得H(X)要小于等于某个指定的阈值(target),即H(block header) <= target 。
比特币是区块链,区块链就是由一个一个区块组成的链表。每一个区块都有一个块头(block header),block header中有很多域,其中一个域就是我们可以设置的随机数Nonce,挖矿的过程就是不停的尝试不同的Nonce,使整个block header取哈希值之后落在指定的范围之内。
所以puzzle friendly的性质是指:挖矿的过程是没有捷径的,只有不停的去尝试不同的随机数Nonce,才能找到符合要求的解。
所以挖矿的过程才可以用来作为工作量证明(proof of work ,即POW)
讲签名之前我们要了解下比特币系统中的账户管理。
在日常生活中我们想要开个银行账户怎么办呢?必须要带上证件去银行办理开户手续,这就是中心化系统中的账户管理方式 。
那比特币是去中心化的,它没有银行之类的这类机构,那我们怎么开账户呢?
每个用户自己来决定开户,不需要任何人批准。
开户的过程很简单,就是创立一个公钥和私钥的对(Public key, Private key)。在本地创立一个公私钥对,就是一个账户,这个就在比特币中代表了一个账户,公私钥这个概念是来自非对称加密这个体系,叫做Asymmetric encryption algorithm。最早的加密体系是对称的,叫做Symmetric encryption algorithm。
比如说两个人之间要进行通信,我要把某个信息发给你。但是这个通信的网络是有可能被窃听的,那怎么办呢?咱们先事先商量一个密钥,一个叫做Enryption Key ,我把这个信息加密后发送给你,你收到之后再用这个密钥解密,因为加密和解密用的是同一个密钥,所以这个叫对称的加密体系。它有个弱点:密钥的分发不是很方便。
为了解决以上问题,提出了非对称加密体系。非对称加密是不是用一个密钥,而是一对密钥,即公钥和私钥。加密用的是公钥,解密用的是私钥。A先将自己的公钥发给B,B用A的公钥将要发给A的消息加密后发给A,A收到后用自己的私钥解密。公钥是不用保密的,每个用户只要保存好自己的私钥即可。
在比特币系统中,创建一个账户即创建一对公钥和私钥,公钥相当于银行行号,别人给你转账只需要知道你的公钥即可。公钥和私钥实际上是用来签名的。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!