01-BTC-密码学原理

声明:本文是要点笔记,介绍和系列笔记均收录在专题:区块链技术与应用

比特币被称为加密货币(crypto-currency)。

区块链上内容都是公开的,包括区块的地址,转账的金额。

比特币主要用到密码学中的两个功能:哈希签名。下面我们来一一介绍。

哈希

密码学中用到的哈希函数被成为 cryptographtic hash function。

哈希函数主要有三个特性:

  1. 碰撞特性(collision resistance);
  2. 隐秘性(Hiding);
  3. 谜题友好(puzzle friendly)。

1. 碰撞特性(collision resistance)

也称哈希碰撞,例如 x≠y H(x)=H(y) 两个不同的输入,输出却是相等的,就称做哈希碰撞。它是不可避免的,因为输入空间(x 取值无限多)总大于输出空间。很难给出 x,来找到 y,除非蛮力求解(brute-force)。

该性质的作用:对一个 message 求 digest。比如 message 取 m,m 的哈希值是 H(m)=digest。如果有人想篡改 m 值,而 H(m) 不变,则无法做到。哈希碰撞无法人为制造,无法验证,是根据实践经验得来的。

2. 隐秘性(Hiding)

说的是,哈希函数的计算过程是单向的,不可逆的,即从 H(x) 无法推导出 x。hiding 性质前提是输入空间足够大,分布比较均匀。如果不是足够大,一般在 x 后面拼接一个随机数 nonce,如 H(x||nonce)。

该性质的作用:和碰撞特性(collision resistance) 结合在一起,用来实现数据保证(digital commitment)(又称为 digital equivalent of a sealed envelope)

把预测结果作为输入 x,算出一个哈希值,将哈希值公布,hiding 让人们知道哈希值而不知道预测值,最后再将 x 公布,因为有哈希碰撞(collision resistance) 的性质,预测结果是不可篡改的。

3. 谜题友好(puzzle friendly)

除了密码学中要求的以上两个性质外,这个性质是比特币中用到哈希函数的第三个性质。
说的是,哈希值的预算事先是不可预测的。假如哈希值是 00...0XX...X,我们事先是无法知道哪个值更容易算出这个结果,还是要一个一个带入(寻找 nonce 值的过程)。

比特币挖矿的过程中实际就是找一个 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 ) 以上三个性质它都是满足的。

签名

在比特币中,开账户、交易等都需要签名。

在比特币系统中开账户:在本地创立一个公私钥匙对(public key ,private key),这就是一个账户。公私钥匙对是来自于非对称的加密技术(asymmetric encryption algorithm)。

对称加密

两人之间信息的交流可以利用密钥(encryption key),A 将信息加密后发给 B,B 收到后用密钥解密,因为加密和解密用的是同一个密钥,所以叫对称加密。对称加密的前提是有渠道可以安全地把密钥分发给通讯的双方。因此对称加密的缺点就是密钥的分发不方便,因为在网络上很容易被窃听。

非对称密钥

非对称密钥是用一对密钥而不是一个,加密用公钥,解密用私钥,加密和解密用的都是接收方的公钥和私钥。公钥是不用保密的,私钥要保密但是私钥只要保存在本地就行,不用传给对方。公钥相当于银行账号,别人转账只要知道公钥就行,私钥相当于账户密码,知道私钥可以把账户上钱转走。公钥和私钥是用来签名。

假如 A 想向 B 转 10 个比特币,A 把交易放在区块链上,别人怎么知道这笔交易是 A 发起的呢?这就需要 A 要用自己的私钥给交易签名,其他人收到这笔交易后,要用 A 的公钥去验证签名。签名用私钥,验证用公钥,用的仍然是同一个人的。创建账户产生相同公私钥的可能性微乎其微,所以大量创建账户来窃取其他人账户是不可行的。

产生好的公私钥前提是有一个好的随机源(a good source of randomness),产生公私钥是随机的,如果随机源不好,就有可能产生相同的公私钥。比特币中用的签名算法,不仅是生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章