一区块链技术与应用-密码学原理

Posted 山姆哥up

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一区块链技术与应用-密码学原理相关的知识,希望对你有一定的参考价值。

密码学原理:

哈希:

        加密货币(crypto-currency)

        密码学中所用的哈希函数被称为cryptographic hash function

它有两个重要的性质:
        

1.      collisiion resistance(哈希碰撞)

          两个不同的输入 哈希函数结果却相同

哈希碰撞是不可避免的 因为输入空间远远大于输出空间

        输入可以是任意文本或数字 空间是无限大的 有任意多种输入的可能

        然而输出空间却只有种可能 因为哈希值就是一个256位的二进制数

        所以就会必然出现两个输入映射到同一个输出的情况

        实际中 靠蛮力 也称为brute-force去找到这样一个哈希碰撞是几乎不可能的

假定有一个文本m 那么这个文本的哈希值H(m)叫做m的digest 用来检测对这个文本的篡改

前面我们提到的哈希碰撞 通过英文也可以理解为哈希反抗 意思为这种情况是不想要发生 事实上也确实是几乎不可能发生的

我们几乎是找不到一个H() = H(m)   所以哈希值digest完全可以验证文本真伪

举例:

        我要把一重要的文本信息放到了腾讯云服务器上 放之前我生成了一下文本的哈希值并记录在自己电脑上 等要取回文本信息文件的时候 如果再次计算要取回文本信息的哈希值 发现与我当初记录的哈希值一样 那么就可以判定文本在腾讯云服务器的时候没有被修改

注意⚠️:在这个世界上 目前还没有任何一个数学家或者密码学家能找到人为制造哈希256碰撞的方法 但是也同样无法用数学证明不可以人为制造 这一理论是基于感性的经验

哈希函数也有多种形式 曾经有一个著名的哈希函数叫MD5 这个哈希函数最初也认为是不可以被人为制造的 但是最终依然在2004年的时候被我国密码学专家王小云破解

2.      hiding (隐藏属性)

           给定一个x可以算出一个哈希值H(x) 但是H(x)不可以反推出x          

我们也可以理解为这个H(x)没有泄露出任何关于输入的任何信息

当然我们也可以通过蛮力求解 但是hiding成立的前提是输入空间要足够的大 并且取值的范围相对分散 

由此 两种性质在一起就形成了digital commitment(digital equivalent of a sealed envelope)

这里我们来解读一下这段英文

        Question: sealed envelope是一个密封的信封 加入我里面放了预测明天股票的信息 为什么要密封起来呢?

因为如果预测被提前公开了就会影响到明日的股票涨跌 比如我作为一个权威的专家预测明天某只股票可能要涨 结果大家一跟风都买入直接涨停 干扰了所预测的事情 所以要密封起来 那么加上了digital代表的意思是我把这个信封预测的内容转换成哈希值 因为hiding的属性 结果公布前没人能反推出我的预测内容 然而等结果出来后我把内容公布并再次转换成哈希值 并与我预测前的哈希值作比较 因为第一个哈希碰撞的属性 如果哈希值相同 则证明了结果前后我公布的预则内容是一致的

但是为了让输入空间足够的大 我们会把信封的内容加入一个随机数nonce

Bitcoin

 在比特币中 除了需要密码学中两个属性之外 还需要一个属性叫:

Puzzle Friendly

比特币用的哈希函数叫SHA-256

SHA-256(Secure Hash Algorithm-256)是256个bit 转换成十六进制就是除以4 结果就是64位

假如我们想要得到一个哈希值 让这64位中的前10位十六进制数都是0 

那么puzzle friendly属性就说没有一种捷径可以缩小输入的范围 只能靠蛮力一个一个去试

这里我们开始说比特币的挖矿:

        挖矿其实就是在找这么一个随机数nonce 这个随机数nonce和区块里的其他信息合在一起作为输入得到一个哈希值

H(block header)  target

bloack header 成为区块头 里面包含着nonce和一些其他信息 只有nonce是我们可以操作修改的 挖矿其实就是在不停的去试nonce和其他信息的组合 得到的哈希值落在小于target这个范围内

Question: 为什么是小于target呢? 如果说我们正在寻找前10位都是零的十六进制哈希值 那么这个target就是0000000000FFFFFFFFFF……

        也就是说10个零加54个F就是target 只要小于等于它 就落在这个范围了(有计算机基础的朋友应该都很容易理解)

又因为puzzle friendly的属性说没有捷径可以走 所以这个寻找合适的随机数nonce才可以作为

