第一章密码学及加密货币概述——普林斯顿大学课程

这一章主要讲的是一些密码学的知识和加密货币的概述。主要有哈希函数,哈希指针及数据结构,数字签名,公钥,两种简单的加密货币。

1.1密码学哈希函数

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

即:其输入可为任意大小的字符串

       它产生固定大小的输出(假设输出为256位)

       它能进行有效计算。简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。对应n位的字符串,其哈希值计算的复杂度为O(n)

我们要求哈希函数有以下三个附加特性:(1)碰撞阻力(collision-resistance)

        (2)隐秘性(hiding)

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

特性1:碰撞阻力

这里的碰撞指对于两个不同的输入,产生相同的输出。如果对于哈希函数H,没有人能找到碰撞,我们则称该函数具有碰撞阻力。


注意:我们说没人能找到碰撞,并不表示不存在碰撞。哈希函数的输入空间包含所有长度的任意字符串,但输出空间则只包含特定固

定长度的字符串。因为输入空间比输出空间大(输入空间无限而输出空间有限),一定会有输入字符串映射到相同的输出字符串。根

据鸽巢原理,我们可以得出,必然会有大量可能的输入被映射到任意特定输出。


更糟糕的是对于加密的哈希函数,我们虽然说应该找不到碰撞,但是有些方法是能保证找到碰撞的。根据生日悖论,我们直到其实这种

概率是比较大的,但是耗费的时间很长。


这个特性可以应用于信息摘要


x和y是两个不同的输入,那么可以假设它们的哈希函数H(x)和H(y)也不同——如果已知x和y不同,但哈希值相同,那么H具有碰撞阻力的假设就不成立了。信息摘要类似于论文的摘要,但是信息摘要的长度是固定的。例如一个用户上传了一个很大的文件,并希望以后再下载时与上传的文件相同。这个用户只需要再上传后生成一个信息摘要,在下载的时候再次生成信息摘要,对比两个信息摘要是否相同就可以确保两次的文件是否相同。

特性2:隐秘性 

隐秘性保证,如果我们仅仅知道哈希函数的输出y=H(x),我们没有可行的办法算出输入值x。


隐秘性 哈希函数H具有隐秘性,如果:当其输入r选自一个高阶最小熵的概率分布,在给定H(r||x)条件下确定x是不可行的


应用:承诺

承诺是一个数字化的过程,可以类比为:首先选定一个数字,将数字装进信封,然后将该信封放到一个人人可以看到的桌子上,这样子做以后,就可以说你对信封里的数字做出了承诺,在打开信封之前,虽然你已经做出了承诺,对其他人来说它还是秘密。在之后,你可以打开信封,来展示承诺的数值。


一个承诺协议方案有两个算法构成:

com:=commit(msg,nonce),承诺函数将信息(msg)和一个临时随机数(nonce)作为输入,输出就是一个“承诺”。

verify(com,msg,nonce),验证函数将某个承诺输出(com),临时随机数(nonce)及信息(msg)作为输入,如果com==commit(msg,nonce),则返回“true”否则返回“false”


我们要求以下两个安全特性要成立:

隐秘性:已知com,没有可行的方法找到msg。

约束性:没有可能的方法找到两组(msg,nonce)和(msg1,nonce1),msg不等于msg1,而commit(msg,nonce)=commit(msg1,nonce1)


为了使用承诺方案,我们首先需要产生一个临时随机数。然后将这个临时随机数与承诺信息msg一起代入承诺函数,计算承诺函数输入值com,然后公布该输出。这个过程就如同将封好的信封放到一个人人能看到的桌上那样。之后,如果我们希望展示之前的承诺,我们首先公布用于产生承诺的临时随机数,并公布msg。此时仍何人都可以验证这时公布的msg是否为之承诺,这阶段就如同打开信封。密码学中的nonce是指,该取值只能使用一次。

特性3:谜题友好

直觉上,谜题友好可以这样解释:如果一个人想找到y值所对应的输入,假定在输入集合中,有一部分是非常随机的,那么他将非常难以求得y值对应的输入。


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

应用:搜索谜题


搜索谜题构成:

一个哈希函数H

从高阶最小熵分布选出的一个取值,id

目标集合Y

谜题的解决方法为一个解,x,应该满足上述公式


安全哈希算法


可用于固定长度,具备碰撞阻力的哈希函数被称为是压缩函数。

SHA-256函数利用了这样的一个压缩函数,这个压缩函数把一个768位的输入压缩成一个256位的输出,每一个区块的大小是512位。

1.2 哈希指针及数据结构


