2.2 区块链加密技术

从计算机科学角度来看,区块链是一种分布式数据库,不同的节点拥有相同的数据记录,包含经节点确认的数据信息的区块从后向前呈链状结构有序连接,利用密码学的方式保证了数据在传输过程和之后访问过程的安全,加密技术保护了区块链中的数据安全,从而保证了区块链不可篡改和不可伪造的特性。

2.2.1 哈希函数

哈希算法在区块链中有着广泛的使用,交易信息的存储、工作量证明算法、密钥对的产生等过程中都有哈希算法的存在。

哈希(Hash)也被翻译为散列。任意长度的输入经过散列函数,都能够输出为固定长度的值,该输出就是散列值。SHA(secure Hash algorithm)也被称为安全散列算法,直译为哈希算法,由美国国家安全局所设计,由美国国家标准与技术研究院发布。SHA家族现有五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,后四者并称为SHA-2。

如果将区块链看作一个公共账本,节点中每个人都备份一份账本数据,任何人都可以对账本上的内容进行写入和读取。如果有用户对内容进行了恶意篡改,依照少数服从多数的原则,将差异数据与全网数据进行比较后,就能够发现存在的异常。但是,账本上的内容随着时间的累积,数据量必然会越来越庞大,如果将交易数据进行原始存储,利用大量数据直接进行比对,工程量对于一个货币系统而言是十分不现实的。对此,在交易信息的存储中,区块链利用了哈希函数能够方便实现数据压缩的特性:一段数据在经过哈希函数的运算后,就能够得到相较而言很短的摘要数据。将函数大致表示为:

Hash(原始信息)=摘要信息

同时,哈希函数如下特点,也保证了数据的不可篡改性。

(1)相同的原始信息经过相同哈希函数能够得到相同的摘要信息。

(2)不同的原始信息经过相同哈希函数得到的摘要信息差距很大。

(3)不可逆性,即从摘要信息无法倒推出原始的输入信息。

以比特币为例,交易信息存储在区块中,就区块头中涉及的哈希摘要信息就包含了父区块哈希和MerkleRoot标识的区块的交易哈希。父区块哈希为上一个区块的哈希值,高度概括上一个区块的全部字段信息。简单表示如下:

n块的区块哈希=Hash(第n-1块的区块哈希,第n块的交易信息)

n-1块的区块哈希便是第n块区块的父哈希,因此,即使每个区块内的交易数据是相互独立的,区块间的连接仍依赖于上一个区块的哈希值,当链上任何一区块中的任一交易数据被篡改,都将直观地反映到最新的区块哈希上。对于哈希函数,不同的原始信息经过相同的函数作用得到的摘要信息差距是极大的。就SHA-256而言,多一个点,多一个空格,计算结果完全不同,记录发生微小的变动,SHA-256的计算结果完全变了,而且变化的结果没有任何规律可循。

例如,下面几条非常相似的记录,它们的SHA-256加密结果却完全不同:

(1)SHA-256(韩梅梅支付李磊30元)=

1B416389C118C96D6389154CABEAC5688E2999E9953D654640C106421D16F7F8

(2)SHA-256(韩梅梅支付李磊□30元)=

43C0F7E9BAE71A1EBAE494C531DB52EA4A824F25756BF29508A133B2B437CCD8

(3)SHA-256(韩梅梅□支付李磊30元)=

0E5A5A43723B41E3DEF901228B56D2CF19D9C3F2A0D052AD0A52A4E1F52D226A

(4)SHA-256(韩梅梅支付了李磊30元)=

A0D05103342B52404239D3017784EB1B9572BA60CAC92523426DF7576A17732E

