北大肖臻区块链公开课01-BTC-密码学原理

区块链中应用的两个重要的密码学原理:哈希(Cryptographic hash function)、签名

一、哈希

        最基础的哈希(散列)本质上是一种映射关系,数据结构中常用哈希表来做讲解。

1.collision resistance

1.1 何为collision resistance

        应用的哈希函数具有collision resistance(碰撞抵抗),一些文章中称为collision free,其实是不太准确的。对于一个具有collision resistance的特性的哈希函数,并不是在其应用时不会发生哈希碰撞,而且无法人为地高效地构造出一次哈希碰撞

        哈希碰撞:设哈希函数H,输入x≠y,但是存在H(x)=H(y)。

        collision resistance:设哈希函数H,输入m,存在n使得H(m)=H(n),但是很难通过H(m)=H(n)的哈希值倒推出对应的n的值,如果想要得到这样的n值,可以通过暴力枚举的方式,但是对于输入空间极大的哈希函数而言,这是几乎不可能完成的事情。这样的哈希函数被称为具有collision resistance特性的。

        但是,没有任何一个哈希函数可以从数学上证明其具有collision resistance的特性,仅可以通过实践的检验尽量向该特性靠拢。

1.2 collision resistance的应用

        对于哈希函数,一个非常重要的应用场景就是对输入的信息做digest(摘要)。例如输入信息m,对应的输出H(m)便是对m的摘要,一旦将输入信息m更改为m',那么对应的摘要信息也必然变为H(m')。倘若进行伪造(伪造一种m未更改过的假象),那么就必须找到一个n,使得H(m)=H(n),此时将m更改为n,从摘要的角度看无法发觉对原信息进行了更改。但是找到这样的n值对于具有collision resistance特性的哈希函数是不可能的。

2.hiding

2.1 何为hiding

        应用的哈希函数同时还应具有hiding的特性,即在已知一个哈希值H(x)的前提下,无法反推出原信息x的内容。具有hiding特性的前提是输入空间足够大,分布足够均匀。可以通过拼接随机数的方法解决输入空间较小的问题:H(x || nonce)。

2.2 hiding的应用

        结合hidingcollision resistance两种特性,可以实现digital commitment(又称digital equivalent of sealed envelope)

        sealed envelope(现实版):某人A想要预测明天某支股票B会涨停,倘若A提前公布了自己的预测结果,则真实的结果可能会收到A的预测结果的影响,也许股民疯狂买入,也许大户砸盘卖出,最终影响本该发生的结果。倘若A不提前公布自己的预测结果,那么最终又该如何证明A的预测结果是否在收盘之后被篡改过呢?这就需要第三方机构的出场了,A将预测结果密封好交给第三方机构(预测结果不公开,但是交给第三方机构这件事需要公开),待收盘后由第三方机构公布预测结果。

        digital sealed envelope:预测结果为信息m,使用哈希得到H(m),将H(m)进行公开,由于hiding特性导致无法从H(m)反推出m。待收盘后公开预测结果m',若H(m')=H(m),则根据collision resistance特性可知m'=m,即预测结果未被篡改过。

3.puzzle friendly

3.1 何为puzzle friendly

        比特币中用到的哈希函数(SHA-256)还要求了第三个特性:puzzle friendly。即对于输入x,其哈希结果H(x)是无法事先预测的。比特币挖矿其实就是找到一个合适的nonce值,与块头中的其他信息组成输入,输出的哈希值要小于等于指定的目标阈值。

        种种特性决定了挖矿这一行为没有捷径可以走,只能够不停地尝试,于是大量的工作才能够成为工作量证明(proof of work)。

        此外挖矿的过程很困难,但是验证的过程却仅需一次哈希,这种特性被称为:difficult to solve, but easy to verify。

二、签名

        数字签名部分主要涉及到的内容为非对称加密算法。

1.何为非对称加密

        下面的内容主要提供给不了解密码学的初学者。

        对称加密算法:设加密函数为C = Enc(M, key),其中C为密文,M为明文,key为密钥,那么对应的解密函数就为M = Dec(C, key)。解密函数是加密函数的逆函数,比如最经典的凯撒密码,C = Caeser(M, key),将M中每个字母均对应地后移key位(循环移位)得到C,解密的过程则是相对应地将C中的每个字母前移key位即可。在整个加密解密的过程中密钥key是相同的,这就是对称加密。

        非对称加密算法:设加密函数为C = Enc(M, public_key),其中C为密文,M为明文,public_key为公钥,那么对应的解密函数就为M = Dec(C, private_key),其中private_key为私钥。公私钥对同时生成,私钥保存在本地,公钥进行公开,公钥加密的内容只有用私钥能解密,私钥加密的内容也只能通过公钥处理后查看。

        公私钥的生成算法通常涉及到部分初级数论的知识,我在这里贴两篇关于最经典的非对称加密算法RSA的数学原理的博客,相信了解了RSA的加解密原理,就能够完完全全地掌握公私钥的生成以及非对称加密算法的运转逻辑。

RSA加密算法-CSDN博客

RSA加密解密算法原理以及实现_rsa简介及源码实现-CSDN博客

2.非对称加密算法的应用

2.1数据加密

        对于数据信息加密的应用而言,使用私钥加密其实并没有什么意义,因为公钥是公开的。通常是使用公钥进行加密:Alice想要给Bob发送一段加密信息,明文为m,那么Alice就应该使用Bob的公钥来对这段信息进行加密,只有这样这段信息才能够只被Bob一个人用对应的私钥完成解密。同理Bob想要向Alice发送加密信息时需要使用Alice的公钥。

        数据加密用于保证数据的安全性。

2.2数字签名

        接着使用上面的例子。倘若Carole不希望看到Alice整天给Bob发消息,于是Carole萌生了一个想法:她可以冒充Alice的名义,给Bob发一段消息,表达自己对Bob感到失望并且不希望继续与Bob来往。我们该如何避免这样的情况发生呢?换言之,我们该如何在这种加密通信的环境下自证身份呢?当然可以,Alice完全可以在信息的最后署上自己的名字,并使用自己的私钥对这个名字进行加密。当Bob收到来自真正的Alice的消息时,他只需要使用Alice的公钥来对签名的部分进行解密,就可以验证这段消息究竟是不是Alice亲手发出的了。倘若Bob收到的消息其实来自于Carole,那么使用Alice的公钥是无法对最后的署名进行解密的。这便是“数字签名”最简单最形象的例子。

        数字签名用于证明自己身份的真实性。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值