proof of work(工作量证明)

你挖到矿了(找到了合适的随机数nonce) 一定是因为你做了大量的工作 因为没有捷径

一旦有一个人(矿工)找到了这么一个nonce 就是把他的成果广播到全网

其他人验证他是否正确只要把他的nonce拿过来和其他信息组合得出哈希值 看看这个哈希值是不是真的小于等于target就行

注意⚠️:nonce随机数全世界的矿工都在疯狂寻找尝试 但是和nonce组合的“其他信息” 每个人手一份都是一模一样的

总结:寻找nonce难如登天 但是验证却很简单 算一次哈希值就好了

这个性质叫做:

difficult to solve but easy to verify

比特币作为数字货币的核心思想是去中心化 意思就是说不需要类似银行系统的存在帮我们来监管记账

Question: 那有个问题怎么去开账户呢? 答案是每个用户自己决定开户 不需要任何人批准 开户的过程非常简单 就是创造一个公钥和私钥对组(public key, private key)

公钥和私钥来源于:

asymmetric encryption algorithm 非对称加密体系

解释非对称加密体系之前 我们先来理解一下对称加密体系:

        假设说我有一些信息想在网络上传给我的好朋友小红 但是不希望任何一个人知道其中的内容 我就选择了用一个加密钥匙(encyption key)给其加密 同时把加密钥匙也一并在网上发给我的好朋友小红让他用同一个加密钥匙去解密 这就是一种对称 

然而用一个加密钥匙依然是不安全的 别人也可以用这个钥匙去解密我发送的文件信息

所以这时候就引出了非对成加密体系

        在非对称加密体系中 加密用的是公钥 而解密用的是私钥 比如还是我给朋友小红传机密文件 但这次我加密的时候使用小红的公钥去加密 公钥就像面向对象中的public权限 谁都可以访问 而小红在收到这个加密文件后可以用自己的私钥去解开 私钥就像是面向对象里的private 除了自己谁都不可以访问 

注意⚠️:加密和解密用的是同一个人的公钥和私钥 而且是接收方的

比特币账户的产生 是在本地电脑上产生一个公钥和私钥 这个公钥就像是银行的账号 别人给你转账就只要知道你的公钥就可以转账了 私钥相当于你的账户密码 知道私钥就可以把账户上的钱转走

在比特币中 我们都知道交易的账单是公开的 那为什么还需要加密呢?接下来就引出了“签名”

签名:

Question: 当公开的账单中出现了一条我发起的交易记录 别人怎么知道这个交易真的是我发起的呢?会不会有人打算冒名顶替我来发的这条虚假的交易记录呢?

所以在我发起的这条交易记录中还需要我用私钥进行签名 其他人收到我广播出去的交易记录的时候就需要用我的公钥去验证这个签名 都是同一个人“我”的私钥和公钥

Question: 这里有一个问题 怎么保证每一人产生的公私钥都是独立的呢?

如果有人个每天啥都不干 就去不停的创建公私钥尝试 从而登陆别人的账户去偷钱 那么是否真的可行呢?

答案在理论上讲是完全可行的 但是以我们如今的计算机算力和256位的哈希函数 得到一模一样的公私钥的概率小于地球爆炸的概率 所以可以忽略不计

备注:

        本篇文章主要以理论为主讲了比特币的两大模块——哈希和签名 在后续的文章中 会涉及具体的数据结构和算法实现。

待更新北京大学肖臻老师《区块链技术与应用》公开课笔记 02-BTC-密码学原理

北大肖臻老师《区块链技术与应用》课程链接点击这里

全系列文章链接:点击这里

主要参考的书籍文献及图片来源:《区块链:技术驱动金融》

该系列文章如中有任何侵权内容,或者有链接无法打开、图片加载上传失败等情况,请及时与我个人联系删除或修改。


比特币又名加密货币,顾名思义,加密货币着力采用密码技术。

加密数字货币系统构建主要用到密码学中的哈希算法(Hash)和数字签名(digital signature)技术。


一、哈希函数

哈希函数是一个数学函数,其具有以下三个特性:

(1)其输入可为任意大小的字符串;(2)它产生固定大小的输出;(3)它能进行有效计算。

这些特性定义了一般哈希函数,以这个函数为基础,我们可以创建数据结构,例如哈希表。

但要使哈希函数达到密码安全,则要求其具有以下三个附加特性:

(1)碰撞阻力(collision-resistance);(2)隐秘性(hiding);(3)谜题友好(puzzle-friendliness)。


