精通区块链(一)

作者 : admin 本文共56904个字,预计阅读时间需要143分钟 发布时间: 2024-05-1 共2人阅读

原文:zh.annas-archive.org/md5/0290aeea847c6aa4c7f7f8ed538e33ef

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

这本书有一个目标:提供对区块链技术理论和实践方面的全面介绍。本书包含了完全理解区块链技术所需的所有材料。阅读本书后,读者将能够深入了解区块链技术的内部运作,并能够开发区块链应用程序。本书涵盖了与区块链技术相关的所有主题,包括密码学、加密货币、比特币、以太坊以及用于区块链开发的各种其他平台和工具。

建议读者具有计算机科学的基本理解和基本的编程经验,以充分受益于本书。但是,如果情况不是这样,那么本书仍然可以轻松阅读,因为在必要时提供了相关的背景材料。

本书涵盖的内容

第一章, 区块链 101,介绍了区块链技术基于的分布式计算的基本概念。还涵盖了区块链的历史、定义、特征、类型和优点,以及作为区块链技术核心的共识机制。

第二章, 去中心化,涵盖了去中心化的概念及其与区块链技术的关系。还介绍了可用于去中心化过程或系统的各种方法和平台。

第三章, 密码学与技术基础,介绍了密码学的理论基础,这是完全理解区块链技术所必需的。包括公钥和私钥密码学等概念,并附带了实际示例。最后,还介绍了金融市场,因为在金融领域有许多有趣的区块链技术用例。

第四章, 比特币,介绍了比特币,第一种也是最大的区块链。详细介绍了与比特币加密货币相关的技术概念。

第五章, 替代币,介绍了在比特币发明之后引入的替代加密货币。还介绍了不同替代币的例子、它们的特性以及它们是如何开发和实施的。第六章, 智能合约,深入讨论了智能合约。本章介绍了智能合约的历史、定义、理查德合约、预言机以及智能合约的理论方面。

第七章,以太坊 101,详细介绍了以太坊区块链的设计和架构。它涵盖了与以太坊区块链相关的各种技术概念,解释了这个平台的基本原理、特性和组件。

第八章,以太坊开发,提供了使用以太坊区块链开发去中心化应用程序和智能合约的详细实用介绍。本章还包括对 solidity 和其他相关工具的介绍。

第九章,Hyperledger,介绍了来自 Linux 基金会的 hyperledger 项目的讨论,该项目包括其成员介绍的不同区块链项目。

第十章,另类区块链,介绍了另类区块链解决方案和平台。它提供了另类区块链的技术细节和特性。

第十一章,区块链-货币之外,提供了区块链技术在除加密货币以外的领域(包括物联网、政府、媒体和金融等)的实际和详细介绍。

第十二章,可扩展性和其他挑战,致力于讨论区块链技术面临的挑战以及如何解决这些挑战。

第十三章,当前景观和下一步,旨在提供有关与区块链技术相关的当前景观、项目和研究工作的信息。此外,还根据当前区块链技术的现状做出了一些预测。

本书所需内容

本书中的所有示例都是在 Ubuntu 16.04.1 LTS (Xenial) 上开发的。因此,建议使用 Ubuntu。但是,任何适当的操作系统,无论是 Windows 还是 Linux,都可以使用,但是示例,特别是与安装相关的示例,可能需要相应地进行更改。

与加密相关的示例是使用 OpenSSL 1.0.2g 1 Mar 2016 命令行工具开发的。

以太坊智能合约示例是使用在线可用的浏览器 Solidity(ethereum.github.io/browser-solidity/)开发的。以太坊的主居版用于开发与以太坊相关的示例。在撰写本文时,这是可用的最新版本,可从 www.ethereum.org/ 下载。

使用 Raspberry Pi 套件(由 Vilros 提供)开发了与物联网相关的示例,但任何最新型号或套件均可使用。具体而言,使用了 Raspberry Pi 3 Model B V 1.2 来构建物联网的硬件示例。使用了 Node.js V7.2.1 和 npm V3.10.10 来下载相关包并运行物联网示例的 Node.js 服务器。

Truffle 框架已用于一些智能合约部署示例,并可在truffleframework.com/上获取。通过 npm 可获取的任何最新版本都应该适用。

本书适用人群

本书适用于希望深入了解区块链技术的任何人。它也可以作为开发区块链应用程序的开发人员的参考。此外,本书还可以用作与区块链技术和加密货币相关的课程的教材。它还可以用作与加密货币和区块链技术相关的各种考试和认证的学习资源。

约定

在本书中,您将找到一些区分不同类型信息的文本样式。以下是一些样式的示例及其含义的解释。

文本中的代码字词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄显示如下:

“这行代码简单地使用web3.eth.coinbase方法通过调用 console.log 来打印 coinbase。”

代码块设置如下:

function difference(uint x) returns (uint y)
{ 
    z=x-5;
    y=z;
}

当我们希望引起您对代码块特定部分的注意时,相关行或项将以粗体显示:

function difference(uint x) returns (uint y) 
{  
    z=x-5;
    y=z;
}

任何命令行输入或输出都写成如下格式:

$ geth --datadir .ethereum/PrivateNet/ --networkid 786 --rpc --rpccorsdomain 'http://192.168.0.17:9900'

新术语重要单词以粗体显示。您在屏幕上看到的单词,例如菜单或对话框中的单词,会以如下形式出现在文本中:“点击下一步按钮将您移至下一个屏幕。”

注意

警告或重要说明以此框出现。

提示

提示和技巧以这种方式出现。

第一章:区块链 101

很可能任何阅读本书的人已经听说过区块链,并对其巨大潜力有一些基本了解。

随着比特币的发明(2008 年),世界引入了一个现在可能将彻底改变整个社会的新概念。有人将其描述为一场革命,而另一派人士则认为这将是一场演变,并且在区块链带来任何实际利益之前,还需要很多年的时间。这在某种程度上是正确的,但在我看来,革命已经开始了;世界各地许多大型组织已经开始使用区块链技术撰写概念证明,因为其颠覆性潜力已经被充分认识到。然而,一些组织仍处于初步探索阶段,但随着技术的逐渐成熟,预计它们将更快地取得进展。这项技术还对当前的技术产生影响,并具有在基本水平上改变它们的能力。

根据以下所示的 Gartner 的技术炒作周期图,区块链技术目前处于过度期望的顶峰(截至 2016 年 7 月),预计将在 5 到 10 年内准备好进行主流采用:

精通区块链(一)插图

Gartner 新兴技术的炒作周期

对区块链技术的兴趣在过去几年里急剧上升,一度被一些人忽视为从加密货币的角度来看的极客货币,或者认为这不值得考虑,现在正在世界各地最大的公司和组织进行研究,数百万美元被用于采用和尝试这项技术。在谷歌上进行简单的趋势搜索就能揭示过去几年对区块链技术的兴趣程度:

精通区块链(一)插图

区块链的 Google 趋势

这种技术的各种好处正在被设想,如去中心化信任、成本节省、透明度和效率。然而,也存在各种挑战,这是一个正在积极研究的领域,如可扩展性和隐私。第十二章,可扩展性和其他挑战,致力于讨论区块链技术的局限和挑战。

本章是关于区块链技术的介绍,包括其技术基础、背后的理论以及各种技术的结合,以构建今天所称的区块链。

2008 年,一篇开创性的论文 比特币:点对点的电子现金系统 在点对点电子现金主题下,由化名 中本聪 撰写,并引入了 区块链 这个词。这个词随着时间的推移已经演变成为了现在的区块链。

在本章中,首先描述了分布式系统的理论基础,然后介绍了比特币的前身(通过它引入了区块链技术)如电子现金和哈希现金,最后介绍了区块链技术。这是理解区块链技术的逻辑方式,因为区块链的根源在于分布式系统。

分布式系统

理解分布式系统对于理解区块链至关重要,因为基本上区块链在其核心是一个分布式系统。更准确地说,它是一个去中心化的分布式系统。

分布式系统是一种计算范式,其中两个或更多节点以协调的方式相互合作,以实现共同的结果,并且被建模为使最终用户将其视为单一的逻辑平台。

节点可以定义为分布式系统中的个体参与者。所有节点都能够相互发送和接收消息。节点可以是诚实的、有故障的或恶意的,并且拥有自己的内存和处理器。一个能够表现出任意行为的节点也被称为拜占庭节点。这种任意行为可以是故意的恶意行为,对网络的操作有害。通常,网络上节点的任何意外行为都可以归类为拜占庭行为。这个术语任意地包含了任何意外或恶意的行为:

精通区块链(一)插图

分布式系统的设计;N4 是一个拜占庭节点,L2 是断开或慢速网络链接。

分布式系统设计的主要挑战是节点之间的协调和容错。即使一些节点出现故障或网络链路中断,分布式系统也应该容忍这一点,并且应该继续无缝地工作,以实现所需的结果。这已经是多年来的一个活跃研究领域,已经提出了几种算法和机制来克服这些问题。

分布式系统的设计是如此具有挑战性,以至于已经证明了一个被称为 CAP 定理的定理,并且表明一个分布式系统不能同时具有所有被期望的属性。在下一节中,将提供对 CAP 定理的基本介绍。

CAP 定理

这也被称为布鲁尔定理,最初由 埃里克·布鲁尔 在 1998 年作为一个猜想提出;在 2002 年被 塞思·吉尔伯特南希·林奇 证明为一个定理。

定理表明,任何分布式系统都不能同时具有一致性、可用性和分区容错性:

  • 一致性 是一种属性,确保分布式系统中所有节点都具有数据的单一最新副本。

  • 可用性 意味着系统正常运行,可以使用,并且在需要时接受传入请求并以数据回应而没有任何故障。

  • 分区容错性 确保即使一组节点失败,分布式系统仍然能够正常运行。

已经证明,分布式系统不能同时具有上述三个属性。这很奇怪,因为某种方式上区块链设法实现了所有这些属性,或者真的吗?这将在后面的章节中解释,其中将讨论区块链背景下的 CAP 定理。

为了实现容错性,使用了复制。这是一种实现容错性的常见和广泛使用的方法。一致性是使用共识算法来确保所有节点具有相同的数据副本。这也被称为状态机复制。区块链基本上是一种实现状态机复制的方法。

一般而言,节点可能经历两种类型的故障:一个是故障节点简单地崩溃了,另一个是故障节点可能会以任意方式表现出恶意或不一致的行为。这是难以应对的类型,因为它可能会由于误导性信息而导致混淆。

拜占庭将军问题

在讨论分布式系统中的一致性之前,介绍了历史上的事件,这些事件是成功和实用的一致性机制发展的先驱。

在 1962 年 9 月,保罗·巴兰在他的论文*《关于分布式通信网络》*中引入了加密签名的概念。这篇论文也是第一次引入了分散网络的概念。然后,在 1982 年,Lamport 等人提出了一个思想实验,其中一组领导拜占庭军队不同部分的将军计划攻击或撤退城市。他们之间的唯一通信方式是一个信使,他们需要达成一致,同时攻击才能获胜。问题在于,一个或多个将军可能是叛徒,并且可以传递误导性的消息。因此,需要找到一种可行的机制,即使在存在叛徒将军的情况下,也可以使将军之间达成协议,以便攻击可以同时进行。类比于分布式系统,将军可以被视为节点,叛徒可以被视为拜占庭(恶意)节点,信使可以被视为将军之间的通信渠道。

这个问题在 1999 年由CastroLiskov解决了,他们提出了实用拜占庭容错PBFT)算法。随后,在 2009 年,第一个实用的实现是通过发明比特币实现的,其中工作证明PoW)算法被开发为一种实现共识的机制。

一致性

共识是在不信任的节点之间就数据的最终状态达成一致的过程。为了达成共识,可以使用不同的算法。在两个节点之间很容易达成一致(例如在客户端-服务器系统中),但是当多个节点参与分布式系统并且它们需要就单个值达成一致时,达成共识就变得非常困难。在多个节点之间达成共识的概念被称为分布式共识。

共识机制

共识机制是所有或大多数节点为了达成对提议状态或值的一致而采取的一组步骤。这个概念已经被计算机科学家在工业界和学术界研究了三十多年。随着比特币和区块链的出现,共识机制最近引起了广泛关注并且受到了很多人的欢迎。

为了提供共识机制中所需的结果,必须满足各种要求。以下是它们的要求及简要描述:

  • 一致性:所有诚实节点对同一值做出决定。

  • 终止:所有诚实的节点终止共识过程的执行并最终达成决定。

  • 有效性:所有诚实节点达成的价值必须与至少一个诚实节点提议的初始值相同。

  • 容错性:共识算法应能在存在故障或恶意节点(拜占庭节点)的情况下运行。

  • 完整性:这是一个要求,即没有节点会做出超过一次的决定。节点只在单个共识周期中做出决定一次。

共识机制的类型

有各种类型的共识机制;一些常见的类型描述如下:

  • 基于拜占庭容错的:在没有计算密集型操作(如部分哈希反演)的情况下,此方法依赖于一种简单的节点发布签名消息的方案。最终,当收到一定数量的消息时,就会达成一致意见。

  • 基于领导者的共识机制:这种类型的机制要求节点竞争领导者选举彩票,赢得彩票的节点提出最终值。

已经提出了许多实用的实现,例如Paxos,这是由Leslie Lamport在 1989 年提出的最著名的协议。在 Paxos 中,节点被分配为不同的角色,如提议者、接受者和学习者。节点或进程被命名为副本,并且在存在故障节点的情况下通过大多数节点的协议达成共识。

另一种替代 Paxos 的方案是 RAFT,它通过将节点分配为三种状态之一来工作,即 Follower、Candidate 或 Leader。在候选节点获得足够的选票之后,将选举出一个 Leader,所有的更改现在都必须经过 Leader,一旦在大多数 Follower 节点上的复制完成,Leader 就会批准提议的更改。

从分布式系统的角度来看,有关共识机制理论的更多细节超出了本章的范围。本章稍后将专门介绍共识协议的概述部分。具体的算法将在本书后面专门讨论比特币和其他区块链的章节中进行讨论。

区块链的历史

区块链是在 2008 年比特币的发明以及在 2009 年的实际实现中引入的。对于本章,简要介绍比特币就足够了,因为后面有一整章关于比特币,但也必须提到比特币,因为没有它,区块链的历史是不完整的。

电子现金或数字货币的概念并不新鲜。自 20 世纪 80 年代以来,存在着基于大卫·朝霞提出的模型的电子现金协议。

电子现金

正如理解分布式系统概念对于理解区块链技术至关重要一样,了解电子现金的概念也是欣赏区块链的第一个和令人惊叹的成功应用:比特币,或广义的加密货币的基础。分布式系统中的理论概念,如共识算法,为比特币中工作量证明算法的实际实现提供了基础;此外,不同电子现金方案的想法也为加密货币,特别是比特币的发明铺平了道路。

在本节中,读者将首先介绍电子现金的概念,然后呈现出在加密货币出现之前存在的各种其他概念,这些概念导致了比特币的发展。

电子现金的概念

在电子现金系统中需要解决的基本问题是责任和匿名性。大卫·朝霞在他 1984 年的开创性论文中通过引入两种密码操作,即盲签名和秘密共享,解决了这两个问题。这些术语和相关概念将在第三章中详细讨论,密码学和技术基础。目前,可以说盲签名允许在不实际看到文档的情况下对其进行签名,而秘密共享是一种允许检测两次使用相同电子现金令牌(双重支付)的概念。

之后出现了其他协议,如Chaum, Fiat, and NaorCFN),这些电子现金方案引入了匿名性和双重花费检测。 Brand’s e-cash 是另一个改进 CFN 的系统,使其更加高效,并引入了安全约简的概念来证明有关电子现金方案的陈述。安全约简是密码学中用于证明某个算法安全性的一种技术,通过使用另一个问题作为比较来证明。换句话说,通过比较可以推断出密码安全算法与其他难题一样难以破解;因此可以推断出密码安全算法也是安全的。

1997 年,Adam Back提出了一种名为hashcash的不同但相关的概念,作为一种控制电子邮件垃圾邮件的 PoW 系统。这个想法非常简单:如果合法用户想要发送电子邮件,那么他们需要计算一个哈希作为证明,证明他们在发送电子邮件之前已经花费了相当数量的计算资源。生成 hashcash 是一个计算密集型的过程,但不会阻止合法用户发送电子邮件,因为合法用户通常需要发送的电子邮件数量可能相当低。另一方面,如果垃圾邮件发送者想要发送大量的电子邮件,通常是成千上万封,那么为所有电子邮件计算 hashcash 就变得不可行,从而使垃圾邮件的努力变得昂贵;因此,这种机制可以用来阻止电子邮件垃圾邮件。hashcash 需要大量的计算资源来计算,但验证起来很容易且快速。验证由接收电子邮件的用户执行。hashcash 因其在比特币挖掘过程中的使用而广受欢迎。最初,使用计算难题或定价功能防止电子邮件垃圾邮件的想法是在 1992 年由Cynthia DworkMoni Naor提出的。定价功能是指需要计算的硬函数,以便在授予资源访问权限之前可以进行访问。后来,Adam Back于 1997 年独立发明了 hashcash,引入了使用计算哈希函数作为 PoW 的方法。

1998 年,Wei Dai提出了b-money的概念,并提出了通过解决诸如 hashcash 之类的计算难题来创造货币的想法。它基于一个点对点网络,其中每个节点维护其自己的交易列表。

