比特币是如何实现加密?比特币的密码学原理
⽐特币是如何实现加密?⽐特币的密码学原理
在⽐特币(BTC)中主要应⽤的两个密码学原理是哈希与签名。女汉子
我们先从什么是哈希函数说起.
哈希函数
哈希函数是给定⼀个输⼊x,输出 y = H(x),跟常见的其他函数是⼀样的。哈希算法有很多种,常见的⽐如MD5,HAVAL,SHA-256等。
密码学应⽤的哈希函数中叫做:Cryptographic Hash Function。哈希算法应⽤⾮常⼴,在密码学中对于哈希函数有两个要求,⼀个是Collision Resistance ,另⼀个是 Hiding。
⽐特币中的应⽤的是 SHA-256 算法 ( Secure Hash Algorithm ),因为⽐特币对于哈希函数还有另⼀个要求叫做 Puzzle Friendly。
抗碰撞性
1. Collision Resistance 抗碰撞性燃气热水器品牌排名
1. Collision Resistance
抗碰撞性是说该哈希算法具有抵抗哈希碰撞的能⼒(⽽不是不会发⽣碰撞)。
什么叫碰撞?
碰撞是鸽笼原理的⼀个特例。
鸽巢原理(⼜名狄利克雷抽屉原理):假设有⼀个n个笼⼦和n+1只鸽⼦,所有的鸽⼦都被关在鸽笼⾥,则⼀定有⼀个笼⼦中⾄少有两只鸽⼦。
鸽巢原理
从上述原理我们可以引申出⼀个有趣的观点:把⼀个函数的输⼊值的取值范围看成笼⼦,把这个函数的输出值的取值范围看成鸽⼦,如果输⼊值的取值范围(⽐如为1、2、3、4、5)⼤于输出值的取值范围(⽐如为a、b、c、d),如果改函数是单射(每⼀个输⼊对应唯⼀⼀个输出),则⼀定存在某⼀个输⼊ x1 与 另⼀个输⼊ x2 有同样的输出。这种情况在哈希算法中就叫做“碰撞”。
碰撞:
对于输⼊x,其哈希值为 H(x);对于输⼊y,其哈希值为H(y)。
若存在 y≠x,存在H(y)=H(x),则发⽣了碰撞。
碰撞是不可避免的
假设我们有⼀个256位的算法,则其输出值的最⼤范围为2^256。但是输⼊的范围是⽆穷⼤的,所以理论上碰撞是⼀定会出现的。
⽽抗碰撞性是说,没有什么⾼效的⽅法,⼈为的去制造哈希碰撞。⽐如给定⼀个x,其哈希值是H(x),我们没有⾼效的⽅法到⼀个y,使得
H(y)=H(x)。理论上可以使⽤brute-force(蛮⼒)求解的⽅法,遍历所有输⼊;但是实操中这个成本太⼤了,是做不到的。
抗碰撞性的⽬的
⽬的是为了保证:⽆法保证篡改了的内容不被检测出来。即:只要篡改了内容,就⼀定会被检测出来。
⽐如某个⽂件x,经过哈希加密后,被篡改为y。我们可以通过对⽐ H(x) 和 H(y) 来判断 x 和 y 是否完全相同。
⽐如你昨天上传某个⽂件到百度⽹盘盘,今天⼜把这个⽂件下载到本地。你如何保证你下载的⽂件跟你上传的⽂件完全⼀致(即没有被篡改)?你可以在上传算⼀个哈希值存在本地(这个过程叫做message digest),下载后再算⼀个哈希值,两个哈希值进⾏⽐较,如果完全⼀致则证明⽂件未被篡改。
在数学上是⽆法证明某个哈希函数是 Collision Resistance 的,只能依赖于长期实践的检验。对于某个哈希函数,如果没有⼈能到实现碰撞的⽅法,则我们认为它是 Collision Resistance 的。有⼀些函数,以前我们认为它是 Collision Resistance 的,但是后来⼤家到了知道哈希碰撞的⽅法,⼀个著名的例⼦是 MD5 (你们公司还在⽤ MD5 加密么?哈哈)。
2. Hiding 隐藏性
哈希函数的计算过程是单向的、不可逆的。卫生间洁具品牌
Hiding: 给定 x,可以算出 H(x);但是给定 H(x),⽆法算出 x。
换⽽⾔之,这个输出 H(x) 没有泄露输⼊ x 的信息。
但是其实对于任何哈希算法,我们都可以采⽤遍历输⼊的蛮⼒⽅法,来到 H(x) 对应的 x。所以Hiding 的成⽴是有条件的:
1. 输⼊空间⾜够⼤,是的蛮⼒求解的⽅法不可⾏
2. 输⼊的分布⾜够均匀,各种取值的可能性是差不多的。⽐如虽然输⼊空间很⼤,但是99%的输⼊都等于3,那还是⽐较容易被破解的
Hiding 可以和 Collision Resisitance ⼀起使⽤,实现 Digital Commitment。Digitall Commitment ⼜叫 Digital equivalent of a sealed envelope。
⽐如有⼀位法外狂徒张三说他⾃⼰能够精准预测明天某⼀只股票的会涨停。怎么证明他预测得准不准呢?
⼀种⽅法是张三在电视台上公布“明天贵州茅台会涨停”。第⼆天收盘之后看⼀下这个股票是否真的涨停就知道他预测得准不准了。
但是这有⼀个问题是,如果张三有⼀亿,这些看到了张三的预测之后就拼命去买归棹茅台,结果⼀只原本不会涨停的股票变成了涨停。或者贵州茅台的前⼗⼤流通股东全是张三的⿊粉,这些⿊粉看到张三的预测之后就去⽆脑抛售贵州茅台,结果⼀只原本会涨停的股票变成了跌停。
所以在预测⾏为会影响实际结果的时候,我们⽆法通过实际结果来判断预测得准不准。
那张三能不能在第⼆天收盘之后再公开呢?
也不⾏,因为张三⽆法证明他公开的结果没有被篡改过,也⽆法证明他公开的这个结果是提前⼀天做出来的。
这时候就可以采⽤ sealed envelope 的⽅法:张三把他的预测结果写在纸条上,放在⼀个密封的信封( sealed envelope )中,交给第三⽅权威机构保存,明天开盘后第三⽅机构打开信封看⼀下。
美国城市大小排名还有⼀种 digital sealed envelope 的⽅法:张三把他的预测结果算出来⼀个哈希值 H 并公布出来;第⼆天收盘之后公布他的预测结果。由于有Hiding 的性质,其他⼈是不知道张三的预测内容的;由于有 Collision Resistance 的性质,张三是不可能篡改预测结果改的,其他⼈可以对这个预测结果使⽤同样
品牌灯饰的算法做哈希运算,看看跟张三之前公布的哈希值 H 是否⼀致。
本例中有⼀个问题是,A股上市公司股票就⼏千只,⼤家还是可以通过 brute-force 蛮⼒的⽅法到股票代码的。所以张三可以在股票代码后⾯拼接⼀个随机数,然后⼀起取哈希。
⽐如贵州茅台的代码是 600519,拼接随机数后变为:6005190000582950192938
后⾯拼接的这⼀串“0000582950192938” 叫做 Nonce。
这样可以保证输⼊范围⾜够⼤,输⼊内容⾜够随机,输⼊分布⾜够均匀。
3. Puzzle Friendly
这要从什么是区块链说起。区块链就是区块组成的链表,每⼀个区块中有⼀个“头 ( header )”,这个头中有⼀些信息,这些信息被分成⼀个⼀个的“域 ( field )”,其中有⼀个域叫做 nonce (随机数)。
挖矿是获取⽐特币的⼀种⽅式,其原理是:把区块链块头 ( block header) 中的⼀些信息后⾯拼⼀个 nonce (随机数),然后对 x = ( block header || nonce) 取哈希 H(x)。如果 H(x) ≤ target,则给你⽐特币。
target space
Target 的特征是以15个0开头。Puzzle Friendly 是说⽆法根据 H(x) 的特征来判断 x 的特征或取值。这就保证了挖矿 ( solve mining puzzle )可以作为⼯作量证明 ( proof of work ),挖矿是⽆法取巧的。
此外,虽然我们到 nonce 很难,但是验证很容易 ( difficult to solve, but easy to verify ),我们只需要对到的 x 做⼀次哈希运算即可。
签名
我们去银⾏开户的时候要带上⾝份证,填⼀些资料,然后银⾏给你⼀个银⾏卡。
BTC 开户的过程就是在本地创⽴⼀个公钥 ( yuè,不是 yào) 和私钥的对 ( public key, private key ),每创建⼀公私钥对,就创建了⼀个账户。
最早的加密体系是对称的,Symmetric Encryption Algorithm。其原理是:张三通过密钥把“法外狂徒”这⼏个信息加密之后,把密
⽂“XXOO”发给李四,李四使⽤相同的秘钥破解密⽂“XXOO”,得到明⽂“法外狂徒”。这个加密体系的问题在于,张三如何把秘钥给李四?因为⽹络是不安全的,是有可能被窃听的。
什么是金融危机为了解决这个问题,提出了公钥和私钥的概念。公私钥来源与⾮对称的加密算法,Asymmetric Encryption Algorithm。即,我⽤你的公钥对信息加密,你收到信息后⽤你的私钥解密,从⽽得到原来的信息。这⾥要注意,加密和解密都是⽤的接收⽅的秘钥。
⾮对称加密算法 Asymmetric Encryption Algorithm
⽐特币系统中,公私钥的主要作⽤是签名。⽐如张三给李四转账10个⽐特币,别⼈怎么知道这笔交易是张三发起的呢?这需要张三在发布这个交易的时候⽤张三的私钥对这个交易签名,其他⼈⽤张三的公钥去验证这个签名的真实性。
⾮对称加密算法的优势与限制
⾮对称加密算法的优势:
1. 公钥不需要保密,私钥需要保密,但是私钥只需要保存在本地即可,跟你通讯的⼈不需要知道私钥
2. 由于公钥是公开的,你可以⽤张三的公钥去加密,且加密后的信息只有张三知道;这解决了对称加密体系中秘钥分发不⽅便的问题
⾮对称加密算法的限制:
1. 产⽣公私钥(开户)的时候需要好的随机源 ( a good source of randomness ),以保证⼤家的公私钥是不⼀样的。
2. BTC中每⼀次交易的签名都需要好的随机源,只要有⼀次随机源不要的话,就有可能泄露私钥。
欢迎关注我的区块链专栏,每天更新区块链技术知识,让你⽐99%的⼈更懂区块链!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。