区块链技术,作为一种分布式、去中心化的数据管理方式,密码学在其安全性和可靠性方面发挥着至关重要的作用。本文将详细介绍区块链密码学的基础知识、应用以及未来发展趋势。
对于以中心化的中央银行来说需要做到防止篡改功能,那么其中场景就是中央银行控制供给,并加上防伪标识,但是依旧有人伪造,这时候再加上执法机构进行互补,对伪造的人给予一定的惩罚,哈希函数是信息技术领域的基石,也是比特币协议内的重要组成部分,公钥以及地址的生成、挖矿过程等等方面都有它的参与。这个课题是密码学在区块链的应用。
但是分布式没有中心处理中心就要通过密码原理进行防止篡改,于是就有了哈希函数,同时防篡改也是哈希函数最重要的功能
哈希函数
1.特性[1]
1.1三个特性:
其输入可为任意大小的字符串。
它产生固定大小的输出。为使本章讨论更具体,我们假设输出值大小为256位,但是,我们的讨论适用于任意规模的输出,只要其足够大。
它能进行有效计算,简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。更准确地说,对应n位的字符串,其哈希值计算的复杂度为O(n)
由于安全附加的几个特性:
碰撞阻力(collision-resistance);
找不到两个不同的值去映射到同一个值,无法将其产生碰撞,这就是常说的碰撞阻力;
注意到一个问题就是:虽然说有很多种情况,但是在有一些特殊方法之下就可能使得碰撞几率大大增大,最后完成碰撞;其中计算碰撞的概率有个很经典的理论:
生日悖论:
定义:某个班级里一共有 23 名学生。不考虑双胞胎、闰年等特殊情况,在这些男孩女孩中间,有 2 个人生日相同的概率是多少?
答:实际发生的概率要高达50.7%。
悖论所悖之处:
直觉上:我们会觉得发生的概念很小,毕竟一年有365天
实际上:实际上发生的概念很大,这主要是因为我们直觉和实际客观看待这个事情的出发点是不一样的——所以我们在计算的时候就会相比客观漏掉了很多
从我们自身去看,我们需要寻找的是与自己生日相同的人;
从客观来看,需要找到的只要是任意两个生日相同的人便是。
如何计算同年同月生的概率呢?
答:生 日 相 同 的 组 合 个 数 所 有 组 合 个 数 = ( 所 有 组 合 个 数 − 不 同 的 组 合 个 数 ) 所 有 组 合 个 数 \frac{生日相同的组合个数}{所有组合个数}=\frac{(所有组合个数-不同的组合个数)}{所有组合个数}
所有组合个数
生日相同的组合个数 = 所有组合个数(所有组合个数−不同的组合个数)→365 ⋅ 364 ⋅ 363 365 ⋅ 365 ⋅ 365 = 0.0082 \frac{{365 \cdot 364 \cdot 363}}{{365 \cdot 365 \cdot 365}}=0.0082
365⋅365⋅365
365⋅364⋅363
=0.0082
我们经过总结:
一个人的生日一共有365 种可能。我们可以把这个问题写成一般形式,即在有n 种可能的情形下,要使至少有2人生日相同的概率达到50%,需要有如下的样本人数:
1.18 n 1.18\sqrt n1.18
n
对应到式子中就是
(365天就是365种可能):1.18 365 = 22.5... 1.18\sqrt {365}=22.5...1.18
365 =22.5...
(12个月就是12种可能):1.18 12 = 4.0876... 1.18\sqrt {12} =4.0876...1.18
12=4.0876...
也就是说,当样本人数大于等于5 时,存在相同出生月份的概率就将超过50%
实际应用场景:
生物识别的精确度:
衡量该精度的指标是错误接受率(False Acceptance Rate,简称FAR,也叫认假率)——也就是把他人的、不应该匹配的生物特征信息当成与用户本人匹配的信息。
带来的问题:虽然说生物识别精度很高,但是他们的总数实际上是一定的,那么虽然入库的人数不断增加,这就对应到一个班级的人数不断增加,那么自然产生相同的信息的人可能性就会更大,如下图所示:
同样我们在DNA鉴定的时候一样会发生这样的事情,遇到同样的困难,并且有时候即使保证了理论上的很大概率不重合,但是我们需要知道概率和频率的区别——也就是即使是再少的概率也是可能发生,
需要注意的一点就是:一旦出现DNA相同的事情但是人们认为DNA是不可能相同的话那就是可能导致很大的矛盾
可能发生的场景:在美国的马里兰州,截至2007 年1 月,该州的DNA 数据库共收录了大约3 万人的信息。这个数字比256 万整整少了2 位数。但即使这样,实际上该地区也出现了不同人的DNA 被判定为一致的事件20。
不发生错误的概率公式:( 1 − p ) n ( n − 1 ) 2 {(1 - p)^{\frac{{n(n - 1)}}{2}}}(1−p)
2n(n−1世界上没有哈希函数具有防碰撞特性。我们实践中依赖的加密的哈希函数仅仅是人们经过不懈努力之后暂未成功找到碰撞的函数。
M D 5 MD5MD5:最终找到碰撞,使之慢慢在使用中被淘汰
作用:
当需要下载一个硕大的文件的时候,下载下来如何核对信息是否准备是我们面临的问题
答:通过核对hash摘要信息,由于碰撞原理的原因,使得在不发生碰撞的情况下我们不用去核对那硕大的文件,只需要对固定长度的hash信息进行比对就行。
隐秘性(hiding);
解释:我们仅仅知道hash函数的输出,但是没有一个可行的方法去算出来,也就是相当于把hash函数当成一个小黑盒子;
意义:在你知道结果的情况,无法反向求出输入的是什么
当其输入r rr选自一个高阶最小熵(high min-entroy)的概率分布,在给定H ( r l l x ) H(rllx)H(rllx)条件下来确定x xx是不可行的。
高阶最小熵[2]:
很大的时候:
如果r是从长度为256位的字符串中随意选出的,那么任意特定字符串被选中的概率为1/2 256 ,这是一个小到几乎可以忽略的取值;
让r这个随机变量是通过一个即使在“最保守”的情况下也有“很多”可能性,高度混乱,高度随机的系统中选取。
很小的时候:当我们进行设置密码的时候,通常设置自己生日相关这样会比较好记
实现:
承诺:
装进
放上面
数字
信封
桌子上
承诺:过程开始
承诺:过程结束
打开信封前
打开信封后
对其他人来说它还是秘密
展现所承诺的数值
算法实现:
信息msg
临时随机数nonce
承诺com
确认程序verify
对比com与输入msg和nonce计算得到的com是否一致
真true
否false
要求的特性:
隐秘性:已知c o m comcom,没有可行的方法找到m s g msgmsg。——同时也是这一小节所需要给的定义在这里总结出来。
定义:当其输入r rr选自一个高阶最小熵(high min-entroy)的概率分布,在给定H ( r l l x ) H(rllx)H(rllx)条件下来确定是不x xx可行的。
更像是平时我们需要中间人,只有通过中间人才能得到相应的信息,别人即使知道你承诺了这个东西,但是具体却不知道承诺的内容;
约束性:没有可行的办法找到两组( m s g , n o n c e ) (msg,nonce)(msg,nonce)和( m s g ′ , n o n c e ′ ) (msg',nonce')(msg
′,nonce ′
),m s g ≠ m s g msg \ne msgmsg
=msg,而c o m m i t ( m s g , n o n c e ) = = c o m m i t ( m s g ′ , n o n c e ′ ) commit(msg,nonce)==commit(msg',nonce')commit(msg,nonce)==commit(msg
,nonce
′ )。
对于所承诺的东西,这里面的信息你是不能找到其他信息去替代他的;
具体实施:
承诺的隐蔽性正好是hash的隐蔽性;
承诺的约束性也正好与hash的碰撞对应;
所以结合1和2,我们正好把hash函数作为承诺的实现
谜题友好(puzzle-friendliness):区块链中尤其需要,但是其他哈希函数使用到的场景却不一定需要
定义:
如果对于任意n nn位输出值y yy,假定k选自高阶最小熵分布,如果无法找到一个可行的方法,在比2 n 2^n2
n
小很多时间内找到x xx,保证H ( k ∣ ∣ x ) = y H(k||x)=yH(k∣∣x)=y成立,那么我们称哈希函数H HH为谜题友好;
集合Y并不是固定的,而是在一个集合范围,所以需要考虑的是这个集合的个数。由于输出是一个集合,那么只要找到其中一个就可以解决问题,但是如果这个集合是最小集合于是就变成需要遍历n nn个值。
解释:
如果有一个人想找到y值所对应的输入,假定在输入集合中,有一部分是非常随机的,那么他将非常难以求得y值对应的输入。
与隐秘性的区别:隐秘性是针对于输入输出的单个x、y,而谜题友好是针对于输入输出的集合来说的。
区块链应用这一特性在挖矿中。
2.哈希函数在区块链中的应用[3]
比特币中大量使用S H A − 256 SHA-256SHA−256(Secure Hash Algorithm 256)哈希函数,并且效果还很好。
为了让hash函数能够接受各个长度的数字的方法:通过一般方法,就可以将接受固定长度的哈希函数转化为可接受任意长度输入的哈希函数,我们称这个转换过程为M D MDMD(Merkle-Damgard)变换,过程如下图所示:
首先将信息分为多个区块,每段区块等长(不够长度的可以在最开始前面补0),利用初始向量依次与所分区块进行计算得到固定长度数,每次将上一次计算结果加入本次计算中并与信息区块进行计算。通过这样的一系列计算使得无论多长的数都能得到固定长度的数目——也就是用时间的代价最后换来固定长度的摘要。
注意:
需要注意的是并不是前面所讲的hash函数特性在每一个应用场景都会使用到,都是有选择性的使用。比如:第三个特性谜题友好一般就只是在区块链中使用。
2.1 hash指针及其结构
hash指针与普通指针的区别:
hash指针指向数据存储位置及其位置数据的哈希值的指针,不仅有位置指向而且还能保证没有被篡改过。
注意:H ( 指 针 ) H(指针)H(指针)表示有位置的指向并且防篡改,就相当于hash+指针(可以把它当成这样的结构体)
通过hash指针构建一个链表,我们将这个数据结构称为区块链(block chain)。其结构如下图所示——区块链的定义
所以hash指针特别适合放篡改这一应用,比如应用在日志的防篡改。
那么像区块链这样一种结构,如果我们想要进行篡改是如何的一种情况呢?
答:如果你想要篡改某一节点的值,那么在更改当前节点之后势必就要跟随着更改下一节点,因为当前节点与上下相邻节点都是相连接的。所以最后肯定会追溯到第一个节点,只要将第一个节点更改然后接着的跟随更改,这样就能进行篡改,那么防止篡改也是一样,将第一个节点放在一个不能篡改的地方。
与MD(SHA-256算法主要生成思想)一样,首要节点很重要,得保护好。
2.1.1 hash指针的应用
梅克尔树:
理解:通过在一个节点中建立两个hash指针构成树的左右节点。
详细结构:
在梅克尔树的数据结构中,所有的数据区块都被两两分组,指向这些数据区块的指针被存储在上一层的父节点(parent node)中,而这些父节点再次被两两分组,并且指向父节点的指针被存情在上一层的父节点中,一直持续这个过程,直到最后我们到达树的根节点。
结构图示如下:
通过默克尔树进行隶属或者非隶属的证明:
验证实例如下:
主要过程:假设我们要验证区块中存在Hash值为9Dog:64(绿色框)的交易,我们仅需要知道1FXq:18、ec20、8f74(黄色框)即可计算出781a、5c71与Root节点(藕粉色框)的哈希
:所以如果整棵树上有n nn个节点,只需要展示约l o g 2 ( n ) log_2(n)log
2n)个项目。
而在前些年爆火的比特币里,比特币将所有的交易记录都存放在了一个叫区块(Block)的数据结构里面,我们可以把这里的区块看作是链表数据结构中的一个节点。当用户需要将新的交易记录打包的时候,可以自己创建一个新的区块出来,放在整个区块链的结尾,也就相当于在一个链表的结尾插入一个新的节点,而在整个区块链中的第一个区块,也就是链表的头节点,叫做创世区块(Genesis Block)。
与链表数据结构使用内存地址去寻找下一个节点不同的是,区块链采用了哈希值的方式去寻找节点。在比特币里,它采用的是 SHA-256 这种加密哈希函数,将每一个区块都计算出一个 256 位的哈希值。在每一个新的区块中都会保存着上一个区块所计算出来的哈希值,通过这个哈希值,我们就可以找到哪一个区块是这个新区块的上一个区块。所有的区块都可以通过这种机制去寻找上一个区块,从而遍历整个区块链,直到找到创世区块为止。
当然了,不是每个人都是有“资格”去创建一个新区块的。就如上一讲中所讲述的区块链“挖矿”原理一样,只有当一个用户“挖矿”成功了,那这个用户才有资格去打包交易信息并建立一个新的区块。