Nick Szabo提出的另一个类似的概念叫做 BitGold 于 2005 年提出,也提出了通过解决计算难题来铸造数字货币的想法。2005 年,Hal Finney通过结合 b-money 和 hashcash 难题的想法,提出了加密货币的概念,但仍依赖于中央信任的权威。

前面所述方案存在多个问题。这些问题范围从节点之间的分歧没有明确的解决方案到依赖于中央信任的第三方和可信时间戳。

2009 年,第一个名为比特币的加密货币的实用实现被引入;这是第一次在无需信任的网络中解决了分布式共识问题。它使用公钥密码学与哈希现金作为 PoW,以提供一种安全的、可控的、去中心化的铸造数字货币的方法。关键的创新是一个由交易组成的有序区块列表的概念,并通过 PoW 机制进行密码学安全保障。这将在第四章 比特币中详细解释。

通过审视上述技术及其历史,很容易看出从电子现金方案和分布式系统中的思想和概念如何被结合在一起,发明了比特币以及现在所称的区块链。

这也可以通过以下图示来可视化:

精通区块链(一)插图

帮助发明比特币和区块链的各种想法

区块链介绍

对于区块链有各种不同的定义;这取决于你如何看待它。如果你从商业角度看,可以在那个背景下定义它,如果你从技术角度看,可以根据那个视角来定义它。

区块链本质上是一个点对点的分布式分类账,具有密码学安全性,仅追加,不可变(极难更改),只能通过同行间的共识或协议进行更新。

区块链可以被视为运行在互联网之上的分布式点对点网络的一层,如下图所示。它类似于运行在 TCP/IP 之上的 SMTP、HTTP 或 FTP。如下图所示:

精通区块链(一)插图

区块链的网络视图

从商业角度看,区块链可以被定义为一个平台,通过其中的交易,对等方可以交换价值,而无需中央可信的仲裁者。这是一个强大的概念,一旦读者理解它,他们将意识到区块链技术的巨大潜力。这使区块链成为一个去中心化的共识机制,没有单一的管理者负责数据库。

区块仅仅是为了将交易逻辑地组织在一起而捆绑在一起的一组交易。它由交易组成,其大小可变,具体取决于所使用的区块链的类型和设计。对先前区块的引用也包含在区块中,除非它是一个创世区块。创世区块是区块链中的第一个区块,在启动区块链时硬编码。一个区块的结构也取决于区块链的类型和设计,但通常有一些属性对区块的功能至关重要,如区块头、指向先前区块的指针、时间戳、随机数、交易计数器、交易和其他属性。

这在简单的框图中显示如下。这是一个通用区块的示意图;与其区块链技术相关的具体区块结构将在本书后面更深入地讨论技术细节:

精通区块链(一)插图

区块结构

区块链的各种技术定义

  • 区块链是一种去中心化的共识机制。在区块链中,所有节点最终就交易状态达成一致。

  • 区块链是一个分布式共享账本。区块链可以被看作是交易的共享账本。这些交易被排序并分组到区块中。目前,现实世界的模型是基于每个组织维护的私人数据库,而分布式账本可以作为所有使用区块链的成员组织的真实单一来源。

  • 区块链是一种数据结构;它基本上是一个使用哈希指针而不是普通指针的链表。哈希指针用于指向上一个区块。

可以利用下图来形象地描述通用区块链的结构:

精通区块链(一)插图

区块链的通用结构

区块链的通用元素

在本部分,介绍了区块链的通用元素。更精确的元素将在以太坊区块链等后续章节中讨论。

地址

地址是用于在区块链上表示发送方和接收方的唯一标识符。地址通常是公钥或由公钥派生而来。虽然地址可以被同一用户重复使用,但地址本身是唯一的。然而,在实践中,单个用户可能不会再次使用同一地址,并为每笔交易生成一个新地址。这个新生成的地址将是唯一的。比特币实际上是一个假名系统。最终用户通常无法直接识别,但一些对比特币用户进行去匿名化研究表明用户可以成功地被识别。作为一个良好的实践建议,建议用户每次交易都生成一个新地址,以避免将交易链接到共同所有者,从而避免识别。

交易

交易是区块链的基本单位。一笔交易代表了价值从一个地址到另一个地址的转移。

区块

一个区块由多个交易和一些其他元素组成,如前一个区块的哈希(哈希指针)、时间戳和随机数。

点对点网络

顾名思义,这是一种网络拓扑结构,其中所有节点都可以彼此通信并发送和接收消息。

脚本或编程语言

此元素对交易执行各种操作。交易脚本是节点用于将代币从一个地址转移到另一个地址并执行各种其他功能的预定义命令集。图灵完备的编程语言是区块链的一个理想特征;然而,这些语言的安全性是一个关键问题和一个重要而持续的研究领域。

虚拟机

这是交易脚本的延伸。虚拟机允许在区块链上运行图灵完备代码(作为智能合约),而交易脚本的操作可能受到限制。虚拟机并不是所有区块链都可用;然而,各种区块链使用虚拟机来运行程序,例如以太坊虚拟机EVM)和链虚拟机CVM)。

状态机

区块链可以被视为状态转换机制,其中状态从其初始形式修改为下一个形式,最终通过节点的交易执行和验证过程修改为最终形式。

节点

区块链网络中的节点根据其扮演的角色执行各种功能。一个节点可以提出和验证交易,并进行挖矿以促进共识并保障区块链的安全。这是通过遵循共识协议完成的。(最常见的是 PoW。)节点还可以执行其他功能,如简单支付验证(轻量级节点)、验证器,以及根据所使用的区块链类型和节点分配的角色而定的许多其他功能。

智能合约

这些程序在区块链之上运行,并封装了在满足某些条件时要执行的业务逻辑。智能合约功能并不是所有区块链都具备的,但现在正在成为一种非常理想的特性,因为它为区块链应用程序提供了灵活性和强大性。

区块链的特征

区块链执行各种功能。下面详细描述了这些功能。

分布式共识

分布式共识是区块链的主要支撑。这使得区块链能够呈现一种由所有参与方一致同意的真实版本,而无需中央机构的要求。

交易验证

从区块链上的节点发布的任何交易都根据预先确定的一组规则进行验证,只有有效的交易才会被选择用于包含在一个块中。

智能合约平台

区块链是一个平台,用户可以在其上运行执行业务逻辑的程序。正如前面所解释的,不是所有的区块链都有执行智能合约的机制;然而,这现在是一个非常理想的特性。

在同行之间转移价值

区块链通过代币在其用户之间转移价值。代币可以被看作是价值的载体。

生成加密货币

这是一个根据使用的区块链类型而可选的功能。区块链可以生成加密货币作为奖励,以激励其验证交易并消耗资源以确保区块链安全的矿工。

智能资产

这是第一次可以以不可撤销的方式将数字或实物资产与区块链链接起来,以至于任何其他人都无法声称拥有它;您完全控制您的资产,它不能被重复花费或重复拥有。比如,将其与数字音乐文件进行比较,数字音乐文件可以无控制地被复制多次;然而,在区块链上,如果您拥有它,除非您决定将其转让给其他人,否则没有其他人可以声称拥有它。这个特性在数字版权管理和电子现金系统中有着深远的影响,双重花费检测是一个关键需求。比特币首次解决了双重花费问题。

提供安全性的服务商

区块链基于经过验证的加密技术,确保数据的完整性和可用性。通常,由于透明度的要求,不提供机密性。这已经成为金融机构和其他需要交易隐私和机密性的行业适应性的主要障碍。因此,该领域的研究非常活跃,已经取得了一些良好的进展。可以认为,在许多情况下,机密性并不真正需要,而透明性更受欢迎。例如,在比特币中,实际上不需要机密性;然而,在某些场景中是值得的。在区块链上提供机密性和隐私方面已经取得了重大进展。一个更近期的例子是 Zcash,在后续章节中将更详细地讨论。区块链还提供其他安全服务,如不可否认性和认证,因为所有操作都是通过使用私钥和数字签名进行安全保护的。

不可变性

这是区块链的另一个关键特性:一旦记录添加到区块链上就是不可变的。虽然有可能回滚更改,但这被认为几乎不可能做到,因为这将需要大量的计算资源,是难以承受的。例如,在比特币的理想情况下,如果一个恶意用户想要更改之前的区块,那么他需要为已经添加到区块链的所有这些区块重新计算 PoW。这种难度使得区块链上的记录几乎不可变。

独特性

区块链的这一特性确保每笔交易都是独一无二的,并且尚未被花费过。这在加密货币中尤为重要,其中双重花费的检测和避免是一个关键需求。

智能合约

区块链提供了一个运行智能合约的平台。这些是自动化的自治程序,驻留在区块链上,并封装了业务逻辑和代码,以便在满足一定条件时执行所需的功能。这确实是区块链的一项革命性特性,因为它允许灵活性、可编程性,以及用户根据其特定业务需求需要执行的操作的可控性。

区块链技术的应用

区块链技术在各个领域有着多种应用,包括但不限于金融、政府、媒体、法律和艺术。第九章Hyperledger 将对这些方面进行详细讨论,讨论各个行业的实际用例。现在可以说的是,几乎所有行业都已经意识到了区块链的潜力和前景,并已经着手或即将着手利用区块链技术的旅程。

在下一节中,讨论了创建区块的一般方案。这里呈现出来是为了给读者一个大致了解区块是如何生成的,以及交易和区块之间的关系。

区块链如何累积区块

  1. 一个节点通过使用其私钥对其进行签名来开始交易。

  2. 交易通过使用非常理想的 Gossip 协议向对等体传播(泛洪),这些对等体根据预设标准验证交易。通常,需要多个节点来验证交易。

  3. 一旦交易被验证,它就会被包含在一个区块中,然后传播到网络上。此时,交易被认为已确认。

  4. 新创建的区块现在成为分类帐的一部分,并且下一个区块在密码学上将自己与该区块链接在一起。此链接是哈希指针。在此阶段,交易获得其第二个确认,区块获得其第一个确认。

  5. 每次创建新区块时,交易都会被重新确认。通常,在比特币网络中,需要六次确认才能将交易视为最终确认。

步骤 4 和 5 可以被认为是非强制性的,因为交易本身在第 3 步中已经完成;然而,区块确认以及如果需要的话进一步的交易重新确认,将在步骤 4 和 5 中进行。

区块链技术的层次

在本节中,讨论了各个层次的区块链技术。可以预见,由于区块链技术的快速发展和进步,许多应用将随着时间的推移而不断演变。一些已经实现,而一些可以根据当前区块链技术的发展速度来构想未来。

首先,下面讨论的三个层次最初由 Melanie Swan 在她的书《区块链,新经济的蓝图》中描述,作为基于每个类别应用程序进行分类的区块链的层次。除此之外,稍后会讨论第 X 级或第 X 代。这是作者认为当区块链技术足够先进时将成为现实的情况。

区块链 1.0

这是随比特币的发明而推出的,基本上用于加密货币。此外,由于比特币是加密货币的首次实现,因此将区块链技术的第 1 代仅归类为包括加密货币。所有替代币和比特币都属于此类别。这包括核心应用程序,如支付和应用程序。

区块链 2.0

第 2 代区块链由金融服务使用,并在此代引入合同。这包括各种金融资产,例如衍生品、期权、掉期和债券。在此级别包括超越货币、金融和市场的应用。

区块链 3.0

第 3 代区块链用于实现超越金融服务行业的应用,并且用于更普遍的行业,如政府、健康、媒体、艺术和司法。

第 X 代(区块链 X)

这是区块链单一性的愿景,有一天我们将拥有一个公共区块链服务,任何人都可以像使用谷歌搜索引擎一样使用。它将在社会的各个领域提供服务。这是一个公开的开放分布式分类帐,具有通用目的的理性代理人(Machina Economicus)在区块链上运行,做出决策并与其他智能自治代理人代表人类进行交互,并受代码而不是法律或纸质合同的监管。这将在第十三章《当前格局与未来展望》中详细阐述。

区块链类型

根据区块链在过去几年的发展方式,可以将其分为多种类型,具有不同但有时部分重叠的属性。

公共区块链

顾名思义,这些区块链对公众开放,任何人都可以参与决策过程中的节点。用户可能会或可能不会因参与而获得奖励。这些分类帐不归任何人所有,并且公开供任何人参与。所有无许可分类帐的用户都在本地节点上维护分类帐副本,并使用分布式共识机制来达成对分类帐最终状态的决定。这些区块链也被称为无许可分类帐。

私有区块链

私有区块链,顾名思义,是私有的,只对已决定共享分类帐的联合体或个人或组织开放。

半私有区块链

这里的一部分区块链是私有的,一部分是公共的。私有部分由一群人控制,而公共部分则对任何人开放参与。

侧链

更准确地称为锚定侧链,这是一个概念,代币可以从一个区块链移动到另一个区块链再移回。常见用途包括创建新的另类货币(另类加密货币),其中代币被销毁作为足够份额的证据。有两种类型的侧链。上面提到的销毁代币的例子适用于单向锚定侧链。第二种类型被称为双向锚定侧链,可以在需要时将代币从主链移动到侧链再移回主链。

许可账本

许可账本是一种区块链,其中网络的参与者是已知和已信任的。许可账本不需要使用分布式共识机制,而是可以使用协议协议来维护关于区块链记录状态的共享真相。对于许可账本,也不需要是私有的,因为它可以是一个公共区块链,但具有受监管的访问控制。

分布式账本

正如名称所示,这个账本分布在参与者中,并传播在多个站点或组织中。这种类型既可以是私有的也可以是公共的。关键点是,与许多其他区块链不同,记录是连续存储而不是分成区块。这个概念用在瑞波中。

共享账本

这是一个通用术语,用来描述任何由公众或财团共享的应用程序或数据库。

完全私有和专有的区块链

这些区块链也许没有主流应用,因为它们偏离了区块链技术的去中心化核心思想。尽管如此,在组织内的特定私人设置中,可能需要共享数据并提供数据真实性的一定程度保证。在这种情况下,这些区块链可能很有用。例如,用于各个政府部门之间的协作和数据共享。

代币化的区块链

这些区块链是通过挖矿或初始分配通过共识过程生成加密货币的标准区块链。

无代币的区块链

这些可能不是真实的区块链,因为它们缺乏价值转移的基本单元,但在不需要在节点之间传输价值的情况下,仍然在需要在各个已信任方之间共享一些数据的情况下具有价值。

在下一节中,将从区块链的角度讨论共识的概念。共识是区块链的支柱,并通过称为挖矿的可选过程,为控制权提供了去中心化。共识算法的选择也受到所使用区块链类型的影响。并非所有的共识机制都适用于所有类型的区块链。例如,在公共无许可的区块链中,使用 PoW 而不是基于权威证据的一些基本协议机制可能更合理。因此,为区块链项目恰当地选择共识算法是至关重要的。

区块链中的共识

共识基本上是分布式计算概念,它已经在区块链中用来让所有节点同意区块链网络上的真相版本。这个概念在本章早些时候的分布式系统部分已经讨论过。

大致上,共识机制存在以下两个类别:

  1. 基于证据的、基于领导者的、或者所谓的Nakamoto 共识,其中选举出一个领导者并提出一个最终值。

  2. 基于拜占庭容错的,这是一种更传统的基于投票轮次的方法。

现有或正在研究中的共识算法在区块链的上下文中将在稍后给出。这并不是一个穷尽列表,但已尝试呈现所有重要的算法。

工作量证明

这种共识机制依赖于证明足够的计算资源已经在网络中花费了,然后才能提出一个值供网络接受。这种方法被用于比特币和其他加密货币中。目前,这是唯一证明在抵御 Sybil 攻击方面取得极大成功的算法。

权益证明

这种算法基于一个节点或用户在系统中拥有足够的权益的想法;例如,用户已经在系统中投入了足够的资金,因此任何恶意尝试都会超过对系统进行攻击的利益。这个概念最初是由 Peercoin 引入的,而且将在以太坊区块链中得到应用。在权益证明PoS)中另一个重要的概念是币龄,它是从未花费的时间和数量的硬币衍生出的。在这个模型中,提议并签署下一个区块的机会与币龄成正比。

委托权益证明

委托权益证明DPOS)是一种对标准 PoS 的创新,其中每个在系统中持有权益的节点都可以通过投票来将交易验证的任务委托给其他节点。这在比特股区块链中得到应用。

时间证明

由英特尔引入,它利用受信任执行环境TEE)通过保证的等待时间在领导者选举过程中提供随机性和安全性。为了提供安全保证并确保安全,它需要英特尔的SGX软件保护扩展)处理器。这个概念在 第九章 超级账本 的上下文中更详细地讨论了英特尔 Sawtooth Lake 区块链项目。

基于存款的共识

希望参与网络的节点必须在他们提出一个区块之前提供一笔安全保证金。

重要性证明

这个想法很重要,与股权证明有所不同。重要性证明不仅仅依赖于用户在系统中拥有的股权多少,而且还通过用户对代币的使用和流动来监控建立信任和重要性的级别。这在 Nemcoin 中使用。

联邦共识或联邦拜占庭共识

在恒星共识协议中使用,该协议中的节点保持一组公开信任的对等节点,并仅传播由大多数受信任节点验证的交易。

基于声誉的机制

正如其名称所示,领导者是根据其在网络上建立的声誉而选出的。这可能是基于其他成员的投票。

实用拜占庭容错

实用拜占庭容错PBFT)实现了状态机复制,提供了对拜占庭节点的容错。除了 PBFT、PAXOS、RAFT 和联邦式拜占庭协议FBA)等其他协议外,还有许多其他协议被用于或被提议用于分布式系统和区块链的许多不同实现。