但是,相同的输入信息通过哈希函数得到的摘要信息是完全相同的。只要记录的内容相同,则无论谁来计算,SHA-256的结果是不变的。网上有计算工具(例如,http://tool.oschina.net/encrypt和https://1024tools.com/hash这两个网址都提供各种加密计算),无论任何人任何时间任何地点用任何设备,只要输入相同的内容,就能得到相同的SHA-256计算结果。

哈希函数不仅仅在确保全网数据一致性上发挥了作用,在账户所有权的证明中同样利用了哈希函数,具体将在3.2.1节中进行讲解。

哈希函数的特点决定了其在比特币网络、区块链中的不可或缺。哈希函数在简化、标识、隐匿和验证信息的过程中都有着独特的作用,算法的安全性也能够得到保证。

2.2.2 非对称加密

加密算法一般分为对称加密和非对称加密。对称加密算法也称为单密钥加密,同一个密钥同时作为信息的加密和解密,如果在分布式网络中,使用对称加密,如何将对应的密钥发送给需要解密信息的人是一个很难解决的问题。因此在区块链中大量采用了非对称加密。

非对称加密中含有一个密钥对:公钥和私钥。私钥由一方安全保管,不轻易外泄,而公钥可以发送给任何人。非对称加密算法密钥对中一个进行加密,另一个进行解密。目前最常用的非对称加密算法是RSA算法。中本聪在比特币区块链网络中采用了椭圆加密算法,在保护传送信息内容的同时,能够让消息的接收方确定消息来源的身份,同时确保了身份的私密性。

1. 椭圆加密算法

在拜占庭将军问题的解决方案中,为了追溯信息传递根源,采用签名信息的机制。倘若在古代,无法造假的真正可信的签名体系难以实现。但是在最开始的比特币区块链中,中本聪利用非对称加密技术为用户的信息签名。实现了消息传送的私密性、签名不可篡改伪造,同时能够确认身份,将一个不可信的分布式网络变成了一个可信的网络。

椭圆加密算法属于非对称加密算法中的一种。非对称加密算法会产生密钥对,包括一个私有密钥(后简称私钥)和由私有密钥衍生的公开密钥(后简称公钥)。如果使用公钥对数据加密,那么只有对应的私钥才能解密;如果使用的是私钥加密,那么使用对应的公开公钥就能对信息解密。因为私钥和公钥是两种不同的密钥,因此这种算法称作非对称加密算法。

区块链技术中,加密算法不仅需要满足单方向计算容易、但反方向无法倒推的特点,同时还需要实现其他节点能够独立对签名信息进行验证,而非对称加密算法的特性十分贴合需求。在实际使用中,从随机数生成私钥,公钥通过椭圆曲线算法计算得到,过程不可逆,只能通过暴力搜索得到。

椭圆加密算法是一种基于离散对数问题的非对称加密算法,利用曲线上的点进行加法或者乘法运算。其中比特币区块链技术中选择了secp256k1标准定义的一条特殊的椭圆曲线和一系列数学常数。

secp256k1曲线由下述函数定义,该函数可产生一条椭圆曲线:

y2=(x3+7)over(Fp

y2modp=(x3+7)modp

图2-5 比特币中实际使用的函数曲线

上述modp(素数p取模)表明该曲线是在素数阶p的有限域内,也写作Fp,其中p=2256-232-29-28-27-26-24-1,这是一个非常大的素数。定义在素数域的曲线很像一些离散的点集,实际很难表示,因此使用图2-5中的曲线对比特币区块链中使用的函数曲线进行近似描述。

加法运算的定义是:两个点的加法结果是两点的连接和曲线的交点关于x轴的镜像。确定曲线上一个点为基点P,由私钥推得公钥的算法很简单,公钥Q就定义为KP相加,K为私钥:

具体的几何定义如图2-6所示。相加存在两种情况,PQ为相同点和PQ为不同点。如果PQ为相同点,那么PQ的连线就是P的切线,曲线上有且只有一个新的点与该切线相交,切线斜率可根据微分求得。如果PQ为不同点,那么重复根据加法运算定义进行求解即可。

图2-6 椭圆曲线加法几何示意图

理论上讲,目前由椭圆曲线公钥求解私钥的最有效算法的复杂度为O),其中p是阶数n的最大素因子。当参数选的足够好让p>2160时,以目前的计算能力,攻破椭圆曲线是不现实的。

2. 密钥对的应用

以比特币网络为例,私钥证明了用户对于账户的所有权,如果用户想要使用某个账户中的比特币,只有拥有该账户对应的私钥,才能如愿使用。在登录认证的场景中,用户输入私钥信息,客户端使用私钥加密登录信息后发送给服务器,服务器接收后采用对应的公钥解密认证登录信息。

此外,在比特币交易中用户使用私钥对交易进行签名,交易信息广播后,验证节点通过公钥对信息进行解密,从而确保信息是由A发送的,具体内容在3.3.2节还会详细介绍。

区块链网络充分利用了非对称加密的特性,一是使用其中一个密钥加密信息后,只有对应另外一个密钥才能解开;二是公钥可以向其他人公开,公钥不能逆推出私钥,保证了账户安全性。而现在的区块链系统中,根据实际需要已经衍生出了多种私钥加密技术,以便满足更为灵活和复杂的应用场景。