文章来源《DAPP开发指南》
2.1 密码学发展历史
2.1.1 密码学发展的三个阶段
密码学的发展,经历了主要的三个阶段:
第一阶段指1949年之前,当时的密码学主要表现为满足少数人的特殊用途为主;
第二阶段指1949—1975年,在这个阶段,密码学逐渐发展成为一门独立的学科;
第三阶段一般指1975年之后,密码学的新方向——公钥密码学得到了长足的发展与进步。
这三个阶段,如果按照密码学的发展进程来分,可以分为“古典密码”“对称密钥密码”和“公开密钥密码”三个阶段。
不同时期,人们对信息的存储、处理、传输和计算能力是不同的。
信息的利用方式也不同,相应使用的密码技术也不相同,密码学的发展经历了从艺术到科学的发展过程,其中的协议和算法设计、分析以及加解密应用,皆发展成为独立的艺术和学问,同时也发展成为一门高度综合的学科,涵盖了数学、统计、网络、计算机等学科内容。
那么,在开始介绍区块链中的密码学之前,先让我们来简单回顾一下这三个阶段。
1.“古典密码”阶段
这个阶段的密码学还不是科学,而是一门小众的艺术。
这个阶段出现了一些密码算法和加密工具。
在这个阶段中,密码算法的基本手段——置换排列网络(Substitution-Permutation Network)出现了,它主要是针对字符进行加密;
同一阶段,简单的密码分析手段也出现了。
举例来说,这个阶段出现过“Scytale密码”:据说公元前5世纪古希腊的斯巴达人,有意识地使用一些技术方法来加密信息。
他们使用的是一根叫“scytale”的棍子。送信人先绕棍子卷一张纸条,然后把要写的信息纵向写在上面,接着单独把纸送给收信人。
对方如果不知道棍子的粗细是不可能解密纸上内容的,如图2-1所示。

图2-1 斯巴达人使用的“Scytale密码”
此外,公元前1世纪,著名的恺撒大帝发明了一种密码——“恺撒密码”。
在恺撒密码中,每个字母都与其后第三位的字母对应,然后进行替换。
据说当时罗马的军队就是使用恺撒密码进行通信。
举例如下(字母索引偏移量为3):恺撒密码明文字母表:A B C D E F G …… X Y Z
恺撒密码密文字母表:D E F G H I J …… A B C
例如:明文为“veni,vidi,vici”,密文就是“YHAL,YLGL,YLFL”。
26个字符代表字母表的26个字母,从一般意义上说,也可以使用其他字符表,对应的数字也不一定要选择“3”,可以选其他任意数字。
那个阶段还曾经出现过最早的几何图形密码,例如以一种形式写下消息,以另一种形式读取消息,举例来说(见图2-2),将“I came I saw I conquered”编码为“IONQC CAIUE WMEAR DESI”:

图2-2 几何编码加密示意
2.“对称密钥密码”阶段
对称密钥密码,又称为“单钥密码体制”,即使用相同的密钥(加解密密钥)对消息进行加密/解密,系统的保密性主要由密钥的安全性决定,而与算法是否保密无关。
它的设计和实现的中心思想聚焦在:使用哪一种方法,可以产生满足保密要求的密钥,以及用什么方法可以将密钥安全又可靠地分配给通信双方。
对称密码体制可以通过分组密码或流密码来实现,它既可以用于“数据加密”,又可以用于“消息认证”。
其所谓“对称”,其实就是使用同一把密钥进行加密,使用同一把密钥进行解密。
对称加密由于加密和解密使用的是同一个密钥算法,因此在加解密的过程中速度比较快,适用于对数据量比较大的内容进行加解密。
它的主要优点就是算法公开、计算量小、加密速度快、加密效率高,但也存在着显而易见的缺点,就是在密钥协商过程中,一旦密钥泄露,别人就可以用获取到密钥对密文进行解密。
另外,每一对用户(通信双方),每次使用对称加密算法时,都需要使用其他人不知道的独一密钥(互相隔离),这会使得收、发双方所拥有的密钥数量巨大,密钥管理成为双方的共同负担。
常用的对称加密算法有DES、3DES、AES、TDEA、Blowfish、RC2、RC4和RC5等。
3.“公开密钥密码”阶段
相对于“对称密钥密码”阶段,这个阶段进行了公、私钥分离的设计,公钥密码采用了“非对称加密”机制——针对私钥密码体制(对称密钥密码)的缺陷而被提出。
非对称加密会产生两把密钥,分别为公钥(Public Key)和私钥(Private Key),其中一把密钥用于加密,另一把密钥用于解密。
非对称加密的特征是算法强度复杂、安全性依赖于算法与密钥,但是由于其算法过于复杂,从而使得速度没有对称加密解密的速度快。
对称密码体制中只有一把密钥,并且是非公开的,如果要解密就得让对方知道密钥。
所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码机制那样传输对方的密钥,安全性就提高了很多。
常用的非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
2.1.2 近代密码学的开端
1949年,香农(Shannon,美国数学家、信息论之父、现代密码学先驱,见图2-3)的论文《保密系统的通信理论》(The Communication Theory of Secret Systems),阐明了关于密码系统的分析、评价和设计的科学思想,提出了保密系统的数学模型、随机密码、纯密码、完善保密性、理想保密系统、唯一解距离、理论保密性和实际保密性等重要概念,并提出评价保密系统的5条标准,即:保密度、密钥量、加密操作的复杂性、误差传播和消息扩展。
这篇论文开创了用信息理论研究密码的新途径。

图2-3 香农(Shannon)
军事领域对于密码学的需求一直是非常旺盛的,战争中信息的保密传输和完整送达一直都被高度重视。
在第二次世界大战中,正是波兰和英国密码学家破译了德军使用的恩尼格玛密码机(德语:Enigma,也被译作哑谜机、奇迷机,一种用于加密与解密文件的密码机),才使得战局出现了转机,其中的代表人物就是图灵。
在第二次世界大战期间,数学家和工程师运用数学知识和科学技术破译了德国的恩尼格玛密码、“洛伦兹”密码以及日本海军的密码,获得了大量的“超级情报”,成为战争胜利的关键。
恩尼格玛密码系统如图2-4所示:水平面板的下面部分就是键盘,一共有26个键,空格和标点符号都被省略,在图2-4中只画了六个键。
实物照片中,键盘上方就是显示器,它由标示了同样字母的26个小灯组成,当键盘上的某个键被按下时,和此字母被加密后的密文相对应的小灯就在显示器上亮起来。