CAP 定理与区块链

奇怪的是,在区块链中似乎违反了 CAP 定理,尤其是在最成功的实现中:比特币,但事实并非如此。在区块链中,一致性被牺牲以支持可用性和分区容忍性。在这种情况下,一致性C)在区块链上并不同时实现于分区容忍性P)和可用性A),而是随着时间的推移逐渐实现。这被称为最终一致性,其中一致性是随着时间由多个节点的验证而实现的结果。为此,比特币引入了挖矿的概念;这是一个利用称为 PoW 的共识算法来促进达成共识的过程。在更高的层面上,挖矿可以被定义为一个向区块链添加更多区块的过程。

区块链的好处和局限性

行业中正在讨论区块链技术的众多好处,并由全球区块链领域的思想领袖提出。以下是前 10 个好处的列表及讨论。

去中心化

这是区块链的核心概念和优势。不需要信任的第三方或中介验证交易;相反,使用共识机制来达成对交易有效性的一致意见。

透明性和信任

由于区块链是共享的,每个人都可以看到区块链上的内容,这使得系统变得透明,从而建立了信任。在诸如资金或福利的发放情景中,应该限制个人裁量权,这更具相关性。

不可更改性

一旦数据被写入区块链,就极其难以改变。虽然它不是真正的不可改变,但由于数据的改变非常困难,几乎不可能,所以这被看作是保持不可改变交易账本的一个好处。

高可用性

由于该系统基于对等网络中的成千上万个节点,并且数据在每个节点上都得到复制和更新,因此该系统变得高度可用。即使节点离开网络或不可访问,整个网络仍在运行,因此具有高可用性。

高度安全

区块链上的所有交易都经过密码保护,具有完整性。

简化当前范式

在许多行业,例如金融或医疗部门,当前的模式相当混乱,各个实体维护自己的数据库,数据共享由于系统的零散性而变得非常困难。但是,由于区块链可以作为各方共享的单一账本,这可以通过减少管理各个实体维护的独立系统的复杂性来简化这种模式。

交易更快

在金融行业,特别是在后期交易结算功能中,区块链可以发挥重要作用,因为它不需要冗长的验证、对账和结算流程,只需一种数据的单一版本就可以在金融机构之间共享的账本上快速结算交易。

节约成本

在区块链模型中不需要第三方或结算中心,这可以大幅减少支付给结算中心或可信第三方的手续费,从而降低管理成本。

区块链技术的挑战和限制

与任何技术一样,需要解决一些挑战,才能使系统更加健壮、有用和可访问。区块链技术也不例外;事实上,学术界和行业正付出很多努力克服区块链技术带来的挑战。以下是其中一些敏感挑战的选择:

  • 可扩展性

  • 适应性

  • 规章制度

  • 技术比较不成熟

  • 隐私性

所有这些等内容将在第十三章“当前形势和未来展望”中详细讨论,并提出可能的解决方案。

本章为了便于理解,特意保持了一般性和非技术性。一旦密码学在第三章中得到详细讲解,密码学和技术基础,特定的区块链解决方案将在适当的技术深度和细节上进行讨论。

摘要

本章在高层次向读者介绍了区块链技术。首先讨论了有关分布式系统的一些基本观念,然后介绍了区块链的历史。讨论了电子现金和哈希现金等概念。此外,还介绍了不同观点对区块链的各种定义。还简要讨论了区块链技术的一些应用。接下来在本章中,介绍了不同类型的区块链。最后介绍了这项新技术的益处和局限性。出于特意,一些主题仅仅简单提及,因为它们将在本书后续章节中进行深入讨论。例如,挑战和局限性在本章中仅被提及,但没有提供细节,因为本书后面有一整章专门讨论这个问题。在下一章中,读者将被介绍去中心化的概念,这对于区块链及其众多应用的概念至关重要。

第二章:去中心化

去中心化不是一个新概念;它长期以来一直被用于战略、管理和治理。去中心化的基本思想是将控制权和权威分配到边缘,而不是让一个中央权威完全控制组织。这对组织有多种好处,例如提高效率、加快决策速度、提高动机和减轻高层管理的负担。

在本章中,将在区块链的背景下讨论去中心化的概念;两者的目标相似,即没有单一中央权威控制。还将介绍去中心化的方法以及一些示例中的去中心化路径。此外,还将详细讨论区块链生态系统的去中心化、去中心化应用程序以及去中心化平台。许多令人兴奋的应用和想法源自去中心化的区块链技术,并将在本章中介绍。

使用区块链的去中心化

去中心化是区块链技术提供的核心优势和服务。按设计,区块链是提供无需任何中介并可以通过共识机制选择许多不同领导者的完美平台。该模型允许任何人竞争成为决策权威。这种竞争受共识机制的约束,而最常用的方法被称为工作证明PoW)。

去中心化的应用程度从半去中心化到完全去中心化不等,具体取决于需求和情况。从区块链的角度看,去中心化可以被视为一种机制,提供一种方式来重新塑造现有应用程序和范例或构建新应用程序,以便完全控制用户。

信息与通信技术ICT)传统上基于中心化范式,其中数据库或应用服务器受到中央权威(如系统管理员)的控制。随着比特币和区块链技术的出现,这种模式已经改变,现在允许任何人启动一个无需任何单一失败点或单一可信任机构的分散系统的技术可用。它可以自主运行,也可以根据运行在区块链上的去中心化应用程序所使用的类型和模型的治理方式需要一些人为干预。

即将出现的图表显示了当前存在的不同类型的系统,即中心化、分布式和去中心化。这个概念最早是在 1964 年由保罗·巴兰分布式通信网络的论文中提出的,当时是在通信网络的背景下。

集中式系统是传统的(客户端–服务器)IT 系统,其中存在一个单一的控制系统的权威,完全负责系统上的所有操作。中心系统的所有用户都依赖于单一的服务来源。在线服务提供商,如 eBay、Google、Amazon、Apple 的 App Store 和其他大多数提供商,使用这种提供服务的常见模型。另一方面,在分布式系统中,数据和计算分布在网络中的多个节点上。有时,这个术语与并行计算混淆。虽然在定义上有重叠,但这两个系统之间的主要区别在于在并行系统中,所有节点同时执行计算以获得结果,而在分布式系统中,计算可能不会并行进行,并且数据仅在用户视为单个一致系统的多个节点上复制。这两种模型都会使用变体以实现故障容忍性和速度。在这个模型中,仍然有一个对所有节点具有控制权并管理处理的中央权威。这意味着系统仍然是中心化的性质。

精通区块链(一)插图

不同类型的网络/系统

分散系统与分布式系统的关键区别在于,在分布式系统中,仍然存在一个中央权威来管理整个系统,而在分散系统中,没有这样的权威存在。分散系统是一种类型的网络,其中节点不依赖于单一的主节点;相反,控制分布在许多节点之间。例如,这类似于组织中每个部门都有自己负责的数据库服务器的模型,从而夺走了中央服务器的权力,并将其分配给管理自己数据库的子部门。

在启动这一新时代的分散化应用的分散化范式中的一个真正的创新是分散化共识,这是由比特币引入的。这使用户可以通过共识算法就某事达成一致,而无需中央信任的第三方、中间人或服务提供商。

分散化的方法

有两种方法可以实现分散化。这些方法在接下来的章节中将详细讨论。

去中介化

这可以通过一个例子来解释。想象一下,你想把钱汇给另一个国家的朋友。你去一家银行,它会收取一定的费用将你的钱转给你选择的国家的银行。在这种情况下,银行维护着一个中央数据库,更新着你已经汇款的信息。利用区块链技术,可以直接把这笔钱发送给你的朋友,而无需经过银行。你只需要你朋友在区块链上的地址。这样,中间人就不再需要,通过去中介化实现了去中心化。然而,由于金融部门存在严格的监管和合规要求,去中介化对金融领域的实际可行性存在争议。尽管如此,这种模式不仅可以用于金融领域,还可以用于许多其他不同的行业。

通过竞争

在这种方法中,一组服务提供商竞争,以被系统选定为服务提供者。这种范式并不能实现完全的去中心化,但在一定程度上确保了中介或服务提供商不会垄断服务。在区块链技术的背景下,可以构想一个系统,智能合约可以根据声誉、历史评分、评价和服务质量,从众多提供者中选择外部数据提供者。这不会导致完全的去中心化,但它允许智能合约根据前述标准自由选择。这样,就在服务提供商之间培养了一种竞争的环境,他们互相竞争成为首选的数据提供者。

在下图中,展示了不同程度的去中心化。在左侧,是一个传统的方法,一个中央系统控制着;在右侧,实现了完全的去中介化;而在中间,显示了竞争中介或服务提供商。在中间,根据声誉或投票选择中介或服务提供商,从而实现了部分去中心化。

精通区块链(一)插图

去中心化的规模

尽管去中心化有很多好处——包括但不限于透明度、效率、节约成本、建立可信生态系统,以及在某些情况下隐私和匿名性——但也需要深入研究一些挑战,比如安全需求、软件错误和人为错误。例如,在像比特币或以太坊这样的去中心化系统中,安全通常由私钥提供,那么如何确保与这些私钥关联的智能资产在人为错误导致私钥丢失或者智能合约代码有漏洞导致去中心化应用容易受到攻击时不会变得无用?在我们踏上使用区块链和去中心化应用去实现去中心化的旅程之前,重要的是要明白并不是所有东西都需要(或能够)去中心化。

去中心化途径

尽管比特币或区块链之前存在的一些系统在一定程度上可以被分类为去中心化,比如比特彗星或 Gnutella 文件共享,但随着区块链技术的出现,许多举措正在被采取以利用这种新技术来实现去中心化。通常,比特币区块链是许多人的首选,因为它已经被证明是最具韧性和安全性的区块链,市值几乎达到 120 亿美元。另一种方法是使用其他区块链,比如以太坊,它目前是许多开发人员构建去中心化应用的首选工具。

如何去中心化

阿尔温德·纳拉亚南和其他人提出了一个框架,可以用于评估在区块链技术背景下各种事物的去中心化需求。该框架基本上提出了四个问题,一旦回答,就能清晰地了解一个系统如何能够去中心化。这些问题列举如下:

  1. 被去中心化的是什么?

  2. 需要什么级别的去中心化?

  3. 使用了哪种区块链?

  4. 使用了哪种安全机制?

第一个问题简单地询问了要去中心化的系统是什么。这可以是任何系统,例如身份系统或交易系统。下一个问题可以通过确定所需的去中心化级别来回答,可以查看前面讨论的去中心化规模。可以是完全的去中介化或部分的去中介化。第三个问题非常直接,开发人员可以根据特定应用选择哪种区块链合适。可以是比特币区块链、以太坊区块链或任何其他适合特定应用的区块链。最后,需要回答一个关键问题,即如何保证去中心化系统的安全机制。可以是原子性,例如,要么交易完全执行,要么根本不执行。换句话说,要么全有,要么全无。这确保了系统的完整性。其他机制可能包括声誉,它允许在系统中存在不同程度的信任。

示例

在本节中,提供了应用上述框架的示例。

在第一个示例中,选择了一个需要去中心化的资金转移系统。在这种情况下,可以回答前面提到的四个问题以评估去中心化的需求。答案如下所示:

  1. 答案 1:资金转移系统。

  2. 答案 2:去中介化。

  3. 答案 3:比特币。

  4. 答案 4:原子性。

通过回答这四个问题,可以展示支付系统如何实现去中心化。根据前面的答案,可以说通过去除中介,可以将资金转移系统去中心化,并将其实施在比特币区块链上,通过原子性提供安全保障。

类似地,这个框架可以用于需要进行去中心化评估的任何其他系统。通过回答这四个简单的问题,可以很清楚地了解可以采取什么方法来去中心化系统。

区块链和完全的生态系统去中心化

为了实现完全去中心化,有必要使区块链周围的环境也去中心化。区块链本身是在传统系统之上运行的分布式分类帐。这些元素包括存储、通信和计算。还有其他因素,如身份和财富,传统上基于中心化范式,有必要也去中心化这些方面,以实现完全去中心化的生态系统。

存储

数据可以直接存储在区块链中,通过这种方式实现了去中心化,但这种方法的一个主要缺点是,区块链设计上不适合存储大量数据。它可以存储简单的交易和一些任意数据,但显然不适合存储图像或大量数据块,就像传统数据库系统中的情况一样。一个更好的替代方案是使用分布式哈希表DHTs)。DHT 最初用于点对点文件共享软件,如 BitTorrent、Napster、Kazaa 和 Gnutella。DHT 研究由 CAN、Chord、Pastry 和 Tapestry 项目推广。BitTorrent 最终成为最可扩展和快速的网络,但问题在于用户没有动机永久保留文件。用户通常不会永久保留文件,如果节点离开了需要某些数据的网络,除非必需的节点重新加入网络,否则无法检索数据,以便文件再次变为可用。这里的两个主要要求是高可用性和链接稳定性,这意味着数据应在需要时可用,并且网络链接也应始终可访问。由 Juan Benet 创立的星际文件系统IPFS)具有这两个属性,并且其愿景是通过替换 HTTP 协议来提供一个去中心化的全球网络。IPFS 使用 Kademlia DHT 和 merkle DAG有向无环图)分别提供存储和搜索功能。

激励机制基于一个名为 Filecoin 的协议,该协议向使用 BitSwap 机制存储数据的节点支付激励。BitSwap 机制允许节点在一对一的关系下保持字节发送或接收的简单分类帐。此外,IPFS 使用基于 Git 的版本控制机制来提供对数据版本的结构化和控制。

还有其他选择,例如以太坊的 Swarm、storj 和 maidsafe。以太坊有其自己的去中心化和分布式生态系统,使用 Swarm 进行存储,使用 whisper 协议进行通信。Maidsafe 的目标是提供一个去中心化的全球网络。这些项目将在本书中详细讨论。

BigChainDB 是另一个旨在提供可扩展、快速和线性可扩展的去中心化数据库,而不是传统文件系统的存储层去中心化项目。BigChainDB 是去中心化处理平台和文件系统(如以太坊和 IPFS)的补充。

通信

通常认为互联网(区块链中的通信层)是去中心化的。这在某种程度上是正确的,因为互联网的最初愿景是开发一个去中心化系统。诸如电子邮件和在线存储等服务现在都是基于服务提供商控制用户信任他们在需要时提供服务的范式。这种模式是基于中央权威(服务提供商)的信任,用户无法控制自己的数据;甚至密码都存储在可信的第三方系统上。有必要以某种方式为个人用户提供数据控制,使他们的数据访问得到保证,不依赖于单一第三方。访问互联网(通信层)是基于充当互联网用户中心的互联网服务提供商(ISP)。如果 ISP 出于政治或其他原因关闭,那么在这种模型中就无法进行通信。一种替代方案是使用 mesh 网络。虽然与互联网相比,它们的功能受到限制,但它们仍然提供了一个去中心化的选择,节点之间可以直接通信,而不需要像 ISP 那样的中心枢纽。

注意

Meshnet 的一个例子是 Firechat(www.opengarden.com/firechat.html),它允许 iPhone 用户在没有互联网的情况下以点对点的方式直接进行通信。

现在想象一种网络,允许用户控制他们的通信;没有人能够出于政治或审查原因关闭它。这可能是区块链生态系统中去中心化通信网络的下一个步骤。需要指出的是,这种模式可能只在互联网受到政府审查和控制的司法管辖区才必需。

正如之前所提到的,互联网的最初愿景是构建去中心化的网络;然而,多年来,随着谷歌、亚马逊和 eBay 等大型服务提供商的出现,控制权正在转移向大玩家。例如,电子邮件在本质上是一个去中心化的系统;任何人都可以轻松运行电子邮件服务器,并开始发送和接收电子邮件,但现在已经有了更好的选择,为最终用户提供了托管服务,因此人们自然倾向于选择集中式服务,因为它更方便、免费。然而,免费服务是以个人数据为代价提供的,许多用户并不知晓这一事实。这是一个例子,显示了互联网是如何向中心化发展的。区块链再次向世界展示了这种去中心化的愿景,现在正在做出共同努力来利用这项技术,并获得它所能提供的好处。

计算

通过类似以太坊的区块链技术,实现了计算或处理的去中心化,其中嵌入了业务逻辑的智能合约可以在网络上运行。其他区块链技术也提供类似的处理层平台,在这些平台上业务逻辑可以以去中心化的方式运行。

以下图表展示了去中心化生态系统的概述,在底层,互联网或 Meshnets 提供了去中心化的通信层,然后存储层使用 IPFS 和 BigChainDB 等技术来实现去中心化,最后,你可以看到作为去中心化处理层的区块链。区块链在有限的情况下也可以提供存储层,但这严重阻碍了系统的速度和容量;因此,其他解决方案,如 IPFS 和 BigChainDB 更适合以去中心化方式存储大量数据。顶部显示了身份和财富层。互联网上的身份是一个非常重要的话题,诸如 bitAuth 和 OpenID 等系统已经提供了具有不同程度的去中心化和安全性假设的身份验证和识别服务。

区块链有能力为各种问题提供解决方案。一个称为Zooko’s Triangle的与身份有关的概念要求,网络协议中的命名系统必须安全、去中心化,并对人类有意义。人们猜想一个系统只能同时具有这些属性中的两个,但是随着区块链技术的出现,以 Namecoin 的形式,这个问题得到了解决。然而,这并不是万能药,并伴随着自己的挑战,比如依赖用户安全地存储和维护私钥。这引发了关于去中心化适用性的其他一般性问题。也许去中心化并不是在每种情况下都合适。著名的集中化系统在许多情况下往往效果更好。