哈希指针是一种数据结构,简单来说,哈希指针式一个指向数据存储位置及其位置数据的哈希值的指针。一个普通的指针可以告诉你数据存储的位置,哈希指针不仅可以告诉你数据存储的位置,并且还可以给你一种方式,让你验证数据没有被篡改过。


在上图所示区块链中,上一个区块指针被置换为哈希函数。因此,每个区块不仅能告诉我们上一个区块的值在哪里,还包含了该值的摘要,使我们能够验证那个值没有改变。



如果有人想要篡改数据,那么会改变某个区块k的数据。既然数据已经被改变,区块k+1的哈希值(即整个区块k的哈希值)将不会匹配。因此我们会检测到区块k中的新数据以及区块k+1中的哈希指针不一样。为此,必须继续进行篡改,但是当到达链表头部的时候,链表头部的哈希指针存储在无法改动的地方,无法做能能够在不被检测到的前提下篡改任何区块。这样做,我们紧急通过记住一个哈希指针,就基本记住了整个链表的防篡改哈希值。因此,我们可以搭建一个包含很多区块的区块链网络,链表头部的哈希指针被称作创世区块

梅克尔树

另一个可以用哈希指针建立的有用的数据结构是二叉树,使用哈希指针的二叉树也叫做梅克尔树。如下图所示,假设我们有很多包含数据的区块,这些区块就构成了树的叶子(节点)。我们将这些数据区块两两分组,然后为每一组建立一个有两个哈希指针的数据结构,每个指针对应一个区块,这些数据结构就构成了树的下一个层次。按照这种方法将这些区块组两两分组,为每一组建立一个包含每个区块组哈希指针的新的数据结构。以此类推,直到我们得到一个单一区块,这就是树根节点。


利用梅克尔树可以用来快速地判断一个数据区块是否隶属于梅克尔树



1.3数字签名

数字签名是密码学中的第二个重要部分,该理论和哈希函数,是加密货币的基础。我们对数字签名有两个特性要求,使其与我们对手写签名的预期一致。第一,只有你可以制作自己的签名,但任何看到它的人都可以验证其有效性;第二,我们希望签名只与某一特定文件发生联系,因此该签名不能用于表明你同意或支付另一份不同的文件。




数字签名方案: 三个算法:

(sk,pk):=generateKeys(keysize) 这个算法用来产生一对公钥和私钥,私钥sk被安全保存,并用来签名一段消息,公钥pk是人人都可以找到

sig: =sign(sk,message)签名过程是把一段消息和私钥作为一个输入,对于消息输出是签名。

isValid: = verify(pk,message,sig)验证过程是通过把一段消息和签名消息与公钥作为输入,如果返回结果是真,证明签名属实,否则签名不属实。


也就是说:有效签名可以通过验证

                 签名不可伪造



1.4公钥即身份

将公钥视为身份的一个结果是你可以随时制定新的身份——你可以简单通过数字签名方案中generateKeys程序,生成新的密钥对sk和pk。也就是说,在比特币系统,你不需要明确地注册或揭露你的真实身份,但是你的行为模式本身可能是可识别的,这就是比特币等加密货币的基本隐秘性问题。



1.5两种简单的加密货币


第一种是高飞币




高飞币规则:

高飞可以通过签署声明表示他使用唯一的货币编号来创建一个新币。

币的所有人可以通过签署声明表示“将这个币转给X”(其中X为公钥),将其转给另一个人。

任何人都可以验证一只币的有效性,跟随哈希指针追溯到它是由高飞创建,并验证过程所有签名。


但是高飞币会有双重支付的问题


第二种是财奴币

可以用于解决双重支付问题,财奴币是以高飞币为基础创建的,但是在数据结构方面更复杂。一个叫财奴的指定实体将负责公布包含所有发生过的交易历史记录的仅增账目,账目的仅增特性保证了写入这个账目的任何数据都会永久保留下来。如果账目真的为仅增,通过要求所有的交易在被接收前都写入项目,我们可以用其防止双重支付的发生。这样,如果之前币已经转给了一个不同的所有者,大家都可以看到。


财奴币有两种交易,第一种是造币,类似于在高飞币种,高飞可以创建新币的程序,而财奴币将其进行扩展,那就是可以一次交易中创建多个币量。




第二种交易是付币,这一交易会消耗币,就是说消除它们,并创建具有相同总值的新币。新币可能属于不同的人(公钥),这一交易必须由每一个支付该币的人进行签署



财奴币的规则阐明:

被消耗的币是有效货币,即它们是在之前的交易中创建的

被消耗的币没有在之前的某交易中被消耗掉。就是说,本次交易不是双重支出的

本次交易产生的币值等于消耗的币值量,就是说,只有财奴才可以创建新币

本次交易被消耗的所有币均有其所有者的有效签署




阅读更多

更多精彩内容