区块链中应用到的密码学主要包括以下几方面:
数字摘要
区块链本质上是一种分布式数据存储方式,每一个数据区块之间靠数字摘要建立起联系,比如比特币中每一个区块都包含了它前一个区块的摘要值。因此数字摘要是区块链中应用最广泛的密码学技术,也是区块链的核心技术之一。
区块链中常用的数字摘要算法是SHA-256和RIPEMD160,其中SHA256是构造区块链所用的主要摘要算法。比如在比特币中,SHA256主要用于完成PoW(工作量证明)计算,也就是挖矿;在HyperLedger-Fabric区块链平台中,主要用于检测数据未经授权的修改,签名者的身份识别和抗抵赖。区块链中每一区块除了自身的数据外,还包含了前一区块数据的数字摘要值,并通过指针指向前一区块,这样的列表结构建立起了了整个链条。
如果攻击者篡改了某一区块(比如第K块)的值,那K+1块的保存的H(K)就和K摘要计算的值不一致,攻击者为了掩盖篡改,可以修改K+1块中的H(K)的值,但这样K+2块的H(K+1)与K+1块摘要计算结果又不一致,攻击者不得不继续修改H(K+1)值……以此类推,攻击者理论上要修改从K+1块开始的区块链上所有的节点数据才能不被发现,这在实践上根本不可行,而且某些特殊节点数据是无法被修改的。这就是区块链保证数据防篡改的原理。
Merkle树
默克尔树,它是基于数字摘要的二叉树或多叉树。Merkle树最底层节点包括了区块数据和它的数字摘要值,其它层的节点则包含了下层两个子节点数据合并后的摘要值。其结构示例如下。
Merkle树的特点是底层节点的数据变化可以一层层传递到最上层节点;反过来讲,通过最上层节点就可以监测底层节点数据的变化情况。利用这个特点,区块链中使用Merkle树可以实现数据快速比较、节点快速定位,而不需要下载整个链上数据。比特币中的简单支付验证(SPV)就是基于Merkle树的一个典型应用。
数字签名
区块链使用数字签名来确认交易者的身份。比如在加密货币交易中,交易的发起方将交易信息进行数字签名,并将签名结果提交给矿工,矿工使用签名用户的公钥验证签名,验证通过,则交易信息记账,完成交易。区块链中使用的数字签名算法都是基于ECC的,如比特币中使用的是基于secp256k1椭圆曲线密码算法。
对称加密
区块链中也有涉及到使用对称加密的应用场景。如比特币官方客户端使用AES(对称分组密码算法)加密钱包文件,确保客户端私钥的安全。
HMAC
HMAC是Hash-based Message Authentication Code的简称,翻译成中文是基于Hash的消息认证码。它的前身就是MAC(消息认证码)。其实HMAC运算和数字签名有些类似,数字签名是使用私钥对数字摘要进行非对称加密,而HMAC则使用协商**对数字摘要进行对称加密(知道这一点,HMAC的过程就不用再描述了)。因此可以把HMAC看作数字摘要的加强版,目的还是保护数据的完整性。前面讲过,数字摘要在区块链中有着极其重要的作用,因此有必要为摘要再加层密,不让它“裸奔”,使其更可靠。
同态加密
同态加密其实并不是新技术,区块链之前就有它了。同态加密的意思就是让加密后的数据继续保持加密前明文数据的运算特性和功能。举个简单的例子,对于下面的算式:
1+2=3
假设我们对1和2分别加密后得到两个密文(十六进制表示):
1-------->0x8CBD41
2-------->0x1EF9B7
然后把两个加密结果相加得到和:
0x8CBD41+0x1EF9B7=0xABB6F8
现在解密这个和,按照之前的加密方法,我们是无论如何也不可能解密出3的。但如果是同态加密,1和2加密结果的和,解密后也应该是3,即数据虽然加密了,但它的运算特性仍然保持着,这也就是所谓的“同态”。可以用如下公式表示,E表示同态加密算法,F表示数据运算, a,b,c为参与运算的明文数据:
F(E(a),E(b),E©)=E(F(a,b,c))
在区块链去中心化的结构中,很多重要敏感数据可能要在第三方的节点进行运算处理,因此需要将数据在加密状态下进行处理。这就是同态加密在区块链中的作用。
上面就简单介绍了区块链运用到的几项主要密码学技术,部分内容来自网络。区块链中的密码学实际应用过程远比文章描述复杂。如果大家感兴趣,可以参考专业的文章书籍。