精通区块链(一)插图

目前有许多正在进行的项目正在开发更广泛分布的区块链系统的解决方案。

随着去中心化范式的出现,不同的术语和流行词现在出现在媒体和学术文献中。随着区块链技术的出现,现在可以构建传统实体组织的软件版本。在去中心化的背景下,即将到来的概念值得讨论。

智能合约

智能合约可以被看作是一个小型的去中心化程序。智能合约不一定需要区块链来运行;但是,由于区块链技术提供的安全性优势,现在几乎成为了将区块链作为智能合约的去中心化执行平台的标准。智能合约通常包含一些业务逻辑和少量数据。区块链中的参与者或参与者可以使用这些智能合约,或者它们可以代表网络参与者自主运行。

这些小程序存储在区块链上,如果满足某些特定标准就执行业务逻辑。关于智能合约的更多信息将在第六章 中提供,智能合约,这是专门讨论智能合约的详细章节。

分散化组织

分散化组织 (DOs)是在区块链上运行的软件程序,基于真实人类组织与人员和协议的理念。一旦以智能合约或一组智能合约的形式添加到区块链上,它就变得分散化,各方根据 DO 软件中定义的代码彼此交互。

分散自治组织

与 DOs 类似,分散自治组织 (DAO)也是一个在区块链上运行的计算机程序,其中嵌入了治理和业务逻辑规则。DAO 和 DO 基本上是相同的,但主要区别在于 DAO 是自主的,这意味着它们是完全自动化的,并包含人工智能逻辑,而 DO 缺乏这一特征,依赖于人为输入以执行业务逻辑。

以太坊区块链率先引入了 DAO(分散自治组织)的概念。在 DAO 中,代码被视为治理实体,而不是人类或纸质合同。然而,策展人 作为维护此代码并作为社区提案评估者的人类实体参与其中。如果从代币持有人(参与者)处获得足够的输入,DAO 有能力聘请外部承包商。最著名的 DAO 项目是The DAO (daohub.org),因为它在众筹阶段筹集了 1.68 亿美元。DAO 项目旨在成为一家风险投资基金,旨在提供无单一实体所有权的分散化商业模式。不幸的是,由于 DAO 代码中的漏洞,这一项目被黑客攻击,并有价值数百万美元的以太币 (ETH)被转移至黑客创建的子 DAO 中。为了扭转黑客攻击的影响并启动资金恢复,以太坊区块链需要进行硬分叉。这一事件引发了关于智能合约中代码安全性、质量和彻底测试的辩论,以确保完整性和充分控制。目前正在进行一些项目,特别是在学术界,旨在规范化智能合约编码。

目前,尽管 DAO 可能包含一些智能代码来执行一些协议和条件,但这些规则在当前现实世界的法律体系中没有价值。也许有一天,一个由执法机构或监管机构委托和允许,包含规则和法规的自治 代理可以嵌入到 DAO 中,以确保 DAO 的完整性从法律和合规的角度来看。自治代理AA)是一种无需人类干预就能运行的代码。DAO 纯粹是分散化的实体,这样便能在任何物理司法管辖区内运行。因此,它们对于当前的法律体系如何应对各种不同司法管辖区和地理位置的混合提出了一个重要问题。

去中心化自治公司

DAOs去中心化自治公司DACs)是一个类似的概念,但被认为是 DAO 的一个较小的子集。DACs 和 DAOs 的定义有时会重叠,但一个一般的区别是 DAO 通常被认为是非盈利的,而 DACs 可以通过向参与者提供股份以及支付股息而赚钱。这些公司可以根据其中编程的逻辑自动运行业务,无需人类干预。

去中心化自治社会

去中心化自治社会DASs)是一个概念,整个社会可以在区块链上运行,借助于多个复杂的智能合约和 DAO 和去中心化应用程序DAPPs)的组合自主运行。这种模式并不意味着一种非法的做法,也不是基于完全的自由主义意识形态;相反,政府提供的许多服务可以通过区块链来交付,例如政府身份证系统、护照发行以及不动产、婚姻和出生记录。另一种理论是,如果一个政府腐败,中心化的系统无法提供社会所需的令人满意的信任水平,那么社会可以在区块链上启动自己的虚拟社会,由分散式的共识驱动,并且是透明的。这可能被视为自由主义者或密码朋克的梦想,但在区块链上是完全可能的。

去中心化应用

前面提到的所有想法都属于更大的去中心化应用的范畴。所有 DAO、DAC 和 DO 基本上都是在点对点网络的区块链上运行的去中心化应用程序。这是关于去中心化的科技的最新进展。去中心化应用程序或 DAPP 是可以在自己的区块链上运行、使用已有的区块链,或者仅仅使用现有的区块链解决方案的协议的软件程序。这些分别称为 Type I、Type II 和 Type III DAPP。

去中心化应用的要求

要使应用程序被视为去中心化应用程序,必须满足以下标准。此定义由大卫·约翰斯顿和其他人在他们的白皮书*《去中心化应用程序的一般理论,Dapps》*中提供:

  1. DAPP 应该是完全开源和自治的,没有单个实体应该控制大部分其代币。所有对应用程序的更改都必须是基于社区反馈的共识驱动的。

  2. 应用程序的数据和操作记录必须经过加密保护,并存储在公共的、去中心化的区块链上,以避免任何中心化故障点。

  3. 应用程序必须使用加密令牌,以便为那些为应用程序贡献价值的人提供访问权限和奖励,例如比特币中的矿工。

  4. 代币必须由去中心化应用程序根据标准的加密算法生成。这种代币的生成充当了对贡献者(例如矿工)价值的证明。

DAPP 的操作

DAPP 可以通过工作证明和股权证明等共识算法建立共识。到目前为止,只有 PoW 被发现对 51%攻击具有极强的抵抗力,正如比特币所示。此外,DAPP 可以通过挖矿、筹款和开发来分发代币(硬币)。

示例

这里提供了一些去中心化应用程序的示例。

KYC-Chain

该应用程序提供了一种基于智能合约,以安全和便捷的方式管理了解你的客户KYC)数据的功能。

OpenBazaar

这是一个去中心化的点对点网络,允许卖家和买家直接进行商业活动,而不依赖于中心方,与传统提供商如 eBay 和亚马逊相反。值得注意的是,这个系统不是建立在区块链之上的;相反,分布式哈希表在点对点网络中被用来实现直接的通信和数据共享。它利用比特币作为支付网络,然而。

Lazooz

这是 Uber 的去中心化等价物。它允许点对点的共享乘车,用户可以通过运动证明获得激励,并赚取 Zooz 币。

注意

还有许多其他建立在以太坊区块链上的 DAPP,并在dapps.ethercasts.com/展示。

去中心化平台

现在有许多可用的去中心化平台。全球许多公司推出了承诺为用户提供简单、可访问和安全的分布式应用程序开发的平台。这里讨论了一些重要的名字。

以太坊

以太坊排名首位,因为它是第一个引入图灵完备语言和虚拟机概念的区块链。与比特币和许多其他加密货币中有限的脚本语言形成对比。有了名为 Solidity 的这种图灵完备语言的支持,为去中心化应用程序的开发打开了无尽的可能性。这是由Vitalik Buterin于 2013 年提出的,并提供了一个用于开发智能合约和去中心化应用程序的公共区块链。以太坊上的货币代币被称为以太币。

Maidsafe

Maidsafe 提供了一个名为SAFESecure Access for Everyone)的网络,由未使用的计算资源,如存储、处理能力和其用户的数据连接组成。网络上的文件被分成小块数据,这些数据被加密并随机分布在整个网络中。只有相应所有者才能检索这些数据。一个关键的创新是网络上的重复文件会被自动拒绝,这有助于减少管理负载所需的额外计算资源。它使用 Safecoin 作为激励其贡献者的代币。

Lisk

Lisk 是一个区块链应用程序开发和加密货币平台。它允许开发人员使用 JavaScript 构建去中心化应用程序,并将它们托管在自己的各自的侧链中。Lisk 使用委托权益证明DPOS)机制来进行共识,可以选举 101 个节点来保护网络并提出区块。它使用 Node.js 和 JavaScript 后端,而前端允许使用标准技术,如 CSS3、HTML5 和 JavaScript。Lisk 使用 LSK 代币作为区块链上的货币。Lisk 的另一个衍生品是 Rise,它是一个基于 Lisk 的去中心化应用程序和数字货币平台。它更注重系统的安全性。

对这些平台和其他平台的更实用的介绍将在后续章节中提供。

总结

本章介绍了去中心化的概念,这是区块链技术提供的核心服务。虽然去中心化的概念并非新鲜事物,但在区块链世界中重新获得了重要意义。因此,最近推出了基于去中心化架构的各种应用程序。本章首先介绍了去中心化的概念。接下来,从区块链角度讨论了去中心化。此外,还介绍了区块链生态系统中不同层面的去中心化相关的思想。随着区块链技术和区块链角度的去中心化的出现,出现了一些新概念和术语,比如 DAOs、DAPPs 和其它一些。本章还介绍了这些术语的概念。最后,讨论了一些去中心化应用程序,并给出了一些例子。在下一章中,将介绍理解区块链生态系统的基本概念。主要介绍了密码学,这为区块链技术提供了关键的基础。

第三章 密码学与技术基础

在本章中,你将介绍密码学的概念、理论和实践方面。将更加关注在区块链技术背景下特别相关的方面。此外,还将讨论来自金融市场的概念,以便为后续章节中涵盖的材料提供基础。

你还将了解密码算法的实际实现,以便你可以亲身体验密码功能。为此,使用了OpenSSL命令行。

在开始理论基础之前,下一节将讨论 OpenSSL 的安装,这样你就可以在阅读理论材料的同时进行一些实际工作。

在 Ubuntu Linux 发行版上,OpenSSL 通常已经可用;但是,也可以使用以下命令进行安装:

$ sudo apt-get install openssl

在接下来的章节中,首先将讨论理论基础,然后介绍相关的实际实验。

介绍

密码学是在对手存在的情况下使信息安全的科学。它提供了一种在假定对手拥有无限资源的情况下进行安全通信的手段。密码用于加密数据,以便如果被对手拦截,数据对他们来说是毫无意义的,除非进行解密,这需要秘密密钥。

密码学通常用于提供保密服务。单独使用时,它不能被视为一个完整的解决方案,但在更大的安全系统中作为一个重要的构建模块来解决安全问题。

密码学提供了各种安全服务,例如机密性,完整性,认证(实体认证和数据起源认证)和不可否认性。此外,在各种安全系统中还需要责任制。

在进一步讨论密码学之前,首先需要解释一些数学术语和概念,以便完全理解本章后面提供的材料。下一节介绍了这些概念。值得注意的是,本节旨在作为基础介绍。对于所有这些术语的解释和相关背景的证明将需要相当复杂的数学,这超出了本书的范围。关于这些主题的更多细节可以在任何标准的数论、代数或密码学教科书中找到。

数学

由于密码学的主题是基于数学的,本节将介绍一些基本概念,这些概念将帮助你理解本章后面的概念。

集合

集合是一组不同的对象,例如,X= {1, 2, 3, 4, 5}

群组

群是一种带有一个操作的可交换集合,该操作将集合的两个元素组合在一起。群操作是封闭的,并且与定义的单位元素相关联。此外,集合中的每个元素都有逆元。封闭(闭合)意味着,例如,元素 A 和 B 在集合中,对这些元素执行操作后得到的结果元素也在集合中。结合性意味着元素的分组不会影响操作的结果。

域是一个包含加法和乘法群的集合。更准确地说,集合中的所有元素形成加法和乘法群。它满足特定的加法和乘法公理。对于所有群操作,还应用了分配律。该定律规定,即使重新排列任何项或因子,也将产生相同的和或乘积。

有限域

有限域是具有有限元素集合的域。这些结构也称为伽罗华域,在密码学中特别重要,因为它们可以用于生成算术运算的准确和无误结果。例如,素有限域用于椭圆曲线密码学中构建离散对数问题。

这是一个域中的元素数量。也称为域的基数。

素域

这是一个有着素数个元素的有限域。它具有特定的加法和乘法规则,域中每个非零元素都有逆元。加法和乘法运算是模 p 来执行的。

如果阿贝尔群上可以定义多个操作,那么该群就变成了环。还有一些需要满足的属性。环必须具有封闭、结合和分配属性。

循环群

循环群是一种可以由称为群生成元的单个元素生成的群。换句话说,如果对群中的特定元素重复应用群操作,则可以生成群中的所有元素。

阿贝尔群

当集合中元素的操作是可交换的时,形成了阿贝尔群。交换律基本上意味着更改元素的顺序不会影响操作的结果,例如,A X B = B X A

模算术

在模算术中也称为时钟算术,当数字达到一定的固定数值时,会重新开始。这个固定数值是一个称为模数的正数,所有运算都是根据这个固定数值进行的。类比于时钟,有从 1 到 12 的数字。当数字达到 12 时,数字 1 重新开始。换句话说,这种算术处理的是除法操作后的余数。例如,50 mod 11 是 6,因为 50 / 11 的余数是 6。

这完成了对一些数学概念的基本介绍;在下一节中,您将介绍密码学。

密码学

正如前面讨论的,密码学提供了各种安全服务,这些安全服务将在这里讨论。

机密性

机密性是确保信息仅对授权实体可用的保证。

完整性

完整性是确保信息仅由授权实体可修改的保证。

身份验证

身份验证提供了有关实体身份或消息有效性的保证。这里讨论了两种类型的身份验证。

实体认证

实体认证是确保实体当前参与并活跃在通信会话中的保证。传统上,用户被分配一个用户名和密码,用于访问他们正在使用的平台。这称为单因素身份验证,因为只有一个因素,即你所知道的东西,也就是密码和用户名。由于各种原因,比如密码泄露,这种类型的身份验证并不是很安全;因此,现在通常使用额外的因素来提供更好的安全性。对用户身份识别使用额外技术的方式称为多因素身份验证或两因素身份验证(如果只使用两种方法)。如果使用超过两个因素进行身份验证,则称为多因素身份验证。以下是描述的各种因素:

  1. 第一个因素是你所拥有的东西,比如硬件令牌或智能卡。在这种情况下,用户可以使用硬件令牌以及登录凭据来访问系统。这提供了双因素身份验证的保护。拥有硬件令牌并知道登录凭据的用户将能够访问系统。必须同时具备两个因素才能访问系统,从而使该方法成为双因素身份验证机制。

  2. 第二个因素是你是什么,它使用生物特征来识别用户。在这种方法中,用户使用指纹、视网膜、虹膜或手形等生物特征来提供额外的身份验证因素。这样,可以确保用户确实在身份验证机制中出现,因为生物特征是一个人独特的。然而,需要谨慎实施以确保高水平的安全性,因为一些研究表明,在某些情况下,生物特征系统可以被规避。

数据来源认证

也称为消息认证,这是确保信息来源已验证的保证。数据来源认证意味着数据完整性,因为如果一个来源得到证实,那么数据必须没有被修改。最常用的是各种方法,比如消息认证码MACs)和数字签名。这些术语将在本章后面详细解释。

不可否认

不可否认是确保实体不能通过提供无法伪造的证据来否认先前承诺或行动的保证。它是一种提供无法伪造的证据表明特定行动已发生的安全服务。在有争议的情况下,这一属性非常必要,例如,当一个实体否认在电子商务系统上下订单时。该服务在电子交易中生成加密证据,以便在争议情况下,可以用作行动的确认。多年来,不可否认一直是一个活跃的研究领域。电子交易中的争议是一个常见问题,需要解决这些问题以提高消费者对服务的信心水平。

不可否认协议通常在通信网络中运行,并用于提供一个实体(发起者或接收者)在网络上采取了行动的证据。在这种情况下,有两种通信模型可以用于将消息从发起者A传输到接收者B

  1. 消息直接从发起者A发送到接收者B

  2. 消息从发起者A发送到交付代理,然后将消息交付给接收者B

不可否认协议的主要要求是公平性、有效性和及时性。在许多场景中,与仅涉及两方的情况不同,一个交易中涉及多个参与者。例如,在电子交易系统中,可能有许多实体,如清算代理、经纪人和交易者参与单个交易。在这种情况下,两方不可否认协议是不合适的。为解决这个问题,已经开发了多方不可否认协议MPNR)。

账户责任制

账户责任制是确保影响安全性的行动可以追溯到负责方的保证。这通常由系统中的日志记录和审计机制提供,在需要详细审计的业务性质的系统中,例如,在电子交易系统中。详细的日志记录对于追溯实体的行动至关重要,例如,当一笔交易在带有日期和时间戳的审计记录中放置,并且实体的身份生成并保存在日志文件中时。该日志文件可以选择加密,并且可以是数据库的一部分或系统上的独立 ASCII 文本日志文件。

密码原语

密码原语是安全协议或系统的基本构建模块。在下一节中,您将介绍用于构建安全协议和系统的必要的密码算法。安全协议是通过利用适当的安全机制来实现所需的安全目标所采取的一系列步骤。

不同类型的安全协议正在使用,例如认证协议不可否认协议密钥管理协议

下图显示了一个通用的密码学模型:

精通区块链(一)插图

显示通用加密和解密模型的模型

