
1.1 密码学基础
古典密码学主要关注信息在保密形式下的书写和传递,以及与其相对应的破译方法。而现代密码学则起源于20世纪末出现的大量相关密码理论,是数学和计算机科学的分支,同时大量涉及信息论。现代密码学不只关注信息保密问题,还同时涉及信息完整性验证,信息发布的不可抵赖性(即数字签名),以及在分布式计算中产生的来自内部和外部攻击的所有信息安全问题。
现代密码学的发展促进了计算机科学的发展。如今,密码学已被应用在日常生活中,包括ATM的芯片、计算机访问密码、电子商务等领域。
区块链技术中使用了多项密码学内容,主要包括哈希算法、密钥加密和数字签名。
1.1.1 哈希算法
哈希(Hash)函数有多种叫法,如密码散列函数、消息摘要函数、杂凑函数,它不一定使用密钥,但它和许多重要的密码算法相关。它将输入数据(通常是一整份文件)输出成较短的固定长度散列值,这个过程是单向的,两个不同的输入产生相同的散列值这种情况的发生概率非常小。
简而言之,哈希算法是将任意长度的字符串映射为较短的固定长度的字符串。例如,比特币使用的是SHA-256摘要算法,对任意长度的输入给出的是256位的输出。
那么,加密货币中哈希算法的应用有哪些呢?
1.加密哈希函数
加密哈希函数有如下特性。
● 确定性:无论在同一个哈希函数中解析多少次,如果输入的内容相同,得到的总是相同的输出。
● 高效运算:计算哈希值的过程是高效的。
● 抗原像攻击,即隐匿性:对一个给定的输出结果,不可逆推出输入。
● 细微变化影响:任何输入端的细微变化都会对哈希函数的输出结果产生剧烈影响。
加密哈希函数对区块链的安全性和挖矿有巨大的作用。
2.数据结构
密码学中,有两种数据结构对于理解区块链非常重要:链表和哈希指针。
链表是依次按顺序连接而成的数据区块,如图1.1所示。

图1.1
链表中的每一个区块都通过指针指向另一个区块。
区块链本质上是一个链表,其中的每个新区块都包含一个哈希指针。指针指向前一区块及其含有的所有数据的哈希值。正因如此,区块链拥有了不可更改的重要特性。
那么,区块链是如何实现不可更改性的呢?
假设有人尝试篡改区块中的数据,我们先看加密哈希函数的第三条特性——“细微变化影响:任何输入端的细微变化都会对哈希函数的输出结果产生剧烈影响。”那么,即便有人尝试对1号区块里的数据进行细微的改写,也会使得存储在2号区块里的1号区块的哈希值产生巨大的变化,这将导致2号区块的哈希值发生变化,进而影响存储在3号区块的哈希值。3号影响4号,4号影响5号……最终整条区块链上的数据都会发生变化。这种通过冻结整条链条来修改数据的方式几乎是不可能做到的。因此,区块链被认定具有不可更改性。
每个区块都有自己的梅克尔根(Merkle Root)。如图1.2所示,如果每个区块里都包含多笔交易,将这些交易按线性存储,那么在所有交易中寻找一笔特定的交易会变得非常麻烦。这就是我们使用梅克尔树的原因。

图1.2
如图1.3所示,在梅克尔树中,所有个体交易通过哈希算法都能向上追溯至同一个根,这会使搜索变得非常容易。因此,如果想要在区块里获取某一特定的数据,我们可以直接通过梅克尔树里的哈希值来进行搜索,而不用进行线性访问。