图2-4 恩尼格玛密码系统
最先破解早期恩尼格玛密码机的是波兰人,1932年,波兰密码学家马里安·雷耶夫斯基、杰尔兹·罗佐基和亨里克·佐加尔斯基根据恩尼格玛机的原理破译了它。
1939年中期,波兰政府将此破译方法告知英国和法国,但直到1941年英国海军捕获德国U-110潜艇,得到密码机和密码本后才完全破解了恩尼格玛密码。
而英军在计算机理论之父图灵的带领下,通过德军在密钥选择上的失误以及借助战争中夺取的德军密码本,破解出重要的德军情报。
1942年,美国教授约翰·阿塔那索夫和克利夫·贝瑞发明了世界上第一台采用真空管的计算机ABC(Atanasoff–Berry Computer)。
借助于快速电子计算机和现代数学方法,美军成功破解出日军的PURPLE码,并在中途岛战役中截击山本五十六。
可以说,密码学的发展直接改变了二战后期的格局,加快了战争的结束。
在二战的日美太平洋战场上,美国海军使用纳瓦霍语进行情报传递。
由于纳瓦霍语的语法、音调及词汇都极为独特且知之者甚少。
因此,纳瓦霍语密码也成为近代史上少有的、从未被破译的密码。
恩尼格玛密码的成功破译,让密码学家们深刻地意识到:真正保证密码安全的往往不是加密解密算法,而是应该随时能够改变的密钥。
随着计算机技术、电子通信技术的发展,密码的使用被迅速扩张到各个领域,也进一步促进了现代密码学体系的发展和完善。
在密码学体系中,“对称加密”“非对称加密”“单向散列函数”“消息认证码”“数字签名”和“伪随机数生成器”被统称为密码学家的工具箱。
其中,“对称加密”和“非对称加密”主要是用来保证机密性;
“单向散列函数”用来保证消息的完整性;
“消息认证码”的功能主要是认证;
“数字签名”保证消息的不可抵赖性。
2.1.3 区块链去中心化密钥共享
我们先了解一下“秘密共享”的概念,其最早是由著名密码学家阿迪·萨莫尔(Shamir)和乔治·布拉克利(Blakley)在1979年分别独立提出的,并给出了其各自的实现方案。
Shamir提出的(t,n)门限方案是基于Lagrange(拉格朗日)插值法来实现的,而Blakley提出的(t,n)门限方案则是利用多维空间参数曲线与超法面的交点来构建实现的。
秘密共享大致可以分为如下几类:
(1)门限秘密共享方案。
在(t,n)门限秘密共享方案中,任何包含至少t个参与者的集合都是授权子集,而包含t-1或更少参与者的集合都是非授权子集。
实现(t,n)门限秘密共享的方法除了常见的Shamir和Blakley的方案外,还有基于中国剩余定理(又被称为“中国余数定理”)的Asmuth-Bloom法以及使用矩阵乘法的Karnin-Greene Hellman方法等实现方案。
(2)一般访问结构上秘密共享方案。
门限方案是实现门限访问结构的秘密共享方案,对于其他更广泛的访问结构存在局限性,比如,在“甲、乙、丙、丁”四个成员中共享秘密,使甲和丁或乙和丙合作能恢复秘密,门限秘密共享方案就不能解决这样的情况。
针对这类问题,1987年,密码学研究人士提出了一般访问结构上的秘密共享方案。
1988年有人提出了一个更简单有效的方法——单调电路构造法,并且证明了任何访问结构都能够通过完备的秘密共享方案加以实现。
(3)多重秘密共享方案。
只需保护一个子秘密就可以实现多个秘密的共享,在多重秘密共享方案中,每个参与者的子秘密可以使用多次,但是一次秘密共享过程只能共享一个秘密。
(4)多秘密共享方案。
多重秘密共享解决了参与者的子秘密重用的问题,但其在一次秘密共享过程中只能共享一个秘密。
(5)可验证秘密共享方案。
参与秘密共享的成员可以通过公开变量验证自己所拥有的子秘密的正确性,从而有效地防止了分发者与参与者,以及参与者与参与者之间的相互欺骗问题。
可验证秘密共享方案分为交互式和非交互式两种。
交互式可验证的秘密共享方案是指,各个参与者在验证秘密份额的正确性时需要相互之间交换信息;
非交互式可验证的秘密共享是指,各个参与者在验证秘密份额的正确性时不需要相互之间交换信息。
在应用方面,非交互式可验证秘密共享可以减少网络通信费用,降低秘密泄露的机会,因此应用领域也更加广泛。
(6)动态秘密共享方案。
动态秘密共享方案是1990年提出的,它具有很好的安全性与灵活性,它允许新增或删除参与者、定期或不定期更新参与者的子秘密以及在不同的时间恢复不同的秘密等。
以上是几种经典的秘密共享方案。
需要说明的是,一个具体的秘密共享方案往往是几个类型的集合体。
除了以上这些分类中提及的方案,如今在量子秘密共享、可视化秘密共享、基于多分辨滤波的秘密共享以及基于广义自缩序列的秘密共享等方面,均有团队投入研究。
自“秘密共享方案”诞生以来,不同环境下的密钥共享方案层出不穷,其中的大部分方案,都假设密钥被存储在一个可信的中心,即存在并依赖一个可信的、中心化的密钥分发者,由它全权负责将密钥分割成为子密钥,并且负责安全地将子密钥发送给参与者。
但是在实际生产环境中,绝对可信的、稳定可用的一个中心往往并不存在。
所以,一种新的“无可信中心的密钥共享协议”被提出,以适应那些去中心化的实际运营环境。
在无可信中心的密钥共享中,子密钥的产生和分配都是由该分布式架构中的所有参与者本身合作完成的。
相比在实际应用中,可信中心的密钥共享可能存在的“权威欺骗”问题,以及在现实中需要成员具有较高的可信度等假设问题,去中心化的可信密钥共享方案的安全性更高,实用性也更强。
去中心化的可信密钥共享研究,其核心目的就是要寻找合适的方案来保证信息安全,有效地发布信息和可信地传输信息。
此外,去中心化的可信密钥共享中的子密钥如何分发,是当前研究的热点问题,其发展空间还很大。
因此,对这个问题的研究不仅具有重要的理论价值,在实际应用中也有着非常广泛的应用前景。
大家都知道,钱包是区块链应用中重要的基础设施,安全的钱包要实现的是去中心化的存储和恢复私钥/助记词的功能。
Secret Sharing是一个不错的解决方案,它的原理是把一个秘密分散、加密存储在多个使用者那里,只有当达到一定数量的使用者时才能拼凑出原始秘密的全貌,而参与者较少时则无法获得这个秘密。
这样既可以减少因为链上单一节点失败造成的丢失或可用性风险,又能在一定条件下恢复私钥。
同时,理论上说,如果一定数量的使用者联合起来作恶,还是可以获取秘密来侵害秘密持有人利益的。
Secret Sharing的加密算法理论在1979年被发表,2014年就有在区块链领域使用的先例。
区块链行业中也有相关工具提供,比如passguardian项目,帮助用户把私钥分片加密存储,且存储过程由用户自己选择存储的策略。
例如,我们可以选择分别打印出不同部分,分不同的地点保管,也可以分发给几个人共同保管。
Vault12项目和Tenzorum项目致力于打造密钥共享的产品化解决方案。
Casa项目在多签密钥安全性的实现上有着极高的代表性。
Vault12的解决方案是私钥持有人可以邀请其他人作为保管人,可以根据保管数据的安全等级来设定恢复难易程度,比如,可以针对不同内容,选择一个或者多个保管方来进行恢复确认,在恢复前需要参与方通过视频、电话等方式验证身份。
2.2 密码系统
从数学的角度来讲,密码系统就是一组映射系统,系统的功能是保证在密钥的控制下,将明文空间中的所有独立元素映射到密文空间上相应的某个元素。映射由具体的密码方案确定,使用哪一个具体的映射,由密钥决定。
如果密码分析者可以仅由密文推出明文或密钥,或者可以由明文和密文推出密钥,那么就称该密码系统是可破译的;
反过来,则称该密码系统是不可破译的。
2.2.1 定义
明文:可理解的消息。
它将被转换为难以理解(加密)的消息。
密文:加密形式的消息。
加密:将明文转换为密文的过程。
解密:将密文转换为明文的过程。
密钥:加密和解密过程中使用的参数。
密码系统:一种加密和解密信息的系统。
对称密码系统:使用相同密钥加密和解密信息的密码系统。
非对称密码系统:加密算法和解密算法分别用两个不同的密钥实现,并且由加密密钥不能推导出解密密钥的系统。
密码分析:破坏密码系统的研究。
密码机制:如果我们用上述内容来对密码机制给出一个相对严格的定义,那么,一套密码机制应该由以下五个部分组成。
(1)明文空间P:所有可能的明文组成的有限集;
(2)密文空间C:所有可能的密文组成的有限集;
(3)密钥空间K:所有可能的密钥组成的有限集;
(4)加密法则E:由一些公式、法则或程序构成;
(5)解密法则D:它是加密法则E的逆,对任意的密钥k,都存在一个加密法则ek和相应的解密法则dk,且对任意明文x,均有dk(ek(x))=x。
2.2.2 对称加密
在公钥加密出现之前,双方通过“秘密会议”“密封信封”或“可信赖的信使”等方式交换重要信息,并依赖“非加密方法”交换的一个“加密密钥”来隐藏重要信息(防止被抓后泄露信息)。
如果我们想与某人私下交流,需要亲自见面并使用私密密钥。
在现代通信领域,人们需要通过有许多不受信任的参与者的网络进行协调,这种方法是不可行的。
这就是为什么对称加密不用于公共网络中的通信。
然而,它比非对称加密更快,更有效,因此也广泛应用于加密大量数据、某些支付应用程序、随机数生成或散列场景,如图2-5所示。

