区块链-02-BTC-密码学原理

目录

  • 区块链与密码学
    • 一、哈希(散列)函数
    • 二、密码散列函数(Cryptographic hash function)
      • Collision resistance
      • Hiding
      • digital commitment
      • puzzle friendly
    • 三、签名
      • 比特币中账户管理
      • 两种加密体系
        • 对称加密体系
        • 非对称加密体系
      • 比特币中的签名

区块链与密码学

以比特币为例子,比特币作为区块链的经典应用,其本质是一种加密货币, 但实际上,比特币是不加密的,区块链上的所有信息都是公开的,包括账户的地址、交易记录、金额等等。比特币主要用到了密码学中的2个功能,一个是哈希,另一个是签名;这也是区块链中涉及到密码学部分的主要功能。

一、哈希(散列)函数

哈希函数是可以用来将任意大小的数据映射到固定大小值的任何函数。哈希函数返回的值称为哈希值、哈希码、摘要或简单的哈希。这些值用于索引一个固定大小的表,称为哈希表。使用哈希函数为哈希表建立索引称为哈希或分散存储寻址。
区块链-02-BTC-密码学原理_第1张图片

二、密码散列函数(Cryptographic hash function)

密码散列函数(英语:Cryptographic hash function),又译为加密散列函数、密码散列函数、加密散列函数,是散列函数的一种。它被认为是一种单向函数,也就是说极其难以由散列函数输出的结果,回推输入的资料是什么。这样的单向函数被称为“现代密码学的驮马”

区块链-02-BTC-密码学原理_第2张图片
那么区块链中的哈希函数主要是密码散列函数,它有几个重要的性质:

  1. Collision resistance(抗碰撞性)
  2. Hiding(不可逆)
  3. puzzle friendly (仅比特币需满足)

Collision resistance

抗碰撞性的意思就是对于一个哈希函数H,2个输入a,b,你很难找到两个不同的输入使得哈希后的输出值相同
H ( a ) = H ( b ) , w h e r e a ≠ b H(a)=H(b),where a≠b H(a)=H(b),wherea=b
两个不同的输入输出的值是相同的,一般来说,哈希碰撞是无可避免的,因为你的输入空间其实远远大于输出空间,假如我们的哈希函数输出值控制在256个bit位,那么它的输出空间有2256种情况,理论上,如果进行2256+1次计算,则能达到哈希碰撞,也就是能找到两个不同的输入使得哈希值相同。但是这样的计算太庞大,很难实现。

利用抗碰撞性,我们可以拿来检测数据是否被篡改,假如我们有一个数据m,它的哈希值H(m),也把它叫做’message digest’,如果有人改了m,那么哈希值一定会发生变化。因为抗碰撞性,意为着你无法篡改内容而又不被发现。
Collision resistance在数学上无法被证明,只能靠实际经验获得,但有一些哈希函数如MD5已经被找到一种方法能够人为的构造哈希碰撞。

Hiding

hiding的意思是哈希过程是不可逆的,你知道哈希值,并不能反推出哈希函数的输入值具体是多少。但这个条件成立的前提是
输入空间足够大:如果只有几个输入,那就很没意思了
输入空间均匀分布:即使有很大的输入空间,但如果某几个输入值被选中的概率很大,那就意味着有很大的概率反推输入值

digital commitment

用前面两个性质可以实现digital commitment,这也叫digital equivalent of a sealed envelop。
举一个现实生活的例子。如一个人说自己能预测股票涨停,那么如何证明呢?如果让他提前公布自己的“预测”——明天股票的涨停,然后明天再去看股市,那么他公布的信息本身就会影响到股票涨停。如果在股票涨停之后再公布,那么大家会怀疑他有没有篡改自己的“预测”。而这里sealed envelop也就是解决这个问题的办法,让这个人先把预测结果写在纸上,放进信封里封好,然后交给第三方的公证机构保管。第二天股市收盘后,再让公证机构检查信封完好、打开信封、查看纸上的预测结果和实际涨停是不是一致即可。
而使用digital commitment在这个问题上的做法是把预测结果计算出一个哈希值,然后把哈希值公布出去,因为有hiding的性质,所以大家没法通过哈希值知道预测结果。第二天收盘后公布预测结果,因为有collision resistance的性质,所以预测结果是没有篡改过的,否则和公布的哈希值就对不上了。在这个问题里,例如预测的是“涨的股票的名字”,那么因为股票一共就那么多支,输入空间并不是足够大,这样就不满足hiding的性质(大家可以遍历所有的股票取哈希去知道预测的是哪支股票涨)。这时候的解决办法可以是在输入后面加上一个随机数nonce,增大输入空间和输入的概率随机性,使得分布足够的均匀:
H ( x ∣ ∣ n o n c e ) o r H ( x ∣ ∣ n o n c e ) H(x||nonce) or H(x∣∣nonce) H(x∣∣nonce)orH(x∣∣nonce)
在挖矿的时候,经常也是去算这个nonce。