图1.3
3.挖矿
哈希算法对挖掘新的加密区块至关重要,其工作原理是难度值的调整。一个被命名为“nonce”的随机字符串被添加到新区块的哈希值上,然后被再次哈希。接着,检验其是否低于已设定的难度值水平。如果低于,那么产生的新区块会被添加至链上,而负责挖矿的矿工就会获得奖励。如果没有低于,则矿工继续修改随机字符串“nouce”,直至低于难度值水平的值出现。
所以,没有密码学中的哈希算法,就没有加密货币的挖矿,哈希算法是区块链和加密经济学中一个至关重要的部分。
1.1.2 密钥加密
密钥加密包括对称密钥加密和公开密钥加密。
对称密钥加密是密码学中的一种加密法。如果转换数据中的一个数字、字母或字符串随机字母,密钥便会以特定的方式变更数据里面的文字或字母,例如,更换字母相对位置(one变成neo)。只要寄件者与收件者知道秘密密钥,他们就可以加密和解密数据,并使用这个数据。
公开密钥加密,简称公钥密码学,又称非对称密钥密码学,是密码学中的另一种加密法。相对于对称密钥密码学,其最大的特点在于加密和解密使用不同的密钥。使用加密密钥加密后所获得的数据,只有用该用户的解密密钥才能够解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了其中一个密钥,并不会危及另外一个,公开的密钥为公钥,不公开的密钥为私钥。
在对称密钥密码学中,加密和解密使用相同的密钥,也许对不同的消息使用不同的密钥,但都面临密钥管理的难题。由于每对通信方都必须使用异于他组的密钥,当网络成员的数量增加时,密钥数量呈二次方增加。更尴尬的难题是:当双方不存在安全的通道时,如何创建一个共有的密钥以安全通信?如果有通道可以安全地创建密钥,为何不使用现有的通道?这真是个“鸡生蛋、蛋生鸡”的矛盾。
1.1.3 数字签名
公开密钥密码学最显著的成就是实现了数字签名。数字签名是公开密钥基础建设(public key infrastructures, PKI),以及许多网络安全机制(SSL/TLS,虚拟专用网等)的基础。顾名思义,数字签名就是日常生活中普通签名的数字化,特性是他人可以轻易制造签名,却难以仿冒。数字签名可以永久地与被签署消息结合,无法自消息上移除。
数字签名大致包含两个算法:一个是签署,使用私密密钥处理消息或消息的散列值而产生签名;另一个是验证,使用公开密钥验证签名的真实性。RSA和DSA是两种最流行的数字签名机制。
想象一下,在现实生活中,我们为什么签名,签名的作用是什么,又有哪些特性?
● 签名是可被验证的。要可以证明确实是你的笔迹。
● 签名是不可伪造的。没有其他人能够伪造你的签名。
● 签名是不可抵赖的。如果你使用自己的签名签署文件,那这个文件的有效性将无法收回,你也无法声称是他人代替你签的名。
但是,在现实生活中,无论签名有多复杂,都有被伪造的可能性。因为你无法通过简单的视觉辅助工具(如笔迹鉴定)来真正地验证签名的有效性,这样做既无效率也不可靠。
密码学给了我们一种通过公钥和私钥来解决问题的方案。让我们看看这两种密钥的工作原理和其对加密货币系统的促进作用。
假设有两个人,A和B。A想要给B发送一些非常重要的数据,而B想要鉴别这些数据确实来自于A,他们可以通过使用A的公钥和私钥来实现这一目标。正如其名,公钥指公开的密钥,可以被任何人获取。而私钥是个人拥有的密钥,不可以与他人分享。并且,通过某人的私钥来确定其公钥也是不可行的。
再回到A给B发送数据的话题,他们要使用密钥来交换信息,具体该如何操作呢?
假设A想把信息M发送出去,A有一把私钥K1和一把公钥K2。那么,当他把信息发送给B时,他会用私钥将该条信息加密,于是信息变成了K1(M)。当B收到这条信息时,他可以使用A的公钥来取回信息——K2K1(M),于是便得到了原始信息M。
综上所述,A有一条信息M,当他用私钥K1对其进行加密之后,得到加密信息K1(M)。B随后使用A的公钥K2来解密这条加密信息K2K1(M),从而得到原始信息M。
通过图1.4可以更直观地看到上述过程:

图1.4
让我们联系日常生活中的签名来重新审视密码学里的数字签名特性。
● 可验证性:如果加密信息能够用Al的公钥进行解密,那就可以100%确定是A发送了该条信息。
● 不可伪造性:如果有其他人C拦截了该条信息,并用自己的私钥发送了一条自己的信息,那么A的公钥将无法对其解密,因为A的公钥只能用来解密A用自己的私钥加密过的信息。
● 不可抵赖性:同样,如果A宣称,“我没有发送信息,是C发的”,但B却能够用A的公钥来解密信息,那就证明A在撒谎。如此,A就无法收回他之前发出的信息,无法抵赖。