加密货币:crypto-currency
比特币是加密货币的一种
比特币用到的密码学两个功能:哈希和签名
哈希:
密码学用到的哈希函数被称为cryptographic hah function。
它有以下三种性质:
collision resistance(哈希碰撞)
性质解释:两个不同的输入,输出却相等。
比如x≠y,H(x)=H(y)。
注意,哈希碰撞不可避免,但是很难人为制造。
比如给出x,很难人为找出y,除非蛮力求解(brute-force)。
性质作用:可以对一个message求digest
比如,m的哈希值是H(m)=digest,如果有人想篡改m值,而使得H(m)不变,则无法做到。
即结合m,可以得知H(m),但是,几乎不可能找到另一个m’,使得H(m’)=H(m)。
hiding(单向不可逆性)
性质解释:哈希函数计算过程单向不可逆。
比如,给定x,可以很容易得到Hash(x),但没有办法在已知Hash(x)的情况下,反推出x的具体取值。
性质前提:输入空间足够大,分布比较均匀。如果不是足够大,一般在x后面拼接一个随机数,如H(x||nonce)。
性质作用:collision resistance和hiding结合实现digital commitment(数据保证)(又称为digital equivalent of a sealed envelope)
比如,某个人对某个股票进行涨停预测,如何保证才能知道预测的准确性?最简单的是提前公布,等待实际结果出现后验证。但实际中,当提前发布预测后,可能会因为预测者本身使用一些手段,对股市实际结果造成影响。所以,应该提前将结果交给第三方机构保管,等到实际结果出现后与实际对比,这就是digital commitment。而第三方机构需要使人信服,但是实际生活中,有很多场景并不存在第三方机构,而区块链为此提供了一个很好的解决方法。
将预测结果看作输入x,算出一个哈希值,将哈希值公布,hiding让人们知道哈希值而不知道预测值,最后再将x公布,因为有collision resistance的性质,预测结果是不可篡改的。
puzzle friendly
性质解释:哈希值的预算事先是不可预测的。比如哈希值是00...0XX...X,事先无法知道哪个值更容易算出这个结果,还是要一个一个带入。
比特币挖矿的过程中实际就是找一个nonce,nonce跟区块的块头里的其他信息合一起作为输入,得出的哈希值要小于等于某个指定的目标预值,即H(block header)≤target。block header 指块头,块头里有很多域,其中一个域是我们可以设置的随机数nonce,挖矿的过程是不停的试随机数,使得block header取哈希后落在指定的范围之内。
性质应用:puzzle friendly是指挖矿过程中没有捷径,为了使输出值落在指定范围,只能一个一个去试。所以这个过程还可以作为工作量证明(proof of work)。
挖矿很难,验证很容易。
(difficult to solve, but easy to verify.)
比特币中用的哈希函数叫作SHA-256(secure hash algorithm-256 )以上三个性质它都是满足的。
签名:
在第三方中心化系统中,账户开通依赖于第三方。但是在区块链去中心化的比特币系统中,很明显不能进行“申请账户”。因此,在比特币系统中开账户就是自己创建申请账户,即在本地创立一个公私钥对(public key ,private key),这就是一个账户。公私钥对是来自于非对称的加密技术(asymmetric encryption algorithm)。
应用前提:公钥和私钥的应用引出了“签名”的应用。
相关应用:当在比特币网络中进行转账时,通过“签名”可以明确是由哪个账户转出的,从而防止不良分子对其他账户比特币的盗取。
在发布交易时,通过自己私钥签名,其他人可以根据公钥进行验证,从而保证该交易由自己发起。也就是说,只有拥有私钥,才能将该账户中的比特币转走。
比如A想向B转10个比特币,A把交易放在区块链上,别人怎么知道这笔交易是A发起的呢?这就需要A要用自己的私钥给交易签名,其他人收到这笔交易后,要用A的公钥去验证签名。签名用私钥,验证用公钥,用的仍然是同一个人的。
关于对称加密和非对称加密:
两人之间信息的交流可以利用密钥(encryption key),A将信息加密后发给B,B收到后用密钥解密,因为加密和解密用的是同一个密钥,所以叫对称加密。前提是有渠道可以安全地把密钥分发给通讯的双方。因此对称加密的缺点就是密钥在网络上很容易被窃取。非对称密钥是用一对密钥而不是一个,加密用公钥,解密用私钥,加密和解密用的都是接收方的公钥和私钥。公钥是不用保密的,私钥要保密。但是私钥只要保存在本地就行,不用传给对方。公钥相当于银行账号,别人转账只要知道公钥就行,私钥相当于账户密码,知道私钥可以把账户上钱转走。
其他知识:假设产生公私钥时有一个好的随机源(a good source of randomness),产生公私钥是随机的,如果随机源不好,就有可能产生相同的公私钥。比特币中用的签名算法,不仅是生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。但是创建账户产生相同公私钥的可能性微乎其微,所以大量创建账户来窃取其他人账户是不可行的。