《区块链技术与应用》课堂笔记(二):密码学原理

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

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

比特币主要用到了密码学中的两个功能 :    1.哈希      2.签名

1. 密码学中用到的哈希函数被称为 密码散列函数cryptographic hash function  ): 

 它有两个重要的性质:

collision(这里指哈希碰撞) resistance  :   例如x≠y H(x)=H(y) 两个不同的输入,输出却是相等的,这就称哈希碰撞。它是不可避免的,因为输入空间总大于输出空间。给出x,很难找到y,除非蛮力求解(brute-force)。

该性质的作用:对一个message求digest

比如message取m  , m的哈希值是H(m)=digest 如果有人想篡改m值而H(m)不变,则无法做到。

哈希碰撞无法人为制造,无法验证,是根据实践经验得来的。


collision resistance可以用来对一个信息求digest,用来检测对这个信息的篡改。因为如果这个信息的内容被改掉了,那么哈希值就会改变,没有专门的修改信息内容而不改变其哈希值的手段。比如使用云存储时,在上传文件之前计算一个哈希值放在本地,以后下载下来再计算一下哈希值和本地之前记录的哈希值比较一下,如果一样就说明下载下来的内容还是之前的内容,没有被篡改。
 

没有哪个哈希函数能在数学上证明是collision resistance的这个性质只是靠实践中的经验,也就是那些符合这个性质的哈希函数只是长期下来没有找到人为制造哈希碰撞的方法,这时候也就认为它们是collision resistance的。
有些函数以前认为是collision resistance的,后来人们找到了人为制造哈希碰撞的方法,比如MD5,所以它已经不安全了。
 

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

该性质的作用:

防碰撞特性 (collision resistance 结合在一起,用来实现digital commitment(又称为digital equivalent of a sealed envelope)

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

这里肖老师为了解释  sealed envelop  ,举了一个现实生活的例子。如一个人说自己能预测股票涨停,那么如何证明呢?如果让他提前公布自己的“预测”——明天股票的涨停,然后明天再去看股市,那么他公布的信息本身就会影响到股票涨停。如果在股票涨停之后再公布,那么大家会怀疑他有没有篡改自己的“预测”。

而这里sealed envelop也就是解决这个问题的办法,让这个人先把预测结果写在纸上,放进信封里封好,然后交给第三方的公证机构保管。第二天股市收盘后,再让公证机构检查信封完好、打开信封、查看纸上的预测结果和实际涨停是不是一致即可。

而使用digital commitment在这个问题上的做法是把预测结果计算出一个哈希值,然后把哈希值公布出去,因为有hiding的性质,所以大家没法通过哈希值知道预测结果。第二天收盘后公布预测结果,因为有collision resistance的性质,所以预测结果是没有篡改过的,否则和公布的哈希值就对不上了。

除了密码学中要求的这两个性质外,比特币中用到的哈希函数还有第三个性质:

puzzle friendly 指哈希值的预算事先是不可预测的,也就是光是去看这个输入没法知道计算出来的哈希值可能是什么样的(具有什么特征)。

即例如,想要计算出的哈希值落在某个范围内,那没有特定的办法去构造输入。又如,想要计算出的哈希值前面有k个连续的0,也没有特定的办法去构造输入。甚至无法知道什么样的输入更有可能得到具有特定特征的哈希值要想得到这种输入就只能一个一个去试,没有捷径。

比特币挖矿的过程中实际就是找一个nonce注意nonce不是区块块头以外的东西,它是其中的一个域,但是可以人为设置。挖矿的过程就是不停的去试nonce,使得整个块头部分取哈希小于等于target。nonce跟区块的块头里的其他信息合一起作为输入,得出的哈希值要小于等于某个指定的目标预值:H(block header)≤target

block header 指块头,块头里有很多域,其中一个域是我们可以设置的随机数nonce,挖矿的过程是不停的试随机数,使得block header取哈希后落在指定的范围之内。

puzzle friendly 是指挖矿过程中没有捷径,为了使输出值落在指定范围,只能一个一个去试。所以这个过程还可以作为工作量证明(proof of work)

这个 puzzle friendly 和最前面的collision resistance有一定的联系,但不是完全一样。那个是无法去人为制造哈希碰撞,而这个是无法去人为构造符合特定特征的哈希值。

挖矿很难,验证很容易。(difficult to solve ,but easy to verify)

虽然找到一个符合要求的nonce很难,但一旦找到之后,将它发布出去以后,其他人要验证这个nonce是不是符合要求是很容易的,只要算一次哈希值再和target比较一下就可以了。

比特币中用的哈希函数叫作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 randness

        生成公钥私钥的过程是随机的,但要求选取一个好的随机源,否则前面的分析就不成立了(就有不足够小的可能生成重复的公钥私钥对)。 我们假设产生公私钥时有一个好的随机源(a good source of randomness),产生公私钥是随机的,如果随机源不好,就有可能产生相同的公私钥。比特币中用的签名算法,不仅是生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。

猜你喜欢

转载自blog.csdn.net/djklsajdklsajdlk/article/details/127076908