图2-5 对称加密示意图
2.2.3 非对称加密
非对称加密系统(也称作公钥加密)通过引入两个密钥(公钥和私钥)解决了类似上一节的协调问题。
这样的系统中,私钥仅为所有者所知,并且需要保密,而公钥可以提供给任何人。
也就是说,任何人都可以使用接收者的公钥加密消息,而此消息只能使用接收方的私钥解密。
例如,发件人可以将邮件与其私钥组合在一起,从而在邮件上创建数字签名。
任何人现在都可以使用相应的公钥验证签名是否有效,而如何生成密钥取决于使用的加密算法。
非对称系统的实例包括RSA(Rivest-Shamir-Adleman)和ECC(椭圆曲线密码术),它也被用在比特币网络的实现上,如图2-6所示。

图2-6 非对称加密示意图
2.3 区块链常用密码学知识
2.3.1 Hash(哈希)算法
基础知识
1逻辑运算符。
&(与):所有的都是真结果才是真;|“或”:至少一个为真结果也为真;~(非):真为假,假为真;^(异或):如果a、b两个值不相同,则异或结果为1,如果a、b两个值相同,异或结果为0。
2.字节序
·计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
·举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。
·大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
3.循环移位
·循环右移就是当向右移时,把编码的最后的位移到编码的最前头,循环左移正相反。
例如,对十进制编码12345678循环右移1位的结果为81234567,而循环左移1位的结果则为23456781。
什么是Hash算法
Hash算法是一种能将任意长度的二进制明文映射为较短的二进制串的算法,并且不同的明文很难映射为相同的Hash值。
我们也可以把它理解为空间映射函数——是从一个非常大的取值空间映射到一个非常小的取值空间,由于不是一对一的映射,Hash函数转换后不可逆,也就是说,不可能通过逆操作和Hash值还原出原始的值。
Hash算法有什么特点
(1)正向快速:给定明文和Hash算法,在有限时间和有限资源内能计算得到Hash值。
(2)逆向困难:给定Hash值,在有限时间内很难逆推导出明文。
(3)输入敏感:原始输入信息发生任何变化,新的Hash值都应该出现很大变化。
(4)冲突避免:很难找到两段内容不同的明文,使得它们的Hash值一致。
常见Hash算法有哪些 MD5和SHA系列,目前MD5和SHA1已经被破解,而SHA2-256算法比较普遍被使用。
Hash算法碰撞 既然输入数据长度不固定,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个,所以建立一对一关系明显是不现实的。
既然“碰撞”是必然会发生的,那么一个成熟的哈希算法要求具备较好的抗冲突性,同时在实现哈希表的结构时,也要考虑到哈希冲突的问题。
比如“666”经过Hash后,其哈希值是“fae0b27c451c728867a567e8c1bb4e53”,相同Hash算法得到的值是一样的。
比如WiFi密码如果是8位纯数字的话,顶多就是99999999种可能性,破解这个密码需要做的就是提前生成好0到1亿数字的Hash值,然后做1亿次布尔运算(就是Bool值判断,0或者1),而现在普通Intel i5四核CPU(每秒能到达200亿次浮点数计算)做1亿次布尔运算,也就是秒级别的时间就破解了。
因此,密码尽量不要用纯数字,密码空间有限会导致很难构建高安全性。
加盐防碰撞
常用的防止“碰撞”的方式,就是加盐(Salt)。
其实现原理,就是在原来的明文,加上一个随机数之后,再进行运算的Hash值,Hash值和盐通常会分别保存在两个不同的地方,同时泄露才可能被破解。
·MD5算法属于Hash算法中的一种,它具有以下特性:输入任意长度的信息,经过处理,输出为128位的信息(数字指纹)。
不同的输入得到不同的结果(唯一性)。
根据128位的输出结果不可能反推出输入的信息(不可逆)。
可见其继承了Hash算法的优良特点,用处很多,如登录密码、数字签名等。
算法实现介绍
MD5是以512位分组来处理输入的信息,每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组拼接后生成一个128位Hash值,具体步骤如下:
填充:假如原始信息长度对512求余的结果不等于448(这里说的单位是bit,就是位,1字节(Byte)= 8位(bit)),就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和m个0。
填充完后,信息的长度就为n × 512 + 448(这里n表示的是512的整数倍,注意:n也可以为0)。
记录长度:用64位来存储填充前信息长度,这64位加在第一步结果的后面,这样信息长度就变为n × 512 + 448 + 64 =(n+1)*512位,也就是512的整数倍。
设置初始值:MD5的哈希结果长度为128位,按每32位分成一组共4组,这4组结果是由4个初始值A、B、C、D经过不断计算得到的,分别为16进制的A =0x67452301,B = 0x0EFCDAB89,C = 0x98BADCFE,D = 0x10325476。
准备四个逻辑运算函数:
F(X,Y,Z)=(X & Y)|((~X)& Z)G(X,Y,Z)=(X & Z)|(Y &(~Z))H(X,Y,Z)= X ^ Y ^Z J(X,Y,Z)= Y ^(X |(~Z))
把原始消息数据分成以512位为一组进行处理,每一组进行4轮变换,每一轮对应上面的逻辑运算函数。
每一轮中会把512位的数据按照每一小块32位长度分成16块数据,进行16次计算,每一次计算会把对ABCD中的其中三个作一次逻辑运算,然后将所得结果加上第四个变量,16块数据其中一块数据和一个常数。
再将所得结果向左环移一个规定的数量,并加上ABCD中之一。
最后用该结果取代ABCD中之一。
以上面所说的4个常数ABCD为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD 5值。
2.3.2 RSA算法
Rivest-Shamir-Adleman(RSA)算法是最流行和最安全的公钥加密方法之一。
该算法利用了这样一个事实:根据数论,寻求两个大素数相对比较简单,但是将它们的乘积进行因式分解却极其困难,因此可以将乘积公开,作为加密密钥。
加密密钥是公开的,解密密钥由用户保密。
假设使用加密密钥key(e,n),其实现算法如下:将消息表示为0到(n-1)之间的整数。
大型消息可以分解为多个块。
然后,每个块将由相同范围内的整数表示。
取其e次方再模n,得到密文消息C;
要解密密文消息C,取其d次方再模n;
加密密钥(e,n)是公开的。
解密密钥(d,n)由用户保密。
如何确定e,d和n的适当值?
选择两个非常大(100位以上)的素数,将其表示为p和q。
将n设为等于p * q。
选择任何大整数d,使得GCD(d,((p-1)*(q-1)))= 1。
求e使得e * d = 1(mod((p-1)*(q-1)))。
Rivest、Shamir和Adleman为每个所需的操作提供了有效的算法。
2.3.3 默克尔树
默克尔树(Merkle哈希树)属于二叉树的一种,而比特币的底层交易系统选择了默克尔树进行了实现。
1什么是默克尔树?
由一个根节点、一组中间节点和一组叶子节点组成。
根节点表示的是最终的那个节点,只有一个。
叶子节点可以有很多,但是不能再扩散,也就是没有子节点。
如果把它想象成一棵树,由树根长出树干,树干上长出树枝,树枝长出叶子,但是,叶子上不会再长出叶子,如图2-7所示。