在上图中,PECD分别表示明文、加密、密文和解密。此外,基于先前显示的模型,值得解释各种概念,如实体、发送方、接收方、对手、密钥和信道。

  • 实体:它可以是发送、接收或对数据执行操作的人或系统

  • 发送方:发送方是传输数据的实体

  • 接收方:接收方是接收数据的实体

  • 对手:这是试图规避安全服务的实体

  • 密钥:密钥是用于加密或解密数据的一些数据

  • 信道:信道提供了实体之间的通信介质

密码学主要分为两类,即对称加密和非对称加密。

对称密码学

对称密码学是一种加密类型,其中用于加密数据的密钥与解密数据的密钥相同,因此也被称为共享密钥密码学。在通信双方之间进行数据交换之前,必须建立或同意密钥。这就是它也被称为秘密密钥密码学的原因。

对称密码学有两种类型,流密码和块密码。数据加密标准DES)和高级加密标准AES)是常见的块密码示例,而 RC4 和 A5 是常用的流密码。

流密码

这些密码是加密算法,使用密钥流逐位对明文进行加密。有两种类型的流密码:同步和异步。同步流密码是仅密钥取决于密钥的流密码,而异步流密码的密钥流也取决于加密数据。

在流密码中,加密和解密基本上是相同的函数,因为它们都是简单的模 2 加法或 XOR 操作。流密码中的关键要求是密钥流的安全性和随机性。已经开发了各种技术来生成随机数,所有密钥生成器都必须具有密码学安全性:

精通区块链(一)插图

流密码的操作

块密码

这些是将要加密的文本(明文)分成固定长度的块并逐块应用加密的加密算法。块密码通常是使用称为费斯泰尔密码的设计策略构建的。最近的块密码,如 AES(Rijndael),是使用称为替代-置换网络SPN)的替代和置换的组合构建的。

费斯特尔密码是基于霍斯特·费斯特尔开发的结构,这个结构是基于将多轮重复操作结合起来以实现称为混淆和扩散的可取的密码属性的想法。费斯特尔网络通过将数据分成两个块(左和右)并通过带键的轮函数处理这些块来操作。

混淆使得密文与明文之间的关系复杂化。这是通过实践中的替换来实现的。例如,明文中的 ‘A’ 被加密文本中的 ‘X’ 替换。在现代密码算法中,替换是使用称为 S 盒的查找表执行的。扩散属性在加密数据上统计性地传播明文,这确保即使在输入文本中改变了一个比特,也会导致至少一半(平均)的比特在密文中改变。混淆是为了使得即使使用相同的密钥创建了许多加密和解密数据对,也很难找到加密密钥。在实践中,这是通过转位或排列来实现的。

使用费斯特尔密码的一个关键优势是加密和解密操作几乎是相同的,并且只需要对加密过程进行反转即可实现解密。DES 是费斯特尔密码的一个主要示例:

精通区块链(一)插图

分组密码的简化操作

分组密码的各种操作模式为电子密码本ECB)、密码块链接CBC)、输出反馈模式OFB)或计数器模式CTR)。这些模式用于指定加密函数应用于明文的方式。这些模式将在本节的后面进行解释,但在这里先介绍前四种分组密码加密模式的分类。

分组加密模式

在这种模式下,明文被分成固定长度的块,具体取决于所使用的密码类型,然后在每个块上应用加密函数。

密钥流生成模式

在这种模式下,加密函数生成一个密钥流,然后与明文流进行异或运算,以实现加密。

消息认证模式

在这种模式下,通过加密函数计算消息认证码。MAC 基本上是一个提供完整性服务的密码校验和。使用分组密码生成 MAC 的最常见方法是 CBC-MAC,其中链的最后一个块的某些部分被用作 MAC。

密码哈希

哈希函数基本上用于将消息压缩为固定长度的摘要。在这种模式下,分组密码被用作压缩函数,以产生明文的哈希。

讨论了最常见的分组加密模式。

电子密码本

这是一种基本的操作模式,其中加密数据是通过将加密算法分别应用于每个明文块而产生的。这是最简单的模式,但不应在实践中使用,因为它是不安全的,可能会泄露信息:

精通区块链(一)插图

电子码本模式用于区块密码

密码块链

在这种模式下,每个明文块都与前一个加密块进行异或运算。CBC 模式使用初始化向量 IV 来加密第一个块。建议随机选择 IV:

精通区块链(一)插图

密码块链模式

计数器模式

CTR 模式有效地将块密码用作流密码。在这种情况下,提供了一个唯一的 nonce,它与计数器值连接起来以产生一个密钥流

精通区块链(一)插图

计数器模式

还有其他模式,如密码反馈模式CFB)、Galois 计数器模式GCM)和输出反馈模式,也被用于各种场景中。

在下一节中,您将介绍目前主要的区块密码 AES 的设计和机制。首先,将介绍关于导致新 AES 标准开发的数据加密标准(DES)的一些历史。

数据加密标准(DES)

DES 是由美国国家标准与技术研究院NIST)作为加密的标准算法引入的,并且在 1980 年代和 1990 年代主要使用,但它并没有被证明对抗暴力攻击很有抵抗力,这是由于技术和密码学研究的进步。特别是在 1998 年 7 月,电子前沿基金会EFF)使用专用机器破解了 DES。DES 使用的密钥只有 56 位,这引起了一些担忧。这个问题在引入三重 DES3DES)时得到了解决,它提议使用三个 56 位密钥和相同数量的 DES 算法执行,从而几乎使暴力攻击变得不可能。但是其他限制,如性能慢和 64 位的块大小,是不可取的。

高级加密标准(AES)

在 2001 年的一次公开竞赛之后,由密码学家Joan DaemenVincent Rijmen发明的加密算法 Rijndael 被 NIST 在 2001 年进行了轻微修改后标准化为 AES。到目前为止,还没有发现比暴力方法更好的对 AES 的攻击。原始的 Rijndael 允许使用不同的密钥和块大小,如 128 位、192 位和 256 位,但在 AES 标准中,只允许使用 128 位的块大小。然而,允许使用 128 位、192 位和 256 位的密钥大小。

AES 步骤

在 AES 算法处理期间,一个称为 state 的 4×4 字节数组使用多轮进行修改。完整的加密需要 10 到 14 轮,具体取决于密钥的大小。以下表格显示了密钥大小和所需轮数:

精通区块链(一)插图

一旦状态用密码的输入初始化,就会在四个阶段执行四个操作以加密输入。这些阶段是 AddRoundKeySubBytesShiftRowsMixColumns

  1. AddRoundKey 步骤中,状态数组与从主密钥派生的子密钥进行异或。

  2. 这是替换步骤,其中使用查找表(S-盒)来替换状态数组的所有字节。

  3. 此步骤用于以循环递增的方式将状态数组中除第一行之外的每一行向左移位。

  4. 最后,在这一步中,所有字节都以列方式线性混合。

前述步骤描述了一轮 AES。在最后一轮(根据密钥大小为 10、12 或 14 轮),第 4 阶段被替换为 Addroundkey,以确保前三步不能简单地被反转回去:

精通区块链(一)插图

AES 块图,显示第 1 轮,最后一轮混合步骤不执行

各种加密货币钱包使用 AES 加密来加密本地存储的数据。特别是在比特币钱包中,使用 AES 256 且采用 CBC 模式。

使用 AES 进行加密和解密的 OpenSSL 示例
:~/Crypt$ openssl enc -aes-256-cbc -in message.txt -out message.bin
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
:~/Crypt$ ls -ltr
total 12
-rw-rw-r-- 1 drequinox drequinox 14 Sep 21 05:54 message.txt
-rw-rw-r-- 1 drequinox drequinox 32 Sep 21 05:57 message.bin
:~/Crypt$ cat message.bin

精通区块链(一)插图

请注意 message.bin 是一个二进制文件;有时,将此二进制文件编码为文本格式以确保兼容性/互操作性是可取的。可以使用以下命令来执行此操作:

:~/Crypt$ openssl enc -base64 -in message.bin -out message.b64
:~/Crypt$ ls -ltr
-rw-rw-r-- 1 drequinox drequinox 14 Sep 21 05:54 message.txt
-rw-rw-r-- 1 drequinox drequinox 32 Sep 21 05:57 message.bin
-rw-rw-r-- 1 drequinox drequinox 45 Sep 21 06:00 message.b64
:~/Crypt$ cat message.b64
U2FsdGVkX193uByIcwZf0Z7J1at+4L+Fj8/uzeDAtJE=
:~/Crypt$

要解密 AES 加密的文件,可以使用以下命令。从前面示例中获取 message.bin 的示例:

:~/Crypt$ openssl enc -d -aes-256-cbc -in message.bin -out message.dec
enter aes-256-cbc decryption password:
:~/Crypt$ ls -ltr
-rw-rw-r-- 1 drequinox drequinox 14 Sep 21 05:54 message.txt
-rw-rw-r-- 1 drequinox drequinox 32 Sep 21 05:57 message.bin
-rw-rw-r-- 1 drequinox drequinox 45 Sep 21 06:00 message.b64
-rw-rw-r-- 1 drequinox drequinox 14 Sep 21 06:06 message.dec
:~/Crypt$ cat message.dec
datatoencrypt
:~/Crypt$

敏锐的读者可能已经注意到,尽管在除 ECB 之外的所有块加密操作模式中都需要提供初始化向量,但未提供初始化向量。原因是 OpenSSL 会自动从给定的密码中派生初始化向量。用户可以使用开关指定初始化向量:

-K/-iv    ,  (Initialization Vector) should be provided in Hex.

要解码 base64,使用以下命令。从前面示例中获取 message.b64 文件:

:~/Crypt$ openssl enc -d -base64 -in message.b64 -out message.ptx
:~/Crypt$ ls -ltr
-rw-rw-r-- 1 drequinox drequinox 14 Sep 21 05:54 message.txt
-rw-rw-r-- 1 drequinox drequinox 32 Sep 21 05:57 message.bin
-rw-rw-r-- 1 drequinox drequinox 45 Sep 21 06:00 message.b64
-rw-rw-r-- 1 drequinox drequinox 14 Sep 21 06:06 message.dec
-rw-rw-r-- 1 drequinox drequinox 32 Sep 21 06:16 message.ptx

精通区块链(一)插图

OpenSSL 支持许多类型的密码;您可以根据前面提供的示例来探索这些选项。以下屏幕截图显示了支持的密码类型列表:

精通区块链(一)插图

屏幕截图显示了 OpenSSL 中可用的丰富库选项。

非对称密码学

非对称密码学是一种加密技术,其中用于加密数据的密钥与用于解密数据的密钥不同。也称为公钥密码学,它使用公钥和私钥分别加密和解密数据。目前使用各种非对称加密方案,如 RSA、DSA 和 El-Gammal。

下图显示了公钥密码学的概述:

精通区块链(一)插图

使用公钥/私钥进行加密解密

图解释了发送方如何使用接收方的公钥加密数据,然后通过网络传输到接收方。一旦到达接收方,就可以使用接收方的私钥对其进行解密。这样,私钥保留在接收方,不需要共享密钥来执行加密和解密,这与对称加密的情况不同。

另一个图表显示了如何使用公钥密码学来验证接收方接收到的消息的完整性。在这个模型中,发送方使用其私钥对数据进行签名,并将消息传输到接收方。一旦消息在接收方接收到,就可以使用发送方的公钥验证其完整性。请注意,此模型不执行加密。此模型仅用于消息认证和验证目的:

精通区块链(一)插图

公钥密码签名方案模型

公钥密码系统提供的安全机制包括密钥建立、数字签名、身份验证、加密和解密。

密钥建立机制涉及设计允许在不安全通道上设置密钥的协议。数字签名可以提供不可否认的服务,这在许多场景中是一种非常理想的属性。有时,不仅要对用户进行身份验证,还要识别参与交易的实体;这也可以通过数字签名和挑战-响应协议的组合来实现。最后,提供机密性的加密机制也可以使用公钥密码系统来实现,例如 RSA、ECC 或 El-Gammal。

与对称密钥算法相比,公钥算法在计算上较慢。因此,它们不常用于加密大文件或需要加密的实际数据。它们通常用于交换对称算法的密钥,一旦密钥安全建立,就可以使用对称密钥算法加密数据。

公钥密码算法基于各种基础数学问题。这里描述了三个主要的非对称算法家族。

整数因子化

这些方案基于大整数的因子化是非常困难的事实。RSA 是这种类型算法的主要示例。

离散对数

这基于模算术中的一个问题,即计算模函数的结果很容易,但计算生成器的指数在计算上是不可行的。换句话说,从结果找到输入非常困难。这是一个单向函数。

例如,考虑以下方程式:

3^(2 )mod 10 = 9

现在给定 9,找到 2,生成器 3 的指数非常困难。这个难题通常用于迪菲-赫尔曼密钥交换和数字签名算法。

椭圆曲线

这基于先前讨论的离散对数问题,但是在椭圆曲线的背景下。椭圆曲线是一个代数立方曲线,在此处可以用下面显示的方程来定义。该曲线是非奇异的,这意味着它没有尖点或自交点。它具有两个变量a, b,以及一个无穷远点。

精通区块链(一)插图

在这里,ab是可以有各种值的整数,并且是椭圆曲线所定义的域的元素。椭圆曲线可以定义在实数、有理数、复数或有限域上。为了加密目的,使用椭圆曲线覆盖素数有限域而不是实数。此外,素数应大于 3。可以通过改变ab的值来生成不同的曲线。

基于椭圆曲线的主要加密系统是椭圆曲线数字签名算法ECDSA)和椭圆曲线迪菲-赫尔曼ECDH)密钥交换。

公钥和私钥

为了理解公钥密码,首先需要看看公钥和私钥的概念。

私钥,顾名思义,基本上是由用户随机生成的保密的数字。私钥需要受到保护,不应授权任何未经授权的访问;否则,公钥密码方案的整个方案将受到威胁,因为这是用于解密消息的关键。私钥的长度可以根据所使用的算法的类型和类别而有所不同。例如,在 RSA 中,通常使用 1024 位或 2048 位的密钥。1024 位密钥大小不再被认为是安全的,建议在实践中使用至少 2048 位。

公钥是私钥-公钥对的公共部分。 公钥是公开可用的,并由私钥所有者发布。 然后,任何想要向公钥发布者发送加密消息的人都可以通过使用已发布的公钥加密消息并将其发送给私钥持有者来这样做。 没有其他人能够解密消息,因为相应的私钥被预期接收者安全持有。 一旦接收到公钥加密消息,接收方可以使用私钥解密消息。 公钥的一些问题,如发布者的真实性和识别,也是一些关注点。

RSA

这里讨论了 RSA 的描述。 RSA 是由Ron RivestAdi ShamirLeonard Adelman于 1977 年发明的,因此得名 RSA。 这基于整数分解问题,其中两个大素数的乘积很容易,但很难将其分解为两个原始数。

RSA 算法的关键工作在于密钥生成过程中。 执行以下步骤以生成 RSA 密钥对。

模数生成:

  • 选择pq非常大的素数

  • pq相乘,n=p.q 生成模数 n

生成互质数:

  • 假设一个叫e的数字。

  • 它应满足某些条件,即它应大于 1 且小于*(p-1)(q-1)。 换句话说,e 必须是这样一个数字,除了 1 以外没有其他数字可以被e(p-1)(q-1)整除。 这称为互质,即e(p-1)(q-1)*的互质数。

生成公钥:

  • 步骤 1 生成的模数和步骤 2 生成的e共同构成一个公钥。 这部分是可以与任何人分享的公共部分; 但是,pq需要保密。

生成私钥:

  • 这里称为私钥 d,它是从pqe计算的。 私钥基本上是模*(p-1)(q-1)*的 e 的逆。 在等式形式中,它是这样的:

    ed = 1 mod(p-1)(q-1)

通常使用扩展欧几里德算法来计算d; 该算法接受pqe并计算d。 这个方案的关键思想是,任何知道pq的人都可以很容易地计算出私钥d,通过应用扩展欧几里德算法,但是不知道pq的值的人无法生成d。 这也意味着pq应该足够大,使得模数n变得非常困难(计算上不可行)进行因式分解。

使用 RSA 进行加密和解密

RSA 使用以下方程产生密文:

C = P^e mod n

这意味着明文P被提升到e次方,然后被缩减到模n

RSA 中的解密由以下方程给出:

P = C^d mod n

这意味着拥有公钥对(ne)的接收方可以通过将C提升到私钥 d 的值并缩减到模n来解密数据。

椭圆曲线密码学(ECC)

ECC 基于离散对数问题,该问题基于有限域(Galois 域)上的椭圆曲线。ECC 相对于其他类型的公钥算法的主要优势在于,它需要更小的密钥大小,同时提供与 RSA 等算法相同级别的安全性。源自 ECC 的两个值得注意的方案是用于密钥交换的椭圆曲线 Diffie-HellmanECDH)和用于数字签名的椭圆曲线数字签名算法ECDSA)。它也可以用于加密,但通常不会在实践中用于此目的;相反,密钥交换和数字签名更常用。由于 ECC 需要更少的空间来运行,因此它在嵌入式平台或存储资源有限的系统中变得非常流行。作为比较,相同级别的安全性可以通过仅使用 256 位操作数在 ECC 中实现,而在 RSA 中需要 3072 位。

椭圆曲线背后的数学