puzzle friendly

除了前面两个性质,比特币中的哈希函数还要满足puzzle friendly这个性质。该性质要求哈希值计算事先不可预测,仅仅根据输入很难预测出输出。例如:我们需要一个哈希值,存在于某一个范围内,只能通过不停运算查找出来。比如说,我们想得到一个哈希值
这个哈希值前面K个位置都是0,总共是256位。
00000... X X X X X X 00000...XXXXXX 00000...XXXXXX
那么什么样的输入可以得到这样的输出?答案很难得到。
该性质保证了比特币系统中,只能通过“挖矿”获得比特币。也就是说,该性质保证了工作量证明(POW)机制可以运行下去【“挖矿难,但验证易”】。在比特币系统中采用SHA-256哈希函数。比特币挖矿的过程就是去找一个随机数nonce,这个nonce和区块的块头里的其它信息合并在一起作为输入,取哈希值,所得哈希值要小于等于某个指定的阈值:
H ( b l o c k , h e a d e r ) ≤ t a r g e t H(block,header)≤target H(block,header)target
注意,nonce不是区块块头以外的东西,它是其中的一个域,但是可以人为设置。挖矿的过程就是不停的去试nonce,使得整个块头部分取哈希小于等于target。有了puzzle friendly这个性质,使得比特币挖矿的过程没有捷径可言,只能不停的去试大量的nonce才能找到符合要求的解,所以才能用来用作工作量证明(proof of work,POW)。这个puzzle friendly和最前面的collision resistance有一定的联系,但不是完全一样。那个是无法去人为制造哈希碰撞,而这个是无法去人为构造符合特定特征的哈希值。
虽然找到一个符合要求的nonce很难,但一旦找到之后,将它发布出去以后,其他人要验证这个nonce是不是符合要求是很容易的,只要算一次哈希值再和target比较一下就可以了。

三、签名

比特币中账户管理

在第三方中心化系统中,账户开通依赖于第三方。但去中心化的比特币系统中,很明显不能进行“申请账户”。在比特币系统中,申请账户是用户自己来处理的,即自己创建一个公钥-私钥对。
公钥和私钥的应用保证了“签名”的应用。当在比特币网络中进行转账时,通过“签名”可以明确是由哪个账户转出的,从而防止不良分子对其他账户比特币的盗取。在发布交易时,通过自己私钥签名,其他人可以根据公钥进行验证,从而保证该交易由自己发起。也就是说,只有拥有私钥,才能将该账户中的比特币转走。在比特币系统中,很难通过生成大量公私钥对来获取他人私钥

两种加密体系

对称加密体系

最早的加密体系是对称的加密体系(symmetric encryption algorithm)。如两方进行通信,商量好一个密钥(encryption key),发送方使用密钥加密,接收方使用密钥解密。因为加密解密用的是用一个密钥,所以这是对称的加密体系。这种方式假设了存在某种安全的渠道,能够把密钥分发给通讯双方,这是对称加密体系的一个弱点。

非对称加密体系

非对称的加密体系(asymmetric encryption algorithm)不再像对称加密那样使用一个密钥,而是使用一对密钥,即公钥和私钥,加密用的是公钥,解密用的是私钥。例如A要发信息给B,那么使用B的公钥对信息进行加密,B收到信息后用B自己的私钥进行解密就能得到原来的信息。也就是说加密和解密用的都是接收方的公钥和私钥。这样做的好处是公钥是不用保密的,可以告诉所有人,有的人主页上就有PGP public key。只有私钥是要保密的,但是私钥只需要保存在本地就可以了,不用传递给任何人,这样就避免了传输密钥过程不安全的问题。要回复对方再用对方的公钥加密,始终都不需要知道其他人的私钥,这就解决了对称加密体系中密钥分发不安全(不方便)的问题。

比特币中的签名

加密货币是不加密的,前面学的非对称加密的公钥和私钥在比特币系统中就是用来做签名的。
比如A要向B转账,即A在区块链上发起一个交易,所有交易是公开的,但大家怎么判断这个交易确实是A发起的,而不是别人冒名顶替的,这就需要A用户用自己的私钥对交易进行签名。其他用户拿到签名和交易信息后,可以用A的公钥去验证签名的正确性。签名用的是私钥,验证签名用的是公钥。都是同一个用户的公钥和私钥。生成公钥私钥的过程是随机的,但要求选取一个好的随机源,否则前面的分析就不成立了(就有不足够小的可能生成重复的公钥私钥对)。比特币中使用的签名算法不仅在生成公钥私钥对时有好的随机源,在之后每次签名的时候也要有好的随机源。如果签名时使用的随机源不好,就有可能泄露私钥。
比特币系统中的签名,一般是先对message取一个哈希,然后再对哈希值签名。

你可能感兴趣的:(区块链-02-BTC-密码学原理)