什么是密码学?
密码术是开发防止第三方查看私人数据的协议的做法。现代密码学结合了数学,计算机科学,物理,工程等学科。一些重要的术语定义如下:
- 加密:将文本编码为不可读的格式。
- 解密:保留加密 – 将混乱的消息转换为其原始形式。
- 密码:用于执行加密或解密的算法,通常是可以遵循的明确定义的一组步骤。
现代之前的密码学是加密的同义词 – 将信息从可读格式转换为无意义的东西的过程。加密技术可以追溯到古埃及人,并且历史悠久。
例如,Caesar Cipher是Julius Caesar用来与他的将军安全沟通的着名密码。密码将消息中的每个字母“移动”一定量 – 移位为2,A将变为C,B将变为D,依此类推。
区块链技术以多种不同的方式使用密码术 – 用于钱包,交易,安全和隐私保护协议。本文将介绍与区块链技术相关的一些重要加密主题,包括公钥加密,散列和Merkle树。
公钥加密
公钥加密(也称为非对称加密)是一种使用一对密钥的加密系统 – 公钥和私钥。公钥可以广泛分发,但私钥仅由其所有者知道。密钥始终成对创建 – 每个公钥必须具有相应的私钥。
公钥加密最常用于以安全的方式加密两个人或两台计算机之间的消息。任何人都可以使用某人的公钥来加密消息,但一旦加密,解密该消息的唯一方法就是使用相应的私钥。
假设Alice想要向Bob发送加密消息。它会像这样工作:
- Alice使用Bob的公钥来加密消息。
- Alice将加密的消息发送给Bob–如果第三方拦截了它,他们所看到的只是随机数字和字母。
- Bob使用他的私钥来解密和阅读消息。
说明此过程的图表如下所示:
资料来源:韦尔斯利学院
公钥加密是区块链技术的基本要素 – 它是钱包和交易的基础技术。当用户在区块链上创建钱包时,他们正在生成公钥 – 私钥对。
该钱包的地址,或者它在区块链中的表示方式,是由公钥生成的一串数字和字母。由于区块链技术的性质,这个地址对每个人都是公开的,可用于检查钱包中的余额或向其发送硬币。
与钱包相关联的私钥是如何证明所有权和控制钱包。这是从中发送硬币的唯一方法,丢失的私钥意味着里面的硬币将永远卡在那里。
区块链上的交易只不过是一条广播信息,主要是说:“从我的钱包中取出X币并将X币存入另一个钱包”。确认后,交易将不可变地写入分类帐,并更新余额。
但是,此交易消息要求来自发送钱包的私钥的签名有效。广播后,任何人都可以使用该钱包的公钥来确保来自私钥的数字签名是真实的。这是块验证器在将任何事务(即消息)添加到区块链之前的一个角色。
密码哈希
加密散列是区块链技术的另一个基本要素,它直接负责产生不可变性 – 区块链最重要的特征之一。
哈希是一个计算机科学术语,意味着获取任意长度的输入字符串并产生固定长度的输出。如果某个散列函数的输入是3或100个字符无关紧要,则输出的长度始终相同。
加密哈希函数*是具有以下关键属性的哈希函数:
- 确定性:无论你为函数提供多少次特定输入,它都将始终具有相同的输出。
- 不可逆:无法确定函数输出的输入。
- 碰撞阻力:没有两个输入可以具有相同的输出。
加密散列函数的另一个重要特性是改变输入中的任何数据位都会大大改变输出。例如,111111和111112的散列输出将是完全唯一的并且彼此无关。
密码散列函数最常用的用例是密码存储。大多数网站都不存储你的原始密码 – 它们存储你的密码哈希值,并在你在给定的站点访问时输入密码时检查哈希是否匹配。如果黑客入侵他们的数据库,他们只能访问不可逆转的密码哈希值。
那么,加密哈希如何为区块链技术提供不变性?答案是每个新的数据块都包含前一个块中所有数据的哈希输出。
想象一下刚刚添加了第1000块的区块链。来自块999的数据在块1000中作为散列函数输出存在。然而,包括在块999中的数据是块998的数据的散列,其包含块997的数据的散列。
通过向后遍历散列,从1000到1的每个块都通过加密散列链接。该架构的图表如下所示:
资料来源: Block Geeks
这最终是使区块链中的数据不可变的原因。如果有人试图在任何过去的块中仅更改1位数据,那么它不仅会改变该块数据的哈希输出,而且会改变其后的每个块。网络上的矿工和节点会立即注意到所产生的散列与其链的版本不匹配并拒绝更改。
*作为参考,比特币使用称为SHA-256的加密哈希函数,而以太坊使用keccak256。
Merkle树
上图是区块链的简化版本,省略了一些重要信息。它有一个箭头,表明每个块的事务都存储在Merkle根中,Merkle根是Merkle树的根节点。
对于上下文,树是用于以分层树状结构存储数据的计算机科学术语,其中数据位被称为节点。有一个根(顶部)节点,其下面链接有“子”节点,它们本身有子节点,依此类推。说明典型树数据结构的图如下所示:
来源: 教程点
如图所示,树中的节点组称为子树,没有子节点的节点(其下没有数据)称为叶节点。
Merkle树(或哈希树)是利用加密散列函数来存储散列输出而不是每个节点中的原始数据的树。每个叶节点由其原始数据的加密散列组成,并且每个父节点是其子节点散列的组合的散列。
Merkle根只是Merkle树的根(顶部)节点,这意味着它代表左右子树的组合哈希的哈希输出。具有4个叶节点的Merkle树的图如下所示:
资料来源:Shaan Ray
每个叶节点表示事务A,B,C和D的数据的散列。然后将散列A和散列B组合并散列以产生散列AB,并且以相同的方式产生散列CD。最后,散列AB和散列CD被组合并散列以形成树的Merkle根。
那么为什么Merkle树对区块链技术很重要呢?
使用Merkle根并应用加密散列函数的属性,可以快速判断给定块中的事务是否已被篡改以及特定事务是否被篡改。
如果确认块中的单个事务被更改,则Merkle根将最终与“正确”Merkle根完全不同,并且篡改将是显而易见的。
Merkle树还允许用户验证他们的事务已被包含在块中而无需下载整个区块链。诸如简化支付验证之类的流程能够遍历Merkle树中的分支,并检查某个事务是否已经散列到该树中。如果不在每个区块中包含Merkle根,则区块链技术的这种效率水平是不可能的。
区块链中4个事务的Merkle树示例如下所示(在此图中,Tx_Root是Merkle根):
资料来源:Block Geeks
结论
密码学是区块链技术内部工作的一个组成部分。公钥加密作为区块链钱包和交易的基础,加密哈希函数提供不变性的特征,Merkle树组织交易,同时使区块链更有效。