图2-7 默克尔树示意图

一个简单的默克尔树就是图2-7所显示的那样,由以下三个步骤来实现:
(1)把最底层的Data0, Data1……Data3这四条数据,每一条单独进行Hash,得出4个哈希值作为叶子节点。
(2)把相邻的两个叶子节点的哈希值拿出来再进行Hash,如B0的哈希值加上B1的哈希值,求和的结果Hash后得出B4。
(3)递归执行这样的Hash操作,直到最终Hash出一个根节点,就结束了。
默克尔树的运行原理,在图中展现是:B0 + B1 Hash得出B4,B2 + B3 Hash得出B5,B4 + B5 Hash得出Root根节点。
由于每个节点上的内容都是哈希值,所以也叫“哈希树”。
2.默克尔树的三大特性
(1)任意一个叶子节点的细微变动都会导致Root节点发生翻天覆地的变化,这个可以用来判断两个加密后的数据是否完全一样。
(2)快速定位修改,如果Data1中数据被修改,会影响到B1、B4和Root,当发现根节点Root的哈希值发生变化,沿着Root→B4→B1,最多通过O(log n)时间即可快速定位到实际发生改变的数据块Data 1。
(3)零知识证明(详细内容参见本书第3章),它指的是证明者能够在不向验证者提供任何有用信息的情况下,使验证者相信某个论断是正确的。
比如怎么证明某个人拥有Data0……Data3这些数据呢?
创建一棵如图2-8所示的默克尔树,然后对外公布B1、B5、Root;这时Data0的拥有者通过Hash生成B0,然后根据公布的B1生成B4,再根据公布的B5生成Root,如果最后生成的Root哈希值能和公布的Root一样,则可以证明拥有这些数据,而且不需要公布Data1、Data2、Data3这些真实数据,具体实现方式如图2-8所示。

图2-8 零知识证明原理图
3.默克尔树在比特币中的应用
·默克尔路径:表示从根节点到叶子节点所经过的节点组成的路径,图2-8中Root→B4 → B1就是一条路径。
·比特币中,默克尔树被用作归纳一个区块中打包的所有交易,同时生成整个交易集合的数字签名,且提供了一种校验区块是否存在某交易的高效途径,这就是默克尔路径。
生成默克尔树需要递归地对各个子节点进行哈希运算,将新生成的哈希节点插入默克尔树中,直到只剩一个哈希节点,该节点就是默克尔树的根节点。
·假设一个区块中有16笔交易,根据公式O(log n)可以算出16的对数是4,也就是要找到这个区块中的任意一笔交易,只需要4次就可以,它的默克尔路径会保存4个哈希值,我们来看一个统计(见表2-1),直观感受一下它搜索效率的提升。
表2-1 交易路径对照表

