1.3.1 加密算法

1.哈希算法

哈希算法是一类加密算法的统称,是信息领域中非常基础也非常重要的技术,输入任意长度的字符串,哈希算法可以产生固定大小的输出。通俗地说,我们可以将哈希算法的输出(也就是哈希值)理解为区块链世界中的“地址”,有了这个地址,就可以定位到任何区块,这就类似于在现实世界中,通过邮箱地址就可以定位到具体的某个物理地点。

哈希算法有一个很重要的特性,即“加密容易解密难”,将区块中的内容通过哈希算法加密是很简单的事情,但是想从加密后的数据中解密出原始数据,以目前的计算技术,几乎是不可完成的。就像在现实世界中,我们不太可能从“邮箱地址”倒推出房屋结构、家庭成员等隐私信息。

区块链上的数据一旦通过哈希加密,哪怕被黑客截获,想破解出其中的原始内容,也是极为困难的,这就保证了区块链节点上的数据安全。比特币诞生以来遭受过无数次攻击,但依然运作良好,这足以说明哈希算法的价值。

哈希算法还有一个重要的特征是“雪崩效应”,指即使对原始输入数据只进行小改动,结果也会有非常大的差异。我们来看一个哈希算法例子,使用SHA-256(一种常用的哈希算法)进行测试,如图1-9所示。

图1-9 一个哈希算法的例子

可以看到,即使只改变了输入的第一个字母的大小写(This变为this),输出哈希值也天差地别,没有任何相关性,因此破解哈希值十分困难。根据密码学的研究,按照目前的计算机算力,想彻底破解哈希值,需要经过上万年的计算,这就保证了哈希加密技术的可靠性。

可能有人会感到疑惑,将来量子计算成功后,是不是就可以破解哈希了?量子计算从理论到应用还有几十年的路程,短期还看不到实际应用的可能性。此外,即使量子计算真的出现了,肯定也会诞生新的加密算法,所谓“有矛就有盾”,普通用户大可不必为此担忧。

2.非对称加密

非对称加密是指加密和解密使用不同密钥的加密算法,又称公私钥加密,这是目前信息安全领域使用最广的加密模式。我们日常生活中的“用户名/密码”模式是对称加密,加密用的密码和解密用的密码相同,其效率高、简单易行,但是安全性不够,一旦密码泄露,内容就会被窃取。

非对称加密采用公钥和私钥两个密钥,在区块链网络中,每个节点都拥有唯一的一对私钥和公钥。公钥是公开的部分,就像银行的账户;私钥是非公开的部分,就像账户密码。使用这个密钥对时,如果用其中一个密钥加密一段数据,则必须用另一个密钥解密,即“公钥加密,私钥解密”或“私钥加密,公钥解密”。用户接收文件的非对称加密过程如图1-10所示。

图1-10 用户接收文件的非对称加密过程

非对称加密具有双向性,即公钥和私钥均可用于加密,同时另一个用于解密,于是不同加密方向便产生了不同的应用。

其中一个应用就是加密通信,其路径是:明文→公钥加密→密文→私钥解密→明文。例如,李四想利用非对称加密算法私密地接收张三向他发送的信息,步骤如下。

第一步:李四需要使用具体约定的算法(如RSA)生成密钥和公钥,密钥自己保留,公钥对外公布。

第二步:张三拿到李四的公钥后,便可以对想要发送的消息“张三已向李四转账1BTC,请查收”进行加密。

第三步:张三将密文(如“FH39kkJ+shi3dabcg35”)发送给李四。

第四步:李四收到消息后,用自己的私钥进行解密,还原出消息原文“张三已向李四转账1BTC,请查收”。

因为只有李四拥有私钥,所以黑客就算劫持了消息,也没有办法解密,保证了通信的安全性。加密通信过程如图1-11所示。

图1-11 加密通信过程

在这个过程中,发起方无须暴露自己的私钥,就可实现保密,只有拥有私钥的一方能解密信息。比特币交易的解密与验证过程与此类似,如图1-12所示。

图1-12 比特币交易的解密与验证过程

公钥有很多不同的实现方法,RSA算法是最知名的一种。RSA算法基于一个十分简单的数论事实:将两个大质数(素数)相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。例如,取两个简单的质数89、97,得到两者乘积8633很简单,但是对8633进行因式分解的工作量很大。

非对称加密技术是目前互联网信息安全的基石,它确保了区块链上的数据足够安全。

非对称加密的另一个重要应用是数字签名。在比特币系统中,类似“张三已向李四转账1BTC,请查收”这样的消息最终会被矿工记录在账本上,因为其与转账双方利益相关。这样一条消息的受益方是李四,那么如果李四一直向网络中广播张三给他转账的消息呢?因此,我们需要一种机制来证明张三是自愿的,也就是消息确实是张三发出的。怎么操作呢?只要反过来,先用私钥加密就可以了,因为只有张三拥有私钥。这就是数字签名的原理。

张三发出消息的同时将数字签名发出并将公钥公开,区块链上的矿工们收到消息和数字签名后,用张三提供的公钥解密,将解出来的结果与张三的消息明文对比,如果一致,则说明这个消息确实是张三发出的,这就验证了数据来源的可靠性。

总而言之,加密算法既要保证正常的交易数据不被黑客劫持和攻击,又要保证交易者不会出现互相欺诈的情况。因此,区块链使用加密算法是为了解决公共网络上的数据安全问题。