为了理解 ECC,有必要对椭圆曲线的基本数学进行简要介绍。椭圆曲线基本上是一种称为 Weierstrass 方程的多项式方程,它在有限域上生成一个曲线。最常用的域是所有算术操作都在模a素数p上执行的域。椭圆曲线群由有限域上曲线上的点组成。

椭圆曲线可以在此处定义为一个方程:

精通区块链(一)插图

在这里,AB属于有限域ZpFP(素有限域),还有一个特殊值叫做无穷点。无穷点精通区块链(一)插图用于为曲线上的点提供身份操作。

此外,还需要满足一个条件,确保前述方程没有重复根。这意味着曲线是非奇异的。

这个条件在下面的方程中描述,这是需要满足的标准要求。更确切地说,这确保了曲线是非奇异的:

精通区块链(一)插图

椭圆曲线的实数表示可以如下图所示可视化。这是一个在实数上的方程图:

精通区块链(一)插图

椭圆曲线密码学中实际使用的曲线是在有限素域上的,但在这里,它们显示在实数上,因为在R上绘制时更容易可视化操作:

精通区块链(一)插图

实数上的椭圆曲线,a = -3,b = 3

为了构造基于椭圆曲线的离散对数问题,需要一个足够大的循环群。首先,将群元素标识为满足上述方程的一组点。之后,需要在这些点上定义群操作。

椭圆曲线上的群操作包括点加法和点倍增。 点加法是一个过程,其中两个不同点相加,点倍增意味着同一点加上自身。 这两种操作都可以像下图所示那样进行可视化。

点加法

点加法在以下图表中显示。 这是椭圆曲线上点加法的几何表示。 在这种方法中,一条穿过曲线的线穿过两点PQ,产生曲线和线之间的第三点。 这个点被镜像为P+Q,代表加法结果为R。 如下图所示的P+Q

精通区块链(一)插图

在 R 上可视化的点加法

定义的群操作符号为*+*进行加法生成以下方程:

P + Q = R

在这种情况下,两点相加以计算曲线上第三点的坐标:

精通区块链(一)插图

更精确地说,坐标被添加如下方程所示:

*(*x1, y1) + (x2, y2) = (x3, y3)

点加法方程如下:

精通区块链(一)插图精通区块链(一)插图

在这里,这是结果:

精通区块链(一)插图

P在前面的方程中代表穿过PQ的线。

此处示例的点加法是使用 Certicom 的在线计算器产生的。 该示例显示了在有限域*F[23]*上的方程的加法和解。 这与之前示例形成对比,前者是基于实数的,仅显示了曲线但不显示方程的解:

精通区块链(一)插图

使用 Certicom 的在线计算器工具进行点加法示例

在这个例子中,左侧的图显示了满足下面方程的点:

精通区块链(一)插图

有 27 个解决方案满足之前在有限域F[23]上的方程。 选择PQ相加以得到点R。 右侧显示了计算,计算出第三点R。 注意,这里l用于表示穿过PQ的线。

作为一个示例,展示方程如何被图示中的点满足,选择一个点(x, y),其中x = 3y = 6

将这些值代入方程中表明方程确实成立。 如下所示:

精通区块链(一)插图精通区块链(一)插图精通区块链(一)插图精通区块链(一)插图

下一部分将介绍点倍增的概念,这是椭圆曲线上可以执行的另一种操作。

点倍增

椭圆曲线上的另一种群操作称为点倍增,并在下图中描述。这是一个过程,其中P被加到自身中。在这种方法中,通过曲线画出一条切线,如下图所示。得到第二点,即切线和曲线的交点。然后将此点镜像,得到结果,即2P = P + P

精通区块链(一)插图

代表实数上点倍增的图

在点倍增的情况下,方程如下:

精通区块链(一)插图精通区块链(一)插图精通区块链(一)插图

在这里,S是穿过P的切线(切线)。这是上图中所示的顶部线。在前面的例子中,曲线作为简单示例绘制在实数上,并未显示方程的解。

下面是一个示例,显示了在有限域*F[23]*上椭圆曲线的解和点倍增。左侧的图显示了满足方程的点:

精通区块链(一)插图精通区块链(一)插图

使用 certicom 在线计算工具的点倍增示例

如前所示,在右侧显示了一个计算结果,找到P加到自身后的R(点倍增)。这里没有Q,因为这里使用同一点P进行倍增。请注意,在计算中,l用于表示穿过P的切线。

在下一部分,将介绍离散对数问题。

离散对数问题

ECC 中的离散对数问题基于这样一个思想:在某些条件下,椭圆曲线上的所有点形成一个循环群。在椭圆曲线上,公钥是生成点的随机倍数,而私钥是用于生成倍数的随机选择的整数。换句话说,私钥是随机选择的整数,而公钥是曲线上的一个点。离散对数问题用于找到在椭圆曲线上所有点中的某个整数私钥(一个整数)。接下来的方程精确地显示了这一点。考虑一个椭圆曲线E,其中有两个元素PT。离散对数问题是找到一个整数 d,满足1 <= d <= #E,使得:

P + P + . . . +P = d P = T

这里,T是公钥(曲线上的点),d 是私钥。换句话说,公钥是生成器的随机倍数,而私钥是用于生成倍数的整数。#E表示椭圆曲线的阶,这基本上意味着椭圆曲线的循环群中存在的点的数量。循环群是由椭圆曲线上的点和无穷远点组合而成的。

密钥对与椭圆曲线的特定域参数相关联。域参数包括字段大小、字段表示、来自字段ab的两个元素、两个字段元素XgYg、计算为G=(Xg, Yg)的点G的阶 n 和余因子h = #E(Fq)/n。稍后将在本节中描述使用 OpenSSL 的实际示例。

有各种推荐和标准化使用作为 ECC 曲线的参数。在这里,你将看到 SECP256K1 规范的一个例子。这是比特币中使用的规范:

精通区块链(一)插图

SECP256K1 的规范来源于 http://www.secg.org/sec2-v2.pdf

这个六元组中所有这些值的说明在此处给出。

P是指定有限域大小的素数p

ab是椭圆曲线方程的系数。

G是生成所需子群的基点,也称为生成器。基点可以以压缩或非压缩形式表示。在实际实现中,无需存储曲线上的所有点。压缩生成器有效是因为可以仅使用x坐标和y坐标的最低有效位来识别曲线上的点。

n是子群的阶。

h是子群的余因子。

在下一节中,将展示使用 OpenSSL 的示例,以帮助您了解 RSA 的实践方面。

在以下部分中,将展示如何使用 OpenSSL 生成 RSA 公钥和私钥对。

如何生成公钥和私钥对

首先,展示了如何使用 OpenSSL 生成 RSA 私钥。

私钥
~/Crypt$ openssl genpkey -algorithm RSA -out privatekey.pem -pkeyopt rsa_keygen_bits:1024
...............................++++++
....................++++++

执行命令后,会生成一个名为privatekey.pem的文件,其中包含生成的私钥。如下所示:

~/Crypt$ cat privatekey.pem
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKJOFBzPy2vOd6em
Bk/UGrzDy7TvgDYnYxBfiEJId/r+EyMt/F14k2fDTOVwxXaXTxiQgD+BKuiey/69
9itnrqW/xy/pocDMvobj8QCngEntOdNoVSaN+t0f9nRM3iVM94mz3/C/v4vXvoac
PyPkr/0jhIV0woCurXGTghgqIbHRAgMBAAECgYEAlB3s/N4lJh0l1TkOSYunWtzT
6isnNkR7g1WrY9H+rG9xx4kP5b1DyE3SvxBLJA6xgBle8JVQMzm3sKJrJPFZzzT5
NNNnugCxairxcF1mPzJAP3aqpcSjxKpTv4qgqYevwgW1A0R3xKQZzBKU+bTO2hXV
D1oHxu75mDY3xCwqSAECQQDUYV04wNSEjEy9tYJ0zaryDAcvd/VG2/U/6qiQGajB
eSpSqoEESigbusKku+wVtRYgWWEomL/X58t+K01eMMZZAkEAw6PUR9YLebsm/Sji
iOShV4AKuFdi7t7DYWE5Ulb1uqP/i28zN/ytt4BXKIs/KcFykQGeAC6LDHZyycyc
ntDIOQJAVqrE1/wYvV5jkqcXbYLgV5YA+KYDOb9Y/ZRM5UETVKCVXNanf5CjfW1h
MMhfNxyGwvy2YVK0Nu8oY3xYPi+5QQJAUGcmORe4w6Cs12JUJ5p+zG0s+rG/URhw
B7djTXm7p6b6wR1EWYAZDM9MArenj8uXAA1AGCcIsmiDqHfU7lgz0QJAe9mOdNGW
7qRppgmOE5nuEbxkDSQI7OqHYbOLuwfCjHzJBrSgqyi6pj9/9CbXJrZPgNDwdLEb
GgpDKtZs9gLv3A==
-----END PRIVATE KEY-----

生成公钥

由于私钥在数学上与公钥相关联,因此可以从私钥生成或派生公钥。以前述私钥的示例为例,公钥可以生成如下:

:~/Crypt$ openssl rsa -pubout -in privatekey.pem -out publickey.pem
writing RSA key

公钥可以使用文件阅读器或任何文本查看器查看,如下所示:

:~/Crypt$ cat publickey.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiThQcz8trznenpgZP1Bq8w8u0
74A2J2MQX4hCSHf6/hMjLfxdeJNnw0zlcMV2l08YkIA/gSronsv+vfYrZ66lv8cv
6aHAzL6G4/EAp4BJ7TnTaFUmjfrdH/Z0TN4lTPeJs9/wv7+L176GnD8j5K/9I4SF
dMKArq1xk4IYKiGx0QIDAQAB
-----END PUBLIC KEY-----

为了查看关于各种组件的更多详细信息,如在过程中使用的模数、素数、生成的私钥的指数和系数,可以使用以下命令(由于输出太大,未显示完整输出):

:~/Crypt$ openssl rsa -text -in privatekey.pem
Private-Key: (1024 bit)
modulus:
 00:a2:4e:14:1c:cf:cb:6b:ce:77:a7:a6:06:4f:d4:
 1a:bc:c3:cb:b4:ef:80:36:27:63:10:5f:88:42:48:
 77:fa:fe:13:23:2d:fc:5d:78:93:67:c3:4c:e5:70:
 c5:76:97:4f:18:90:80:3f:81:2a:e8:9e:cb:fe:bd:
 f6:2b:67:ae:a5:bf:c7:2f:e9:a1:c0:cc:be:86:e3:
 f1:00:a7:80:49:ed:39:d3:68:55:26:8d:fa:dd:1f:
 f6:74:4c:de:25:4c:f7:89:b3:df:f0:bf:bf:8b:d7:
 be:86:9c:3f:23:e4:af:fd:23:84:85:74:c2:80:ae:
 ad:71:93:82:18:2a:21:b1:d1
publicExponent: 65537 (0x10001)
privateExponent:
 00:94:1d:ec:fc:de:25:26:1d:25:d5:39:0e:49:8b:
 a7:5a:dc:d3:ea:2b:27:36:44:7b:83:55:ab:63:d1:
 fe:ac:6f:71:c7:89:0f:e5:bd:43:c8:4d:d2:bf:10:
 4b:24:0e:b1:80:19:5e:f0:95:50:33:39:b7:b0:a2:
 6b:24:f1:59:cf:34:f9:34:d3:67:ba:00:b1:6a:2a:
 f1:70:5d:66:3f:32:40:3f:76:aa:a5:c4:a3:c4:aa:
 53:bf:8a:a0:a9:87:af:c2:05:b5:03:44:77:c4:a4:
 19:cc:12:94:f9:b4:ce:da:15:d5:0f:5a:07:c6:ee:
 f9:98:36:37:c4:2c:2a:48:01
prime1:
 00:d4:61:5d:38:c0:d4:84:8c:4c:bd:b5:82:74:cd:
 aa:f2:0c:07:2f:77:f5:46:db:f5:3f:ea:a8:90:19:
 a8:c1:79:2a:52:aa:81:04:4a:28:1b:ba:c2:a4:bb:
 ec:15:b5:16:20:59:61:28:98:bf:d7:e7:cb:7e:2b:
 4d:5e:30:c6:59
prime2:
 00:c3:a3:d4:47:d6:0b:79:bb:26:fd:28:e2:88:e4:
 a1:57:80:0a:b8:57:62:ee:de:c3:61:61:39:52:56:
 f5:ba:a3:ff:8b:6f:33:37:fc:ad:b7:80:57:28:8b:
 3f:29:c1:72:91:01:9e:00:2e:8b:0c:76:72:c9:cc:
 9c:9e:d0:c8:39

同样,可以使用以下命令查看公钥。公钥和私钥都是 base64 编码的:

~/Crypt$ openssl pkey -in publickey.pem -pubin -text
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiThQcz8trznenpgZP1Bq8w8u0
74A2J2MQX4hCSHf6/hMjLfxdeJNnw0zlcMV2l08YkIA/gSronsv+vfYrZ66lv8cv
6aHAzL6G4/EAp4BJ7TnTaFUmjfrdH/Z0TN4lTPeJs9/wv7+L176GnD8j5K/9I4SF
dMKArq1xk4IYKiGx0QIDAQAB
-----END PUBLIC KEY-----
Public-Key: (1024 bit)
Modulus:
 00:a2:4e:14:1c:cf:cb:6b:ce:77:a7:a6:06:4f:d4:
 1a:bc:c3:cb:b4:ef:80:36:27:63:10:5f:88:42:48:
 77:fa:fe:13:23:2d:fc:5d:78:93:67:c3:4c:e5:70:
 c5:76:97:4f:18:90:80:3f:81:2a:e8:9e:cb:fe:bd:
 f6:2b:67:ae:a5:bf:c7:2f:e9:a1:c0:cc:be:86:e3:
 f1:00:a7:80:49:ed:39:d3:68:55:26:8d:fa:dd:1f:
 f6:74:4c:de:25:4c:f7:89:b3:df:f0:bf:bf:8b:d7:
 be:86:9c:3f:23:e4:af:fd:23:84:85:74:c2:80:ae:
 ad:71:93:82:18:2a:21:b1:d1
Exponent: 65537 (0x10001)

现在公钥可以公开共享,任何想要给我们发送消息的人都可以使用公钥加密消息并将其发送给我们。然后,我们可以使用相应的私钥解密文件。

如何使用 OpenSSL 进行 RSA 加密和解密

首先,在本节中,将介绍一个示例,演示如何使用 RSA 进行加密。

加密

以前例中生成的私钥为例,可以构建加密文本文件message.txt的命令,如下所示:

:~/Crypt$ openssl rsautl -encrypt -inkey publickey.pem -pubin -in message.txt -out message.rsa

这将生成一个名为message.rsa的文件,它是以二进制格式存储的。如果我们在 nano 编辑器中打开message.rsa,它将显示一些垃圾数据:

精通区块链(一)插图

显示垃圾数据的 message.rsa

解密

为了解密 RSA 加密的文件,可以使用以下命令:

:~/Crypt$ openssl rsautl -decrypt -inkey privatekey.pem -in message.rsa -out message.dec

现在,如果使用 cat 读取文件,可以看到解密后的明文,如下所示:

:~/Crypt$ cat message.dec
datatoencrypt

使用 OpenSSL 的 ECC

OpenSSL 提供了一个非常丰富的函数库,用于执行椭圆曲线密码学。下面的部分展示了如何在 OpenSSL 中实际使用 ECC 函数。

ECC 私钥和公钥对

在这个例子中,首先展示了使用 OpenSSL 库中可用的 ECC 函数创建私钥的示例。

私钥

ECC 是基于各种标准定义的域参数。我们可以使用以下命令查看 OpenSSL 中所有可用标准定义和推荐曲线的列表:

Crypt$ openssl ecparam -list_curves
 secp112r1 : SECG/WTLS curve over a 112 bit prime field
 secp112r2 : SECG curve over a 112 bit prime field
 secp128r1 : SECG curve over a 128 bit prime field
 secp128r2 : SECG curve over a 128 bit prime field
 secp160k1 : SECG curve over a 160 bit prime field
 secp160r1 : SECG curve over a 160 bit prime field
 secp160r2 : SECG/WTLS curve over a 160 bit prime field
 secp192k1 : SECG curve over a 192 bit prime field
 secp224k1 : SECG curve over a 224 bit prime field
 secp224r1 : NIST/SECG curve over a 224 bit prime field
 secp256k1 : SECG curve over a 256 bit prime field
 secp384r1 : NIST/SECG curve over a 384 bit prime field
 secp521r1 : NIST/SECG curve over a 521 bit prime field
 prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field
.
.
.
.
 brainpoolP384r1: RFC 5639 curve over a 384 bit prime field
 brainpoolP384t1: RFC 5639 curve over a 384 bit prime field
 brainpoolP512r1: RFC 5639 curve over a 512 bit prime field
 brainpoolP512t1: RFC 5639 curve over a 512 bit prime field

由于这会产生一个很长的输出,完整的输出未显示并在中间被截断。在以下示例中,使用 SECP256k1 来演示 ECC 的用法。

生成私钥
~/Crypt$ openssl ecparam -name secp256k1 -genkey -noout -out ec-privatekey.pem
~/Crypt$ cat ec-privatekey.pem
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIJHUIm9NZAgfpUrSxUk/iINq1ghM/ewn/RLNreuR52h/oAcGBSuBBAAK
oUQDQgAE0G33mCZ4PKbg5EtwQjk6ucv9Qc9DTr8JdcGXYGxHdzr0Jt1NInaYE0GG
ChFMT5pK+wfvSLkYl5ul0oczwWKjng==
-----END EC PRIVATE KEY-----