(注:一笔交易的大小,大概需要250 Byte左右的存储空间,路径数代表哈希值的数量,路径数是4表示这条路径存了4个哈希值,每个哈希值是32 Byte,区块大小=交易数* 250 Byte,路径大小=路径数* 32 Byte)
可以看出,当区块大小由16笔交易(4KB)增加至262 144笔交易(65MB)时,为证明交易存在的默克尔路径长度增长极其缓慢,仅仅从128字节到576字节。
有了默克尔树,一个节点能够仅下载区块头(80字节/区块,里面包含上一区块头的哈希值、时间戳、挖矿难度值、工作量证明随机数,包含该区块交易的默克尔树的根哈希值),然后通过从一个满节点,回溯一条小的默克尔路径,就能认证一笔交易的存在,而不需要存储或者传输大量区块链中的大多数内容——这些内容可能有几个G的大小。
这种不需要维护一条完整的区块链的节点,又被称作“简单支付验证(SPV)节点”,它不需要下载整个区块而仅仅通过默克尔路径去验证交易的存在。
2.3.4 数字签名
公钥密码系统的属性允许用户以数字方式“签署”他们发送的消息。
此数字签名提供了来自指定发件人消息的证据。
为了有效,数字签名需要既依赖于消息又依赖于签名者。
这将阻止电子“剪切和粘贴”以及接收者对原始消息的修改。假设用户A想要向用户B发送“数字签名”消息M:
(1)用户A将其解密过程应用于M,得到密文C;
(2)用户A将用户B的加密过程应用于C,得到密文消息S;
(3)密文消息S通过某个通信信道发送;
(4)收到后,用户B将其解密过程应用于S得到密文消息C;
(5)用户B将用户A的加密过程应用于消息C,得到原始消息M。
其间,用户B无法更改原始邮件,或将签名与任何其他邮件一起使用。
但是这样的实现,要求用户B知道如何使用A的解密过程来解密消息。
2.3.5 零知识证明和Zcash
“零知识证明”简单来说就是:证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。
举个简单的例子,A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。
这时有两个方法可以解决:
(1)A把钥匙出示给B,B用这把钥匙打开该房间的锁,从而证明A拥有该房间的正确的钥匙。
(2)B确定该房间内有某一物体,A用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给B,从而证明自己确实拥有该房间的钥匙。
第二种方法就属于零知识证明的范畴。
该方法的好处在于,在整个证明的过程中,B始终不能看到钥匙的样子,从而避免了钥匙的泄露。
零知识证明过程有两个参与方:
一方叫证明者,一方叫验证者。
证明者掌握着某个秘密,他想让验证者相信他掌握着秘密,但是又不想泄露这个秘密给验证者。
双方按照一个协议,通过一系列交互,最终验证者会得出一个明确的结论,即证明者有没有掌握这个秘密。
零知识证明是一种更加安全的信息验证或者身份验证机制。
安全性和隐私性就是零知识证明的价值所在。
零知识证明的三个基本特性
(1)完备性。
如果证明方和验证方都是诚实的,并遵循证明过程的每一步进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。
(2)合理性。
没有人能够假冒证明方,使这个证明成功。
(3)零知识性。
证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。
零知识证明的典范——Zcash
在比特币网络中,用户需要将交易明文广播给所有矿工,由他们来校验交易的合法性。
但是有些情况下,基于隐私的考虑,交易的具体内容希望不对外公开。
解决这个问题的关键思路是:校验一个事件是否正确,是否需要对验证者重现整个事件呢?
我们拿比特币举个例子,一笔转账交易是否具备合法性,其实只要证明三件事:
(1)钱是否属于发送交易的一方。
(2)接收者收到的总额等于发送者发送的金额之和(可能转账有多个来源)。
(3)发送者的所有参与转账账户上多个对应的转账金额(金额总和等于接受者收到的总额)确实被正确销毁。
整个证明过程中,矿工其实并不关心具体的交易金额、发送者具体地址、接受者具体地址,矿工只关心系统账本上的钱是不是绝对守恒的。
Zcash项目就是利用了零知识证明实现了用户的交易内容隐私化。
由于零知识证明在近两年的迅速发展,掌握和理解它的概念变得愈发重要,所以本书第3章将会对其进行更全面的分析讲解,这里只要有个初步认识就可以。
2.4 加密货币
加密货币是一种令人兴奋的新技术,它以破坏式创新的方式出现,挑战了全球传统金融交易的发生方式。
对比传统货币,无论从转账、支付、投资还是单纯作为“金钱”,加密货币代表着我们对金钱看法的范式转变。
截至2021年2月,加密货币总市值已经超过1.2万亿美金。
2.4.1 什么是加密货币
加密货币是一种基于互联网的交换媒介,它使用密码算法进行金融交易。
加密货币利用区块链技术获得分散化、透明化和不变性。
由于我们可以完全控制加密货币,因此无须依赖中央权限来验证交易,所有验证都由加密货币网络完成。
如今,信用卡公司和银行充当了我们所拥有资金的“看门人”。
我们信任它们,让它们保护我们的信息和资金,作为交换,它们管理交易以确保一切正常。
但是,加密货币不需要中央权限,而是以分布式的方式管理交易。
因此,虽然银行可能拥有一个数据库,这个数据库显然也是黑客窃取资产的首选目标,但加密货币则不容易受到这样的攻击,因为每次的攻击都需要对超过半数的全球分布式网络进行攻击,这显然比攻击一个数据中心困难得多。
此外,加密货币可以在几秒钟或几分钟内处理交易,而不是像今天这样可能需要花费数小时或数天的时间(Swift协议)来处理交易。
加密货币(也被称为数字货币)存储在我们用来管理付款的“数字钱包”中。
我们的钱包受私钥保护(将其视为极其复杂的密码),只有我们自己知道。
像现金一样,我们可以随心所欲地支配加密货币,无论是借给朋友、支付午餐外卖,还是发给员工作为薪酬,但与传统现金不同的是,由于加密货币是数字货币,我们可以使用手机上的钱包应用进行支付,或仅通过使用特殊的密钥,在未来使用其他更方便的数字支付方式。
2.4.2 热门加密货币
1.比特币(Bitcoin)
比特币(BTC)是最初的加密货币,由于其在全球的声誉、安全性以及为其提供支持的庞大社区,它是市场的领导者,也具备重要的数字货币研究价值,并时刻受到全世界媒体的关注。
越来越多像Overstock.com这样的零售商开始接受比特币付款,亚马逊也允许消费者购买加密货币的礼品卡,特斯拉公司也可以接受消费者用比特币购车。
目前,比特币是最有价值的加密货币。
2.以太坊(Ethereum)
虽然比特币被设计为数字货币现金系统,但以太坊(ETH)旨在帮助公司在分布式区块链上部署应用程序。
基础货币被称为以太,为这些应用提供“动力燃料”。
以太坊通常被称为“瑞士军刀”并支持多种用例,包括售票、托管代理、在线博彩投注等。
3.瑞波币(Ripple)
瑞波币(XRP)是一种数字资产,旨在使金融机构能够更轻松、更便宜地进行全球支付。
为了满足这些机构的需求,这项技术也专注于交易吞吐量,并且每秒可以处理比比特币多200倍的交易。
瑞波币已经拥有强大的客户名单,其中包括RBC、瑞银、桑坦德银行、加拿大帝国商业银行等十几家银行,还有交易所和支付服务提供商。
4.莱特币(Litecoin)
莱特币(LTC)于2012年作为比特币的“精简版”发布,使用大部分原始比特币代码库构建。
它的主要优势在于它支持比比特币更快的支付和更多的交易吞吐量,能够在不到一秒的时间内处理全球支付。
莱特币有时被称为比特币的“试验台”,因为它相较比特币能够更快、更顺利地采用和实施技术进步。
2.4.3 运作方式
区块链是一种支持多种技术的技术,加密货币只是其中一种应用。
那么,到底什么是区块链?
1. Blockchain
区块链(Blockchain)是计算机通过解决复杂的数学问题而生成的。一旦数学问题得到解决,该区块就是“完整的”。
区块的重要属性是,如果我们更改其中的任何信息(如交易事务数据),整个区块将变为无效或已损坏。
解决这一问题的唯一方法是用正确的原始数据替换不正确的数据(不可篡改性)。
创建新区块时,它会从链中的前一个区块中获取数据,从而创建一个前区块与当前区块的链接,所有的交易都被打包放在这样的连续、不可逆、不可修改的链结构上,因此它被称为区块链。
在区块链中,如果任何区块中的任何数据被更改,则从该点开始的整个区块链将被破坏。
我们可以把它想象成一座木块塔,如果在塔的中间打破一个区块(block),它上面的所有区块(block)都会倒塌。
修复此“塔”的唯一方法就是纠正被篡改的数据。
事实上,区块链通常以“高度”来衡量,“高度”是塔中的区块总数。因此,数据越老,它就越安全。
通常,一旦将足够的附加区块添加到链中以确保安全性,区块将被视为“有效”。
在加密货币体系中,区块链就是用于存储数字货币的不可变交易分类账基础设施。
2. Mining
Mining(挖矿)负责将交易捆绑在一起,然后解决数学难题。
挖矿可能在计算上非常困难,因此需要功能强大的计算机来解决这些难题。
计算机需要花钱,需要电力运行。
为了激励人们参与挖矿,挖矿的人(矿工)会获得工作奖励,可能是新的币、交易费或者其他。
矿工的一部分工作也是确保交易有效。
他们通过确保尝试发送加密货币的人有足够的加密货币来做到这一点——他们可以检查现有的区块链以确定钱包的余额。
由于区块链可供任何人查看,因此每个钱包所做的每笔交易都是可见的。
虽然这可能看起来涉及隐私,因为有人可以跟踪我们钱包的余额和支出,但实际上我们可以拥有任意数量的钱包,并且选择特定加密货币以提供完全匿名的保障,同时保持区块链的完整性。
3.分布式分类账和确认
任何人都可以拥有区块链的副本,因此当矿工成功生成新区块时,他们会将其通知整个网络,使其接受新区块或达成共识。
其他矿工首先验证交易——这是一种安全措施,以确保恶意矿工不会尝试促进无效交易,然后将新块添加到最新的区块链。
随着附加块添加到链中,旧的事务被视为已确认。
块的确认越多,它就越受信任。
当网络验证事务分类账时,它被称为分布式分类账。
这与银行可能维持的中央分类账相对立。
与银行的中央分类账不同,分布式分类账不容易被黑客攻击、破坏或伪造。
2.4.4 加密货币的安全性
与我们处理资金的任何时候一样,安全性是最终关注的问题之一。
加密货币在技术中设计了许多安全措施,以确保个人和整个网络的安全。
在个人层面上,每个钱包都由私钥保护,只有所有者才能访问。
钱包还有一个地址,用于交易。
要进行交易,我们必须使用私钥对其进行数字签名,以证明所有者正在授权交易。
这意味着,即使其他人找到我们钱包的地址,他们也无法进行任何交易。
但是,如果我们要向某人提供我们的私钥,或者他们以某种方式从我们那里找到它,他们就可以代表我们授权任何交易。
这就是私钥保密的最重要原因!
如前所述,区块链的基础技术使得在事务发生后无法对其进行编辑。
此外,由于审查交易的方式,加密货币也不容易受到“双重支出”问题的影响,即一个人试图用相同的钱支付给两个不同的对象。
与传统方法相比,网络安全性的提高使得加密货币更安全,因此也更便宜。
如果我们回顾一下大多数传统支付方式的交易成本(例如信用卡商家1%的费用),这些费用就是为了抵消欺诈、退款造成的问题,这些问题分散在所有用户身上。
如果我们拿走这些费用,我们可以提供超低成本的交易,有时只需几十元人民币的交易费用。
2.5 加密经济学
加密经济学是指对抗性环境中经济互动的研究。
在分散的P2P系统(点对点网络系统)中,由于不能控制任何集中方,人们必须假设会有不良行为者想要破坏系统。
密码经济学将密码学和经济学相结合,创建了强大的分散式P2P网络,尽管攻击者试图破坏它们,但这些网络随着时间的推移而蓬勃发展。
这些系统所基于的密码学使网络中的P2P通信变得安全,经济学鼓励所有参与者为网络做出贡献以使其随着时间的推移而不断发展。
人们普遍存在一种误解,认为来自类似技术的比特币和代币是与欧元、美元等法定货币相当的货币。
比特币和其他加密代币其实并不是传统意义上的货币:
(1)从比特币衍生出来的新资产类比特币和其他原生区块链代币,与过去的商品货币更为相似,而不是最先进的法定货币。
(2)它们是一种新型经济体的操作系统,它超越了民族国家的地理边界。
比特币区块链的协议协调了那些虽互相不了解但彼此信任的民族和国家边界的人,而不需要经典的中央机构和经典的法律协议。
(3)虽然将比特币称为一种货币可能会有一些不妥之处,因为它引发了很多争议,并非完全正确,但比特币确实与我们所知道的货币有相似之处。
当我们试图解释或讨论比特币、区块链和其他加密经济技术时,我们面临的最大挑战是,我们试图用旧术语来解释新现象,这些术语有时不能对新技术进行完美的解释。
为了全面了解比特币和加密货币代表的新技术,我们需要深入研究以下问题:
货币的作用和功能是什么?
什么是比特币或所谓的Token呢?
2.5.1 货币的功能
货币的主要目的是促进经济体内部和经济体之间的商品和服务的交换。
它使经济交换比礼品经济和易货经济更有效率,避免了系统的低效率。
以下列出了它最重要的功能。
1.交换媒介
货币是一种有效的技术,用于中介商品和服务的交换,因为它提供了一种工具来比较不同对象的价值。
2.价值衡量
作为一种单位,它是衡量商品、服务和其他交易市场价值的标准数字货币单位:
(a)报价和讨价还价的基础;
(b)有效会计制度所必需的;
(c)制定涉及债务的商业协议的先决条件。
3.价值存储
金钱的存储必须能够被可靠地保存、存储、检索,并且在检索时可以预测地用作交换媒介。
它的价值必须随着时间的推移保持稳定,因为高波动性对贸易起反作用,通货膨胀会降低货币价值,并削弱货币作为价值存储的能力。
4.债务计价单位
如果钱是有状态的法定货币,它是通过作为债务计价单位和接受的方式来解决债务。
当债务以货币计价时,债务的实际价值可能会因通货膨胀和通货紧缩而发生变化。
2.5.2 货币的属性
为履行其各种职能,货币必须具备某些特性。
1.流动性
易于交易,交易成本低,买卖价格无差价或低价差。
2.可变性
货币单位必须能够相互替代。
必须平等对待每个通证(物理或虚拟),即使它已被前任所有者用于非法目的。
3.耐久性
能够承受重复使用(不会消失或腐烂)。
4.便携性
货币必须易于携带和运输。
5.可认知性
价值必须易于识别。
6.稳定性
价值不应该波动太大。
2.5.3 货币的种类
在现代经济中,货币主要有以下三类:
1.商品货币
它是一种在当地经济中具有内在价值和标准价值的对象。
价值来源于它本身:
金币、银币和其他稀有金属硬币、盐、大麦、动物毛皮、可可、香烟,仅举几例。
2.代表性货币
它是一种交换媒介,代表着有价值的东西,但它本身几乎没有价值,如黄金或白银证书,或由黄金储备支持的纸币和硬币。
更通俗的例子还有粮票。
3.Fiat货币
Fiat货币(不兑换纸币)没有像商品那样的内在物理价值。
它在钞票上的面值大于它的实质内容。
法定货币属于Fiat货币。
2.5.4 Fiat货币
Fiat货币由政府监管建立,类似于支票或债务票据。
它通过政府宣布它是法定货币而获得价值,它的价值本质上是由国家债务来背书。
在现代经济中,流通中的大多数货币不再是钞票和硬币的形式,而是为金融工具服务的一些数字账务记录。
一个国家的货币供应包括货币(纸币和硬币),以及一种或多种类型的银行货币(支票账户、储蓄账户和其他类型的银行账户中的余额)。
银行资金是迄今为止发达国家广义货币的最大部分。
Fiat货币随着时间的推移而发展。
钞票和硬币过去常被用来替代黄金和其他贵金属等商品。
作为代表性的货币——黄金的地位在20世纪发生了翻天覆地的变化。
今天的大多数货币都不再与大宗商品挂钩。
中央银行通过货币政策影响货币供应,这意味着在它在自认为合适的情况下可以印刷或多或少的货币。
但这一切与比特币有何关系?
什么是比特币呢?
2.5.5 比特币有货币属性吗
1.如果有的话,比特币是商品货币,而不是法定货币
虽然比特币具有某些货币属性,但它与商品货币相当,而不是法定货币。
只要人们使用比特币网络进行服务,需要以本地商品(比特币通证)支付,该通证本身具有价值,所以加密货币的商品属性变得更加明显。
2.分散的生产,价格由供需决定
商品的性质是分布式控制,就像比特币一样。
没有任何一个政府或其他实体控制黄金、白银、石油等的开采。
生产是分配的,这些商品的价格是由商品市场的供求决定的,这与加密代币极为类似,如Kraken、Bitfinex、Ploniex、Coinbase等。
与法定货币相反,政府和中央银行等单一的集中实体不会影响比特币或其他加密代币的价格。
3.流动性高于传统商品
与经典交易所交易的经典商品相比,由于基于区块链的P2P汇款的性质,加密通证(比特币、以太币等)具有更高的流动性。
直接汇款更容易,更快捷,更便宜。
如果我们不使用银行或股票经纪人等第三方服务,汇款本身则完全是P2P。
4.价格波动
比特币不受中央机构的监管,而是由市场供求决定,波动较大。
虽然大多数现代经济体的法定货币具有在外汇市场上确定的波动利率,但国家机构可以进行货币干预,即外汇市场干预或货币操纵,作为政府的货币政策操作。
政府或中央银行可以买卖货币以换取本国货币来操纵市场价格。
为什么?
政府通常更喜欢稳定的汇率,因为过度的短期波动会侵蚀市场信心,产生额外成本并降低公司利润,迫使投资者对外国金融资产进行投资。
因此,加密货币/资产和法定货币之间的最大区别是价格波动。
通过套期保值,一些特殊的被称为“稳定币”的加密货币开始出现,价格波动可能在不久的将来不成问题。
5.P2P支付网络
除了与金钱有许多相似之处,底层支付网络还允许我们规避经典银行、信用卡公司、PayPal等。
银行在汇款中的作用被比特币网络的智能合约所取代。
比特币没有集中管理的机构,货币政策由比特币区块链协议中的规则所决定。
代码只能通过网络参与者的多数共识进行升级。
此中细节更复杂,超出了本书的范围。
虽然比特币白皮书中的原始愿景更加分散,但现实证明,网络参与者可以私下联合以获得更多控制权(例如,比特币矿业池与个体矿工相比有更多优势)。
2.5.6 加密货币经济的未来
比特币是一种新的资产类别,并且已经开创了一种新型经济体系,每个人都可以发行自己的通证。
比如,每个人都可以通过几行代码在以太坊区块链上创建应用程序通证、本机区块链通证,甚至更简单。
有了这项新技术,我们现在可以创造全新的经济类型,我们可以将行为经济学模型化为智能合约,目的是激励某些行为——比如激励人们种树,或鼓励人们用自行车代替汽车来节省二氧化碳排放量。
加密通证也是一种技术,它允许我们为实物资产创建数字代表——所谓的资产支持通证——结果是这些资产现在可以以低得多的交易成本进行交易。未来已来,但大多数人还没有意识到这一点。
截至2018年1月,大约1 400个所谓的加密货币(均具有不同的属性和用途)被列在Coinmarketcap[插图]上。
但是,我们仍处于这场革命的最初阶段,面前有一些挑战:
(1)加密资产的价格波动
(2)面向目标的应用型通证的可持续机制设计
(3)关于象征经济的通识教育
(4)立法不明确和非合法化(全球视角)
(5)众所周知的“金钱”定义
2.6 比特币中的密码学
比特币网络主要使哈希与数字签名相结合,通过区块链使用公钥加密来保护数据的完整性。
比特币使用公钥加密,更具体地说,是使用椭圆曲线加密。
请注意,其他区块链可能会使用其他的加密技术。
例如,一些区块链使用更多的隐私保护密码术,例如“Zcash”(零知识证明)和“Monero”(环签名)。
比特币社区正在寻找更具隐私性和更具可扩展性的替代加密签名方案。
2.6.1 比特币中的哈希处理
加密Hash是一种将大量数据转换为难以模仿的短数据的方法。
哈希主要与数字签名结合使用。
这些功能可确保数据完整性,比特币网络中的哈希用于四个过程:
·编码钱包地址
·钱包之间的编码交易
·核实和验证钱包的账户余额和共识机制
·工作证明
比特币网络使用SHA(安全哈希算法),例如SHA-256。
哈希的一个重要特性是,如果改变一位输入数据,输出会发生显著变化,这使得大文本文件中的小变化很容易被检测到。
从接下来的示例中可以看出,当我们只更改一个字母时,会生成完全不同的哈希。
这基于所谓的“雪崩效应”,对于验证数据完整性非常有用。
“雪崩效应”描述数学函数的行为,即使输入字符串中的轻微变化也会导致生成的hash值发生剧烈变化。
这意味着在一个广告中,只要有一个单词,甚至一个逗号发生了改变,整个哈希就会改变。
因此,文档的哈希值可以作为文档的加密等价物——数字fingerprint。
这就是为什么单向hash函数是公钥加密的核心。
在为文档生成数字签名时,我们不再需要使用发件人的私钥加密整个文档,这可能会花费大量时间,所以很有必要改为计算文档的哈希值。
“如何买比特币?”
相应的SHA-256句子看起来像这样:
49c04bf3580376f81232d27c88de48255191f2486335dfd91a0856d216d66caa
如果我们只删除一个符号,例如问号“?”,哈希看起来则像这样:
0ffb7929ea94150e3aa93f06b81daedbaa501c671598236e63a1db32585b4640
2.6.2 比特币中的公钥加密
将公钥加密技术用于比特币区块链,主要目的是创建关于用户身份的安全数字参考。
有关“谁是谁”以及“谁拥有什么”的安全数字参考是P2P交易的基础。
公钥加密允许使用一组加密密钥证明一个人的身份:
私钥和公钥。
两个键的组合创建了数字签名。
这个数字签名证明了一个人的代币所有权,并允许通过一个称为“钱包”的商品来控制代币。
数字签名证明了一个代币的所有权,并允许一个人控制一个人的资金。
正如我们手工签署银行交易或支票,或者我们使用身份验证进行网上银行业务一样,我们使用公钥加密技术来签署比特币交易或其他区块链交易。
在公钥加密中,双方分发其公钥并允许任何人使用其公钥加密消息。
公钥是从私钥数学生成的。虽然从私钥计算公钥非常容易,反过来却只能用粗暴的力量来实现。
猜测钥匙是可能的,但是代价非常大。
因此,如果知道公钥,则不是问题,但私钥必须始终保密。
这意味着,即使每个人都知道一个人的公钥,也没有人可以从中获取一个私钥。
现在,消息可以安全地传送给私钥所有者,只有该私钥的所有者能够使用与公钥关联的私钥解密消息。这种方法也可以反过来。
使用私钥签名的任何消息都可以使用相应的公钥进行验证。
该方法也称为“数字签名”。
公钥的模拟示例是挂锁的示例。
让我们假设,小明和小李想要私下交流,因此他们都购买挂锁。
如果小李想要向小明发送消息,但是害怕有人可能拦截并阅读它,他会要求小明将挂锁(解锁)发送给他。
小李现在可以将他的信放在一个小盒子里并用小明发给他的挂锁锁上。
这封信可以在世界各地发送,而不会被未经授权的人拦截。
只有拥有挂锁钥匙的小明才能打开这封信。
当然,有人可以尝试打破盒子(蛮力),而不是使用钥匙。
这是可能的,但困难取决于盒子的弹性和锁的强度。
公钥加密中的关键问题是,增加从公钥导出私钥的难度,同时不会导致从私钥导出公钥的难度同时增加。
通过猜测结果来破解加密有多难、猜测私钥需要多长时间,以及它有多贵?
私钥由数字表示,这意味着数字越大,不知道该数字的人就越难猜测。
随着计算机变得更快、更高效,我们必须提出更复杂的算法,无论是使用更大的数字还是发明更具弹性的算法。
如果猜测一个随机数需要几十年的时间,那么该数字就被认为是安全的。
每种加密算法都容易受到所谓的暴力攻击,这种攻击是指通过尝试所有可能的组合来猜测我们的私钥,直到找到解决方案为止。
为了确保难以猜测数字,弹性私钥具有最低要求:
它必须是
(1)随机生成的数字。
它需要是一个
(2)非常大的数字。
它必须使用
(3)安全算法来生成密钥。
随机性非常重要,因为我们不希望任何其他人或机器使用相同的密钥,并且人类不善于提出随机性。
2.6.3 比特币中的钱包和数字签名
比特币网络中的这种数字签名和类似的区块链是通过钱包进行的。
区块链钱包是一种存储我们的私钥、公钥和区块链地址的软件,并与区块链通信。
这款钱包可以在电脑、手机或者专用硬件设备上运行。
钱包这样的商品允许管理通证,我们可以通过数字签名发送通证,以及检查发送给我们的通证收据。
例如,每次发送或接收比特币时,我们都需要使用存储在钱包中的私钥对交易进行签名。
随后,我们的个人账户余额将在分类账的所有副本上进行调整,它分布在P2P网络的计算机上,也就是区块链。
区块链地址与传统金融交易环境中的银行账号具有类似功能。
与手写签名类似,数字签名用于验证我们的身份。
通过将数字签名附加到交易中,没有人可以质疑该交易的钱包地址,并且该钱包不能被另一个钱包冒充。
私钥用于签名交易,然后使用公钥来验证计算机的签名。
当第一次启动时,比特币钱包会生成一个由私钥和公钥组成的密钥对。
在第一步中,私钥是随机生成的256位整数。
然后,比特币使用椭圆密钥加密从私钥中以数学方式导出公钥。
这个数学函数以一种方式工作,这意味着很容易从私钥生成公钥,但使用反向数学从公钥中导出私钥将几乎是不可能的。
使用不同类型的加密函数来导出地址会增加额外的安全性:如果第一层安全性——椭圆密钥加密被破坏,那么拥有公钥的人将能够破解私钥。
这很重要,因为当量子计算机成为现实时,椭圆密钥加密特别容易被破坏,而在第二层用于导出地址的散列不易受量子计算机粗暴的影响。
这意味着如果有人拥有区块链地址,并且破解了椭圆密钥加密,那个人仍然必须通过第二层安全保护,从公钥中获取地址。
这类似于为什么要锁两次自行车,两个不同的锁具有不同的安全机制(钥匙或数字锁),在街道上锁自行车时可以增加一层安全性。
与流行的看法相反,区块链钱包不存储任何通证。
它存储与我们的区块链地址关联的公钥-私钥对,但它还记录了涉及钱包公钥的所有交易。
钱包还存储特殊交易所需的特殊信息,如多重签名交易以及一些其他信息,但它从不包含任何通证。
因此,“钱包”这个词有点误导。
“钥匙串”这个词更合适,因为它充当安全密钥存储,并作为区块链的通信工具。
区块链钱包的私钥和我们携带的公寓钥匙有很多的相似之处。
如果我们丢失了公寓的钥匙,公寓仍然是我们的公寓,但只要我们没有领取钥匙,我们就无法进入公寓;
或者找来某些家庭成员、某个锁匠帮助我们闯入自己的房子,打破公寓的锁而进入——即转化为算力攻击来猜测出钱包的私钥。
我们的私钥必须始终保密,不应与其他人共享,除非我们想让他们故意访问我们的通证。
如果我们丢失了钱包,没有备份到我们的地址和私钥,或者如果我们丢失了私钥,我们将无法获得资金。
通证仍然在区块链上,但我们将无法访问它们。
如果我们丢失了托管我们钱包的设备,或者它丢失了,但我们拥有种子短语或私钥的备份,那么我们的资金将不会丢失。
因此,许多人更愿意在在线交流中托管他们的代币。
与今天的银行类似,这些在线交易所充当基金的托管人。
从私钥导出公钥和从公钥导出地址这两步过程是只需要备份私钥的原因。

