3.1 哈希算法的基本原理
小明要读懂中本聪的论文,知道什么是区块链,首先需要掌握一些密码学的基础知识,因为整个比特币系统建立在数据加密的基础上,显然也只有这样,才能维持一个数字资产体系的安全。计算机密码学是以各类算法为基础的。所谓算法,是指为解决某个问题而设计的按一定规则执行的一系列指令。在计算机加密过程中,只有通过各类加密算法,才能把一段明文信息转换为加密信息。
对于区块链,包括其应用——比特币,哈希算法都是最常用的加密算法之一。“哈希”这个词听起来很奇怪,其实它源自英语,是“hash”这个单词的音译。哈希算法还有很多其他翻译名称,比如“散列算法”“杂凑算法”等。此前,在计算机类的文献中,“hash”常译作“散列”,但在区块链中,由于“哈希指针”“哈希树”“哈希表”等名词(见图3.1)已经约定俗成地成为固定称呼,因此本书中统一把“hash”译作“哈希”,以保持全书技术名词的一致性。
图3.1│常见的哈希名词示例
哈希算法是一种用于加密的数学运算,密码学界在哈希算法的基础上研发出了多种系列算法,例如,美国国家安全局设计的SHA系列算法。哈希算法也和我们的生活密切相关,当你去银行开一个账户时,你的取款密码实际上就是通过哈希算法进行了加密,你使用银行的U盾来存取款时,它里面的数据也是通过哈希算法处理过的,以保证数据的安全。既然哈希算法如此高明,大部分人可能会认为它非常枯燥复杂且难以理解。请不要担心,下面就用通俗的语言描述它的基本原理,即使你只知道简单的数学知识,也可以看懂。
哈希算法从本质上来说,是对一段信息的转换。打个比方,小明的单位开了个无比重要的大会,单位领导慷慨激昂地进行了3个小时的主题发言,洋洋洒洒好几万字。会后为了进行宣传,头脑灵光的小明把领导讲话的内容进行了归纳总结和加工,缩减成200个字的“豆腐块”,发表在报纸上。那么可以近似认为,小明对领导的讲话进行了一次哈希计算(即通过哈希算法进行计算),把洋洋洒洒几万字转换成了“豆腐块”。当然,实际上的哈希计算比这更复杂一点,因为它不是把信息转换成文字,而是转换成一段数字,最终这段数字和领导发言之间建立一一对应的关系。所以,可以认为,哈希计算实际上就是对信息进行映射的一种方法,它通过专门的数学方法,对原信息进行加密计算,把原信息变成一段简洁的加密数据,这样原信息和加密数据之间就形成了对应关系。原信息称为明文,加密数据称为密文。
为了加深直观的认识,下面设计一种简单的哈希算法。假设小明要给翠花写一封情书,并且想用哈希算法对它进行加密。情书开头的几个字是“翠花你好,在这个阳光灿烂的日子”。小明设计了一个名叫QS的哈希算法对这句话进行加密,具体步骤如下。
(1)首先取每个字的笔画数,比如“翠”字为14画,“花”字为7画,其他字的笔画依次为7、6、6、7、3、6、6、7、9、8、4、3。对于逗号,我们规定它的取值为0。
(2)把所有的数字相加,得到93。
通过这个简单的哈希算法,小明把情书的第一句话加密成了数字93,93就称为哈希值,也就是QS(情书第一句话)=93。如果小明所有的情书都可以这样处理,倒是可以为他节省不少苦思冥想的时间。但实际上这是行不通的,因为即使小明把93这个数字发给翠花,翠花也不知道他是什么意思。即使翠花知道这个哈希算法的细节,她也无法把哈希值“93”还原成小明情书的第一句话。因为在进行哈希计算的过程中,已经丢失了很多信息。但是,反过来说,如果翠花知道这个哈希算法,并知道“翠花你好,在这个阳光灿烂的日子”这句话,她同样可以计算得出93。也就是说,可以验证小明这句话代表的数字是93,如图3.2所示。通过哈希算法,就可以编制一个密码表,把小明的每句话和对应的密文数字放在表中,就可以根据数字来查出小明的话。
图3.2│哈希算法的计算过程示例
说到这里,大家可能会发现一个问题,如果小明情书的其他句子加密后也是数字93,那怎么知道93到底代表哪句话?确实,这个哈希算法QS过于简单,导致有很大可能使得小明其他的话在加密后也是93。也就是说,不同的明文,加密后得到的密文一样。这个问题称为“哈希碰撞”,如图3.3所示。要设计一个合格的哈希算法,必须要使得这个算法产生哈希碰撞的可能性非常小,小到在实际应用中几乎不可能出现,这样明文和密文才能一一对应。比特币系统所使用的哈希算法称为SHA256算法,它是一个优秀的哈希算法,产生哈希碰撞的可能性极小,可以近似认为不会产生碰撞。当然,它的加密计算过程也是非常复杂的,是由美国国家安全局的数学专家设计的,比小明设计的QS算法要复杂很多,即使用计算机执行SHA256算法,也需要很长时间。实际上,在比特币系统中,当矿工用计算机进行比特币挖矿时,就是使用SHA256算法反复进行成千上万次的计算。
图3.3│哈希算法的计算和哈希碰撞