名为ec-privatekey.pem的文件现在包含基于 SECP256K1 曲线生成的 EC 私钥。

为了从私钥生成公钥,请发出以下命令:

~/Crypt$ openssl ec -in ec-privatekey.pem -pubout -out ec-pubkey.pem
read EC key
writing EC key

读取文件产生以下输出,显示生成的公钥:

~/Crypt$ cat ec-pubkey.pem
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0G33mCZ4PKbg5EtwQjk6ucv9Qc9DTr8J
dcGXYGxHdzr0Jt1NInaYE0GGChFMT5pK+wfvSLkYl5ul0oczwWKjng==
-----END PUBLIC KEY-----

现在ec-pubkey.pem文件包含了从ec-privatekey.pem派生出的公钥。

可以使用以下命令进一步探索私钥:

~/Crypt$ openssl ec -in ec-privatekey.pem -text -noout
read EC key
Private-Key: (256 bit)
priv:
 00:91:d4:22:6f:4d:64:08:1f:a5:4a:d2:c5:49:3f:
 88:83:6a:d6:08:4c:fd:ec:27:fd:12:cd:ad:eb:91:
 e7:68:7f
pub:
 04:d0:6d:f7:98:26:78:3c:a6:e0:e4:4b:70:42:39:
 3a:b9:cb:fd:41:cf:43:4e:bf:09:75:c1:97:60:6c:
 47:77:3a:f4:26:dd:4d:22:76:98:13:41:86:0a:11:
 4c:4f:9a:4a:fb:07:ef:48:b9:18:97:9b:a5:d2:87:
 33:c1:62:a3:9e
ASN1 OID: secp256k1

类似地,可以使用以下命令进一步探索公钥:

drequinox@drequinox-OP7010:~/Crypt$ openssl ec -in ec-pubkey.pem -pubin -text -noout
read EC key
Private-Key: (256 bit)
pub:
 04:d0:6d:f7:98:26:78:3c:a6:e0:e4:4b:70:42:39:
 3a:b9:cb:fd:41:cf:43:4e:bf:09:75:c1:97:60:6c:
 47:77:3a:f4:26:dd:4d:22:76:98:13:41:86:0a:11:
 4c:4f:9a:4a:fb:07:ef:48:b9:18:97:9b:a5:d2:87:
 33:c1:62:a3:9e
ASN1 OID: secp256k1
drequinox@drequinox-OP7010:~/Crypt$

也可以生成一个带有所需参数的文件-在本例中为SECP256K1-然后进一步探索以了解底层参数:

~/Crypt$ openssl ecparam -name secp256k1 -out secp256k1.pem
drequinox@drequinox-OP7010:~/Crypt$ cat secp256k1.pem
-----BEGIN EC PARAMETERS-----
BgUrgQQACg==
-----END EC PARAMETERS-----

该文件现在包含了所有SECP256K1参数,并且可以使用以下命令进行分析:

drequinox@drequinox-OP7010:~/Crypt$ openssl ecparam -in secp256k1.pem -text -param_enc explicit -noout
Field Type: prime-field
Prime:
 00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
 ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:fe:ff:
 ff:fc:2f
A:    0
B:    7 (0x7)
Generator (uncompressed):
 04:79:be:66:7e:f9:dc:bb:ac:55:a0:62:95:ce:87:
 0b:07:02:9b:fc:db:2d:ce:28:d9:59:f2:81:5b:16:
 f8:17:98:48:3a:da:77:26:a3:c4:65:5d:a4:fb:fc:
 0e:11:08:a8:fd:17:b4:48:a6:85:54:19:9c:47:d0:
 8f:fb:10:d4:b8
Order:
 00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
 ff:fe:ba:ae:dc:e6:af:48:a0:3b:bf:d2:5e:8c:d0:
 36:41:41
Cofactor:  1 (0x1)

前面的示例显示了使用的素数和 SECP256K1 曲线域参数的生成器、阶数和余因子的 A 和 B 值。

还有另一类被称为散列函数的加密原语。散列函数不用于加密数据,而是产生数据的固定长度摘要。

加密原语

这种加密原语的分类可以如图所示:

精通区块链(一)插图

加密原语

散列函数

哈希函数用于将任意长的输入字符串创建为固定长度的摘要。哈希函数是无密钥的,提供数据完整性服务。它们通常使用迭代和专用哈希函数构建技术构建。各种哈希函数族可用,如 MD、SHA1、SHA-2、SHA-3、RIPEMD 和 Whirlpool。哈希函数通常用于数字签名和消息认证码,如 HMACs。它们有三个安全性质,即原像抗性、第二原像抗性和碰撞抗性。这些性质稍后在本节中解释。

哈希函数通常用于提供数据完整性服务。这些可以用作单向函数,并构造其他加密原语,如 MAC 和数字签名。一些应用程序使用哈希函数来生成伪随机数PRNGs)。哈希函数不需要密钥。哈希函数必须满足两个实用和三个安全性质,具体取决于完整性的要求级别。

将任意消息压缩为固定长度摘要

这个特性与一个哈希函数必须能够接受任意长度的长输入文本并输出一个固定长度的压缩消息有关。哈希函数产生各种位大小的压缩输出,通常在 128 位和 512 位之间。

易于计算

哈希函数是高效快速的单向函数。要求是无论消息大小如何,都要非常快速计算。如果消息太大,效率可能会降低,但函数仍然应足够快速以供实际使用。

在下一节中,讨论了哈希函数的安全性质。

原像抗性

考虑一个方程式:

h(x) = y

这里,h是哈希函数,x是输入,y是哈希。第一个安全性质要求 y 不能被反向计算为 xx 被认为是 y原像,因此称为原像抗性。这也称为单向属性。

第二原像抗性

这个特性要求给定 xh(x),几乎不可能找到任何其他消息 m,其中 m != xm 的哈希等于 x 的哈希。h(m) = h(x)。这个属性也被称为弱碰撞抗性。

碰撞抗性

这个特性要求两个不同的输入消息不应该哈希到相同的输出。换句话说,h(x) != h(z)。这个属性也被称为强碰撞抗性。

由于其本质,哈希函数始终会有一些碰撞,即两个不同的消息哈希到相同的输出,但它们应该是计算上不可行的。所有哈希函数中都希望存在一种称为雪崩效应的概念。雪崩效应指的是在输入文本中进行小改变,甚至是一个单字符的改变,都会导致完全不同的哈希输出。

哈希函数通常是按照迭代哈希函数方法设计的。在这种方法中,输入消息按块压缩多轮,以产生压缩的输出。一种流行的迭代哈希函数类型是 Merkle-Damgard 构造。这种构造基于将输入数据分成相等大小的块的想法,然后以迭代方式将它们通过压缩函数馈送。压缩函数的碰撞抵抗性确保了哈希输出也是抗碰撞的。压缩函数可以使用块密码构建。除了 Merkle-Damgard 外,研究人员还提出了各种其他压缩函数构造,例如,Miyaguchi-PreneelDavies-Meyer

有多个哈希函数类别。您将在接下来的部分介绍这些类别。

消息摘要(MD)

消息摘要函数在 20 世纪 90 年代初非常流行。MD4 和 MD5 是该类别的成员。两个 MD 函数都被发现不安全,不建议再使用。MD5 是一个 128 位哈希函数,通常用于文件完整性检查。

安全哈希算法(SHAs)

SHA-0:这是由 NIST 在 1993 年引入的 160 位函数。

SHA-1:SHA-1 后来由 NIST 作为 SHA-0 的替代品引入。这也是一个 160 位的哈希函数。SHA-1 在 SSL 和 TLS 实现中常用。值得注意的是,SHA-1 现在被认为是不安全的,并且正在被证书颁发机构弃用。现在不鼓励在任何新的实现中使用它。SHA-2:此类别包括根据哈希位数定义的四个函数:SHA-224、SHA-256、SHA-384 和 SHA-512。

SHA-3:这是最新的 SHA 函数系列。SHA3-224、SHA3-256、SHA3-384 和 SHA3-512 是这个系列的成员。SHA3 是 Keccak 的 NIST 标准版本。Keccak 采用了一种称为海绵构造的新方法,而不是常用的 Merkle-Damgard 转换。

RIPEMD:RIPEMD 是RACE 完整性基元评估消息摘要的首字母缩写。它基于构建 MD4 所使用的设计思想。RIPEMD 有多个版本,包括 128 位、160 位、256 位和 320 位。

Whirlpool:这是基于 Rijndael 密码的修改版本 W。它使用 Miyaguchi-Preneel 压缩函数,这是一种用于将两个固定长度输入压缩为单个固定长度输出的单向函数类型。它是一个单块长度压缩函数:

精通区块链(一)插图

哈希函数的三个安全性质

哈希函数有许多实际应用范围,从简单的文件完整性检查和密码存储到在加密协议和算法中使用。它们用于哈希表、分布式哈希表、布隆过滤器、病毒指纹、点对点 P2P 文件共享等许多其他应用。

在区块链中,哈希函数起到非常重要的作用。特别是,工作量证明函数使用 SHA-256 两次来验证矿工所花费的计算工作量。RIPEMD 160 用于产生比特币地址。这将在后面的章节中进行更详细的讨论。

安全哈希算法(SHA)的设计

在下一节中,你将了解到 SHA-256 和 SHA-3 的设计。这两者分别用于比特币和以太坊。以太坊不使用 NIST 标准的 SHA-3,而是原始算法 Keccak,这个算法被提交给 NIST。然后经过一些修改,如增加轮数和简化消息填充,Keccak 被 NIST 标准化为 SHA-3。

SHA-256

SHA-256 具有输入消息大小<2⁶⁴ 位。块大小为 512 位,字长为 32 位。输出为 256 位摘要。

压缩函数处理一个 512 位消息块和一个 256 位中间哈希值。该函数的两个主要组成部分是压缩函数和消息调度表。

算法工作如下:

  • 预处理:

    1. 对消息进行填充,以使块长度为 512 位,如果小于所需的 512 位块大小。

    2. 将消息解析成消息块,以确保消息及其填充被分成大小相等的 512 位块。

    3. 设置初始哈希值,即通过取前八个质数的平方根的小数部分的前 32 位获得的八个 32 位字。这些初始值是随机选择的,以初始化过程并给予算法中不存在后门的信心级别。

  • 哈希计算:

    1. 每个消息块按顺序处理,并需要 64 轮才能计算出完整的哈希输出。每轮使用略有不同的常数,以确保没有两轮是相同的。

    2. 首先,准备消息调度表。

    3. 然后,初始化八个工作变量。

    4. 然后,计算中间哈希值。

    5. 最后,处理消息并产生输出哈希:精通区块链(一)插图

      SHA 256 压缩函数的一轮

在前面的图表中,abcdefgh是寄存器。 MajCh 会进行按位操作。 精通区块链(一)插图 进行按位旋转。轮常数为 W[j]K[j],它们被加上 mod 2³²

SHA3(Keccak)的设计

SHA-3 的结构与通常的 SHA-1 和 SHA-2 非常不同。SHA-3 背后的关键思想是基于非键控置换,而不是其他常见哈希函数的结构使用键控置换。Keccak 也不使用 Merkle-Damgard 转换来处理哈希函数中的任意长度输入消息,这是常用的。Keccak 使用了一种称为海绵和挤压构造的新方法,基本上是一个随机置换模型。SHA3 的不同变体已经标准化,例如 SHA3-224、SHA3-256、SHA3-384、SHA3-512、SHAKE128 和 SHAKE256。SHAKE128 和 SHAKE256 是可扩展输出函数,也是由NIST.XOF函数标准化的,允许将输出扩展到任意所需长度。

以下图示显示了 SHA3 或 Keccak 基础的海绵和挤压模型。类比于海绵,首先,数据在应用填充后被吸收到海绵中,然后使用 XOR 将其转换为置换状态的子集,然后将输出从表示转换后状态的海绵函数中挤压出来。速率是海绵函数的输入块大小,而容量确定了通用安全级别:

精通区块链(一)插图

SHA3 中的吸收和挤压函数

OpenSSL 哈希函数示例

以下命令将使用 SHA256 算法对 Hello 消息产生 256 位的哈希:

:~/Crypt$ echo -n 'Hello' | openssl dgst -sha256
(stdin)= 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

注意即使是文本中的微小变化,比如更改H的大小写,也会导致输出哈希的巨大变化。这被称为雪崩效应,如前所述:

:~/Crypt$ echo -n 'hello' | openssl dgst -sha256
(stdin)= 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

注意,两个输出完全不同:

Hello: 18:5f:8d:b3:22:71:fe:25:f5:61:a6:fc:93:8b:2e:26:43:06:ec:30:4e:da:51:80:07:d1:76:48:26:38:19:69
hello: 2c:f2:4d:ba:5f:b0:a3:0e:26:e8:3b:2a:c5:b9:e2:9e:1b:16:1e:5c:1f:a7:42:5e:73:04:33:62:93:8b:98:24

消息认证码(MACs)

MACs 有时被称为密钥哈希函数,可以用来提供消息完整性和认证。换句话说,它们用于提供数据源认证。这些是使用发送方和接收方之间的共享密钥的对称加密基元。MACs 可以使用块密码或哈希函数构造。

使用块密码的 MACs

在这种方法中,块密码以密码块链接模式CBC 模式)的方式用于生成 MAC。任何块密码-例如,在 CBC 模式下的 AES-都可以使用。消息的 MAC 实际上是 CBC 操作的最后一轮的输出。MAC 输出的长度与用于生成 MAC 的块密码的块长度相同。MAC 可以通过计算消息的 MAC 并将其与接收到的 MAC 进行比较来简单验证。如果它们相同,则确认消息完整性;否则,消息被视为已更改。还应注意,MAC 类似于数字签名,但由于它们的对称性质,它们无法提供不可否认的服务。

HMACs(基于哈希的消息认证码)

与哈希函数类似,它们产生固定长度的输出并以任意长的消息作为输入。在这个方案中,发送方使用 MAC 对消息进行签名,接收方使用共享密钥进行验证。密钥使用两种方法之一,即秘密前缀或秘密后缀方法与消息进行散列。在第一种方法中,密钥与消息连接在一起,即密钥在前,消息在后,而在后一种方法中,密钥在消息之后:

秘密前缀:M = MACk(x) = h(k||x)

秘密后缀:M=MACk(x) = h(x||k)

这两种方法各有优缺点。已经发现了对这两种方案的一些攻击。有 HMAC 构造方案使用各种技术,例如研究人员提出的 ipadopad(内部填充和外部填充),在某些假设下被认为是安全的:

精通区块链(一)插图

MAC 函数的操作

Merkle 树

Merkle 树的概念是由 Ralph Merkle 提出的。这里展示了 Merkle 树的可视化,这使得理解变得容易。Merkle 树允许对大型数据集进行安全高效的验证。

它是一种二叉树,首先,输入被放置在叶子节点(没有子节点的节点),然后对子节点的值进行哈希以产生父节点(内部节点)的值,直到获得单个哈希值,称为 Merkle 根:

精通区块链(一)插图

Merkle 树

Patricia 树

要了解 Patricia 树,首先,你将被介绍到 trie 的概念。Trie 或数字树是一种用于存储数据集的有序树数据结构。

Practical Algorithm to Retrieve Information Coded in Alphanumeric (Patricia),也称为基数树,是 trie 的一种紧凑表示,在此树中,作为父节点的唯一子节点与其父节点合并。

Merkle-Patricia 树,基于 Patricia 和 Merkle 的定义,是一棵树,其中根节点包含整个数据结构的哈希值。

分布式哈希表 (DHTs)

哈希表是一种用于将键映射到值的数据结构。内部使用哈希函数计算到桶数组的索引,从中可以找到所需的值。桶使用哈希键存储记录,并按特定顺序组织。

在前面提供的定义的基础上,人们可以将分布式哈希表看作是一种数据结构,在这种数据结构中,数据分布在各个节点上,节点相当于点对点网络中的桶。

以下图表直观展示了分布式哈希表的工作原理。该示例显示数据通过哈希函数传递,生成一个紧凑的键。此键然后与对等网络上的数据(值)关联。当网络上的用户请求数据(通过文件名)时,文件名可以再次进行哈希以生成相同的键,然后可以请求网络上的任何节点来查找相应的数据。DHT 提供了去中心化、容错性和可伸缩性:

精通区块链(一)插图

分布式哈希表

数字签名

数字签名提供了一种将消息与产生消息的实体相关联的手段。数字签名用于提供数据的来源认证和不可否认性。它们经过两个步骤计算。RSA 数字签名方案的高级步骤如下所示:

  1. 计算数据包的哈希值。这将提供数据完整性保证,因为哈希可以在接收者端重新计算并与原始哈希匹配,以检查数据是否在传输过程中被修改。从技术上讲,消息签名可以在不先对数据进行哈希的情况下工作,但这并不被认为是安全的。

  2. 第二步将哈希值用签名者的私钥签名。由于只有签名者拥有私钥,所以保证了签名和签名数据的真实性。

数字签名具有一些重要属性,例如真实性、不可伪造性和不可复用性。真实性意味着数字签名可被接收方验证。不可伪造性确保只有消息的发送者才能使用私钥使用签名功能。换句话说,其他人不应该能够产生由合法发送者生成的签名消息。不可复用性意味着数字签名不能从一条消息中分离并再次用于另一条消息。

通用数字签名函数的操作显示在以下图表中:

精通区块链(一)插图

数字签名(左)和验证过程(右)的运作(RSA 数字签名示例)

如果发送方想要向接收方发送一个经过认证的消息,可以使用两种方法。这里介绍了使用数字签名和加密的两种方法。

先签名后加密

在此方法中,发送方使用私钥对数据进行数字签名,将签名附加到数据上,然后使用接收方的公钥加密数据和数字签名。与接下来描述的先加密再签名方案相比,这被认为是一种更安全的方案。

先加密后签名

在此方法中,发送方使用接收方的公钥加密数据,然后对加密数据进行数字签名。

注意

实际上,包含数字签名的数字证书是由将公钥与身份关联起来的证书颁发机构CA)颁发的。

在实践中使用各种方案,如 RSA、数字签名算法和基于椭圆曲线的数字签名算法。RSA 是最常用的;然而,随着椭圆曲线密码学的推动,基于 ECDSA 的方案也变得非常流行。

在这里详细描述了 ECDSA 方案。

椭圆曲线数字签名算法(ECDSA)

为了使用 ECDSA 方案签名和验证,需要首先生成第一对密钥:

  1. 首先,定义一个椭圆曲线 E

    1. 与模数 P

    2. 系数 ab

    3. 形成素数阶循环群的生成点 A

  2. 随机选择一个整数 d,使得 0 < d < q

  3. 计算公钥 B 使得 B = d A

公钥是形式为以下内容的六元组:

Kpb = (p,a,b,q,A,B)

私钥在步骤 2 中随机选择 d

Kpr = d

现在可以使用私钥和公钥生成签名。

  1. 首先,选择一个临时密钥 Ke,其中 0 < Ke < q。必须确保 Ke 是真正随机的,并且没有两个签名具有相同的密钥;否则,可以计算出私钥。

  2. 使用 R = Ke A 计算另一个值 R,即通过将 A(生成点)和随机临时密钥相乘得到。

  3. 使用 x 坐标值初始化变量 rr = xR

  4. 签名可以按如下方式计算:精通区块链(一)插图

在这里,m 是正在计算签名的消息,h(m) 是消息 m 的哈希值。

遵循此过程执行签名验证。

  1. 计算辅助值 w,如 w = s^(-1)mod q

  2. 辅助值 u1 = w. h(m) mod q

  3. 辅助值 u2 = w. r mod q

  4. 计算点 PP = u1A + u2B

  5. 验证如下进行。

  6. 如果在第 4 步中计算得到的点 P 的 x 坐标与签名参数 r mod q 的值相同,则 r, s 被接受为有效签名。

    即:

    Xp = r mod q 意味着有效签名

    Xp != r mod q 意味着无效签名

这里显示了各种实际示例,展示了如何使用 OpenSSL 生成、使用和验证 RSA 数字签名。

如何生成数字签名

第一步是生成消息文件的哈希值:

:~/Crypt$ openssl dgst -sha256 message.txt
SHA256(message.txt)= eb96d1f89812bf4967d9fb4ead128c3b787272b7be21dd2529278db1128d559c

生成哈希值和签名可以一步完成,如下所示。注意,privatekey.pem是在之前的步骤中生成的:

:~/Crypt$ openssl dgst -sha256 -sign privatekey.pem -out signature.bin message.txt

现在让我们显示显示相关文件的目录:

:~/Crypt$ ls -ltr
total 36
-rw-rw-r-- 1 drequinox drequinox  14 Sep 21 05:54 message.txt
-rw-rw-r-- 1 drequinox drequinox  32 Sep 21 05:57 message.bin
-rw-rw-r-- 1 drequinox drequinox  45 Sep 21 06:00 message.b64
-rw-rw-r-- 1 drequinox drequinox  32 Sep 21 06:16 message.ptx
-rw-rw-r-- 1 drequinox drequinox 916 Sep 21 06:28 privatekey.pem
-rw-rw-r-- 1 drequinox drequinox 272 Sep 21 06:30 publickey.pem
-rw-rw-r-- 1 drequinox drequinox 128 Sep 21 06:43 message.rsa
-rw-rw-r-- 1 drequinox drequinox  14 Sep 21 06:49 message.dec
-rw-rw-r-- 1 drequinox drequinox 128 Sep 21 07:05 signature.bin
:~/Crypt$ cat signature.bin

精通区块链(一)插图

为了验证签名,可以执行以下操作:

:~/Crypt$ openssl dgst -sha256 -verify publickey.pem -signature signature.bin message.txt
Verified OK
:~/Crypt$

同样,如果使用了不合法的其他签名文件,验证将失败,如下所示:

:~/Crypt$ openssl dgst -sha256 -verify publickey.pem -signature someothersignature.bin message.txt
Verification Failure

您现在将看到一个示例,展示了如何使用 OpenSSL 执行与 ECDSA 相关的操作。

使用 OpenSSL 进行 ECDSA

首先,使用以下命令生成私钥:

~/Crypt$ openssl ecparam -genkey -name secp256k1 -noout -out eccprivatekey.pem 
~/Crypt$ cat eccprivatekey.pem
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIMVmyrnEDOs7SYxS/AbXoIwqZqJ+gND9Z2/nQyzcpaPBoAcGBSuBBAAK
oUQDQgAEEKKS4E4+TATIeBX8o2J6PxKkjcoWrXPwNRo/k4Y/CZA4pXvlyTgH5LYm
QbU0qUtPM7dAEzOsaoXmetqB+6cM+Q==
-----END EC PRIVATE KEY-----

现在,公钥是由私钥生成的:

~/Crypt$ openssl ec -in eccprivatekey.pem -pubout -out eccpublickey.pem
read EC key
writing EC key
~/Crypt$ cat eccpublickey.pem
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEKKS4E4+TATIeBX8o2J6PxKkjcoWrXPw
NRo/k4Y/CZA4pXvlyTgH5LYmQbU0qUtPM7dAEzOsaoXmetqB+6cM+Q==
-----END PUBLIC KEY-----
~/Crypt$

现在假设需要对名为testsign.txt的文件进行签名和验证。可以按照以下步骤实现:

  1. 创建一个测试文件:

    ~/Crypt$ echo testing > testsign.txt
    ~/Crypt$ cat testsign.txt
    testing
    
    
  2. 运行以下命令,使用私钥为testsign.txt文件生成签名:

    ~/Crypt$ openssl dgst -ecdsa-with-SHA1 -sign eccprivatekey.pem     
            testsign.txt > ecsign.bin
    
    
  3. 最后,验证命令可以按照这里所示运行:

    ~/Crypt$ openssl dgst -ecdsa-with-SHA1 -verify eccpublickey.pem   
            -signature ecsign.bin testsign.txt
    Verified OK
    
    

也可以使用之前生成的私钥生成证书:

~/Crypt$ openssl req -new -key eccprivatekey.pem -x509 -nodes -days 365 -out ecccertificate.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:Cambridge
Locality Name (eg, city) []:Cambridge
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Dr.Equinox!
Organizational Unit Name (eg, section) []:NA
Common Name (e.g. server FQDN or YOUR name) []:drequinox
Email Address []:drequinox@drequinox.com

可以使用以下命令来查看证书:

~/Crypt$ openssl x509 -in ecccertificate.pem -text -noout

精通区块链(一)插图

使用 SHA-256 的 ECDSA 算法的 X509 证书

这里介绍了与区块链相关或未来区块链生态系统潜在使用相关的密码学其他主题。

同态加密

通常,公钥密码系统(如 RSA)是乘法同态或加法同态的,比如派列尔密码系统,称为部分同态系统。加法同态系统适用于电子投票和银行业务应用。直到最近,没有支持两种操作的系统,但在 2009 年,Craig Gentry发现了一个完全同态系统。由于这些方案允许对加密数据进行处理而无需解密,它们有许多不同的可能应用,特别是在需要保护隐私但数据也需要由潜在不受信任的方进行处理的场景,例如,云计算和在线搜索引擎。同态加密的最新发展非常有前景,研究人员正在积极努力使其更加高效和实用。这在区块链技术中特别感兴趣,如后面的书中所述,因为它可以解决区块链中的机密性和隐私问题。

签名加密

签名加密是一种公钥密码学原语,提供了数字签名和加密的所有功能。它是由Yuliang Zheng发明的,现已成为 ISO 标准 ISO/IEC 29150:2011. 传统上,签名然后加密或先加密后签名方案用于提供不可伪造性,认证和不可否认性,但是使用签名加密,数字签名和加密的所有服务都是在成本低于先签名后加密方案的情况下提供的。

这是**成本(签名和加密) << 成本(签名)+ 成本(加密)**的单一逻辑步骤。

零知识证明

零知识证明是由GoldWasserMicaliRackoff引入的。这些证明用于证明关于一个断言的有效性而毫无关于该断言的任何信息。零知识证明需要满足完整性,准确性和零知识性等三个属性。

完整性确保如果某个断言为真,则验证者将被证明者说服。完备性属性确保如果一个断言为假,则没有不诚实的证明者能够说服验证者相反。零知识属性,顾名思义,是零知识证明的关键属性,它确保关于断言除了它是真还是假之外绝对不会透露任何信息。

零知识证明在区块链领域引起了研究人员的特别关注,因为其隐私属性在金融和许多其他领域(如法律和医学)中非常受欢迎。零知识证明机制成功实现的一个最新例子是 Zcash 加密货币。在 Zcash 中,实现了一种特定类型的零知识证明,称为零知识简洁非交互知识证明ZK-Snark)。这将在第五章 替代币中详细讨论。

盲签名

盲签名是由大卫·朱姆在 1982 年提出的,基于公钥数字签名方案,如 RSA。盲签名背后的关键思想是让签名者签署消息而不实际透露消息内容。这是通过在签署之前掩盖或盲化消息来实现的,因此得名盲签名。这种盲签名随后可以像普通数字签名一样针对原始消息进行验证。盲签名被引入作为允许数字货币方案发展的机制。

编码方案

除了加密原语外,二进制到文本编码方案在各种场景中也被使用。最常见的用法是将二进制数据转换为文本,以便可以通过不支持处理二进制数据的协议进行处理、保存或传输。例如,有时,图像以 base64 编码的形式存储在数据库中,这允许文本字段能够存储图片。一个常用的编码方案是 base64。另一个名为 base58 的编码方案因其在比特币中的使用而广受欢迎。

密码学是一个广阔的领域,本节介绍了从一般密码学到区块链和加密货币的角度理解密码学所必需的基本概念。在下一节中,您将介绍基本的金融市场概念。

即将到来的部分描述了关于交易、交易所和交易生命周期的一般术语。更多相关信息将在后面的章节中提供,讨论具体的用例。

金融市场和交易

金融市场的存在是为了促进储蓄者向投资者的转移。在经济体系中,有两个部门,即家庭和企业。金融市场在本质上充当储蓄者和投资者之间的中介。基本上有三种类型的市场,即货币市场、信贷市场和资本市场。货币市场是短期市场,资金被借给公司或银行进行银行间贷款。外汇市场或 FX 是另一种货币市场的类别,其中货币进行交易。信贷市场主要由零售银行组成,他们从中央银行借款,然后以抵押贷款或贷款的形式将其贷给公司或家庭。

资本市场促进金融工具的买卖,主要是股票和债券。资本市场可分为两种类型,即一级市场和二级市场。股票是公司直接向投资者发行的,而在二级市场,投资者通过证券交易所将其证券转售给其他投资者。各种电子交易系统被交易所用来促进金融工具的交易。

交易

市场是交易员进行交易的地方。它可以涵盖各种资产类别。

交易可以定义为交易员购买或出售各种金融工具以获取利润和对冲风险的活动。投资者、借款人、套保者、资产交换者和赌徒是交易员的几种类型。当交易员欠款时,他们持有空头头寸,例如,如果他们卖出了一份合同,而当他们购买一份合同时,他们持有多头头寸。有各种方式进行交易,例如通过经纪人或直接在交易所或场外进行交易。经纪人是为客户安排交易的代理人。经纪人代表客户以给定价格或以最佳可能价格进行交易。

交易所

交易所通常被认为是一个非常安全、受监管和可靠的交易场所。最近,与传统的基于交易大厅的交易相比,电子交易越来越受欢迎。现在,交易员将订单发送到中央电子订单簿,然后通过通信网络将订单、价格和相关属性发布到所有关联系统,从而实质上创建了一个虚拟市场。只有交易所的成员才能进行交易。为了在没有这些限制的情况下进行交易,交易对手可以直接参与场外交易。

订单和订单属性

订单是交易的指令,是交易系统的主要组成部分。它们具有以下一般属性:

  1. 工具名称。

  2. 数量。

  3. 方向(买或卖)。

  4. 代表各种条件的订单类型,例如,限价订单和止损订单,例如 1500 股英国苏格兰皇家银行普通股,价格为 15.50 英镑。

订单是根据买入价和卖出价进行交易的。交易员通过将买入价和卖出价附加到其订单上来表明他们的买入或卖出意向。交易员将购买的价格称为买入价。交易员愿意出售的价格称为卖出价。

订单管理和路由系统

订单路由系统根据业务逻辑将订单路由并发送到不同的目的地。客户使用它们将订单发送给他们的经纪人,然后经纪人将这些订单发送给经销商、结算所和交易所。

有不同类型的订单;最常见的两种是市价订单和限价订单。市价订单是以市场当前最佳价格交易的指令,这些订单立即以现货价格填补。另一方面,限价订单是以最佳价格交易的指令,但只有在不低于交易员设置的限价时才能进行交易。这也可能更高,这取决于订单的方向,即买入或卖出。所有这些订单都在订单簿中管理,订单簿是交易所维护的订单列表,记录交易员的买卖意向。

仓位是承诺以给定价格出售或购买一定数量的金融工具,例如证券、货币或商品。交易员买卖的合同、证券、商品和货币通常被称为交易工具,并归入资产类别的大伞下。最常见的类别包括实物资产、金融资产、衍生合同和保险合同。

交易的组成部分

交易单是与交易相关的所有细节的组合。然而,根据工具和资产类别的不同,可能会有一些变化,但一般来说,所有工具都具有下一节讨论的属性。

注意

基础工具

基础工具是交易的基础。它可以是货币、债券、利率、商品或股票。

一般属性

这包括与每笔交易相关的一般识别信息和基本特征。常见属性包括唯一 ID、工具名称、类型、状态、交易日期和时间。

经济

这些是与交易价值相关的特征,例如买入或卖出价值、标记、交易所、价格和数量。

销售

销售指的是与销售特征相关的详细信息,例如销售人员的姓名,它只是一个信息字段,通常不会对交易生命周期产生任何影响。

交易对手方

交易对手方是交易的重要组成部分,因为它显示交易的另一方,并且需要成功结算交易。通常的属性包括交易对手方名称、地址、付款类型、任何参考 ID、结算日期和交付类型。

交易生命周期

一般的交易生命周期包括从下单到执行再到结算的各个阶段。这个生命周期将逐步描述如下:

  • 执行前:在这个阶段下达订单。

  • 执行和预订:当订单匹配并执行时,它就转变为一笔交易。在这个阶段,双方之间的合同就正式成熟。

  • 确认:这是双方同意交易细节的阶段。

  • 预定后:这个阶段涉及各种审核和验证过程,以确保交易的正确性。

  • 结算:这是交易过程中最关键的部分,此时交易已经最终确定。

  • 隔夜(日终处理):日终处理包括报告生成、盈亏计算和各种风险计算。

  • 在所有提到的流程中,都涉及许多人员和业务功能。通常,这些功能被划分为前台、中台和后台等功能。

在接下来的章节中,你将了解一些概念,这些概念对于理解监管金融行业的严格和必要规则和法规至关重要。一些概念在此处描述,而在后续章节中将讨论特定用例,这些想法将帮助你理解描述的场景。

订单预期者

订单预期者试图在其他交易员能够进行交易之前获利。这基于一种预期,其中交易员知道其他交易活动将如何影响价格。抢先者、情绪导向的技术交易者和挤压者都是订单预期者的一些示例。

市场操纵

在英国和其他国家,市场操纵是严格违法的。欺诈交易员可能在市场中传播虚假信息,导致价格波动,从而获得非法利润。通常,操纵市场行为是以交易为基础的,其中包括普遍和特定时间的操纵。可能导致人为股票短缺、虚假活动印象和价格操纵以获得犯罪利益的行动都包括在这一类别中。

之前讨论的这两个术语与金融犯罪相关。并且有可能开发基于区块链的系统来阻止市场滥用。这将在后续章节中详细讨论,特定用例将在那时讨论。

总结

本章旨在介绍密码学和金融市场的概念,以便为您理解后续章节中提供的材料提供背景信息。首先,您被介绍了密码学的基础知识,然后介绍了各种方案,如对称和非对称密码。通过使用 OpenSSL 命令行展示了一些实际示例,以便您可以尝试各种命令并第一手体验各种密码功能。此外,在本章开头提供了一些数学背景知识,特别是椭圆曲线密码学。本章介绍的所有密码学概念都与区块链技术相关,并已实施或已提出在各种区块链、加密货币和相关生态系统中实施。此外,您还对金融行业进行了简要介绍,因为它为稍后在本书中与分布式分类账技术相关的各种示例设定了背景。由于密码学和金融是广泛的主题,本章涵盖的材料旨在是入门性质的(有一些例外情况),特定主题将在后续章节中在相关和必要时进行更详细的扩展。

本站无任何商业行为
个人在线分享 » 精通区块链(一)
E-->