(1)碰撞阻力(collision-resistance)

首先,这里的碰撞是指,对于两个不同的输入,产生相同的输出。可表达为:x≠y,H(x)=H(y)。

而碰撞阻力,即指无法找到两个值x和y,x≠y,而H(x)=H(y)。

哈希碰撞存在的原因,是由于其输入空间包含所有长度的任意字符串,但输出空间则只包含特定固定长度的字符串,在输入空间比输出空间大的情况下(输入空间是无限的,而输出空间是有限的),一定会有输入字符串映射到相同的输出字符串。

对于加密的哈希函数,我们虽然说应该找不到碰撞,但有些方法是能保证找到碰撞的。

假设,有一个256位输出大小的哈希函数,最坏的算法是进行+1次哈希函数计算,我们在检验第+1个输入之前便很可能找到碰撞,但这个检测算法的耗时是一个天文数字,蛮力求解不可行。

之前的MD5哈希函数,在多年的努力之后最终找到了碰撞,导致该函数在实践中被逐渐淘汰,最终被弃用。

碰撞阻力的应用:信息摘要(message digest)。

已知哈希函数具有碰撞阻力。假设x和y是两个不同的输入,那么可以假设它们的哈希函数H(x)和H(y)也不同。如果已知x和y不同,但哈希值H相同,那么H具有碰撞阻力的假设就不成立。

这个论证使我们可以将哈希输出作为信息摘要(message digest)。

哈希函数对于一个信息生成固定长度的摘要,或生成了简明总结,这为我们提供了一种记住之前所见事物,并在今后认出这些事物的有效方法。虽然整个文件可能非常大,但其哈希值的长度固定。假设哈希函数为256位。这样极大地降低存储要求。


(2)隐秘性(hiding)

即,通过哈希函数的输出y=H(x),我们没有可行的办法算出输入值x。

但是,如果我们要反解的 x 的取值,就像猜一枚硬币的正反面,或者第二天股市是否涨停一样,只有两种可能,那么还是能将函数对应的哈希值计算出来,这时hiding是不成立的。

上面表述若要成立,则必须使输入值x的取值来自一个非常广泛的集合。这里可以引入“高阶最小熵”的概念。

当其输入 r 选自一个高阶最小熵(high min-entroy)的概率分布,在给定H(r‖x)条件下,来确定x是不可行的。

在信息论中,最小熵是用于测试结果可预测性的手段,而高阶最小熵这个概念比较直观描述了分布(如随机变量)的分散程度。具体来说,在从这样分布中取样时,我们将无法判定取样的倾向。举个具体的例子,如果 r 是从长度为256位的字符串中随意选出的,那么任意特定字符串被选中的概率为,这是一个小到几乎可以忽略的取值。

hiding的应用:承诺(commitment)。

(论证过程太长了,我直接放书截图了... ... 不是懒,希望宁能懂~~)

 

(截图均来自参考书籍《区块链:技术驱动金融》) 


(3)谜题友好(puzzle-friendliness)

如果对于任意n位输出值y,假定k选自高阶最小熵分布,如果无法找到一个可行的方法,在比2n小很多时间内找到x,保证H(k‖x)=y成立,那么我们称哈希函数H为谜题友好。

应用:搜索谜题

比特币挖矿过程就是一种搜索谜题,挖矿就是找到一个nonce.

挖矿过程没有捷径,nonce作为header的一部分,只能通过大量试验各种随机数nonce,才能使H(block header)≤ target,这个过程才能作为工作量证明proof of work.

即,difficult to solve, but easy to verify. 我们设计搜索谜题时应当注意这个性质,该谜题是一个需要对庞大空间进行搜索,才能找到解决办法的数学问题。


比特币中用的哈希函数为:SHA-256(Secure Hash Algorithm). 上述3个附加特性SHA-256均满足。


二、签名

要将签名,先将比特币账户管理。

比特币是去中心化的,它没有银行之类的机构,而是在本地创立一个(public key, private key)对儿,就能完成开户。

公钥:银行账户

私钥:银行密码

以上是关于一区块链技术与应用-密码学原理的主要内容,如果未能解决你的问题,请参考以下文章

区块链记账原理

区块链与密码学原理之:Hash算法的分类和原理浅析

区块链与密码学第4-2讲:区块链应用遵循何种准则?

区块链与密码学第4-3讲:最全区块链应用场景梳理

区块链与密码学第4-5讲:最全区块链应用场景梳理

区块链与密码学第4-4讲:最全区块链应用场景梳理