区块连中的密码学--SHA256实现机制

区块连中的密码学–SHA256实现机制

摘要

本文主要介绍区块链中所使用的密码学知识,同时因为Hash函数是区块链中重要的一环,因此也使用python3对SHA256进行了实现。

一、什么是区块链

关于区块链的定义,广义来讲:区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点公式算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。狭义来讲:区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。我们对此做一个总结,可以发现区块链中有四项不可缺的核心技术,分别是分布式存储、共识机制、密码学原理和智能合约。本文将主要从密码学的角度来解析区块链技术。

二、区块链中的密码学

中本聪(Satoshi Nakamoto)的《比特币:一种点对点的电子现金系统》(Bitcoin: A Peer-to-PeerElectronic Cash System)中提到的交易过程:一枚电子货币是这样的一串数字签名,每一位所有者通过对前一次交易和下一位拥有者的公钥签署一个随机Hash的数字签名, 即每一个区块里都包含两个hash值,一个是上个区块的Hash值,另一个是当前区块的Hash值 ,并将这个签名附加在这枚电子货币的末尾,电子货币就发送给了下一位所有者。而收款人通过对签名进行校验,就能够验证该链条的所有者。这里就涉及了非对称加密算法以及数字签名技术。比特币系统当中,Hash和签名是结合起来用的,一般是对一个massage取哈希,再对这个哈希值签名。 只要Hash值里面任何内容有改动,Hash值都会变,比如现在有100个区块,有人改了第53个,那么54到100的区块也都要跟着变动,也就是说54到100的区块的拥有者要去做改动,而且必须得到超过50%的区块拥有者的同意,大家才会把你改动的信息同步下来。

非对称密码学

比特币系统中的账户管理:在日常生活中,如果想要开一个账户,我们需要带上证件去银行办理开户手续,这就是中心化系统的账户管理方式。比特币是去中心化的,没有类似于银行的机构。用户自己可以决定是否开户,不需要任何人批准。开户的过程是在本地创立一个公钥,私钥的对,这个公私钥对就代表了一个账户。

非对称密码学由一对不同的公钥和私钥对组成,如果用公钥对数据进行加密则只能用对应的私钥才能进行解密,反之如果用私钥进行加密,那么只有用对应的公钥去进行解密。目前常见的非对称密码算法有RSA算法、ECC、Diffie-Hellman算法等。大多数区块链平台采用ECC算法和RSA算法来进行数字签名。

在比特币系统中,创立账号只需要一对公私钥,公钥可以理解为银行账户,而私钥则是账户的密码,密码是只有你自己知道的,别人给你转账时只需要知道你的公钥。假设这样一个场景:某一天,小A转了10个比特币给小B,然后广播到区块链上,那其他人怎么知道这笔交易确实是小A操作的呢,会不会是有其他人冒名顶替?这时候就需要用到公私钥了,为了解决这个问题,小A需要在发布交易的时候用自己的私钥对这笔交易进行签名,其他人收到交易的信息之后用小A的公钥验证这笔交易签名的正确性,来确定这笔交易就是小A操作的。

哈希函数

Hash算法是非常基础也非常重要的计算机算法,它能将任意长度的二进制明文串映射为较短的二进制串即Hash值,并且不同的明文很难映射为相同的Hash值。

Hash值在应用中又常被称为指纹或摘要。Hash算法的核心思想也经常被应用到基于内容的编址或命名算法中。目前常用的哈希函数为SHA256。一个优秀的Hash算法将能实现如下功能:

  • 正向快速:给定明文和Hash算法,在有限时间和有限资源内能计算得到Hash值;

  • 逆向困难:给定(若干)Hash值,在有限时间内很难(基本不可能)逆推出明文;

  • 输入敏感:原始输入信息发生任何改变,新产生的Hash值都应该出现很大不同;

  • 冲突避免:很难找到两段内容不同的明文,使得它们的Hash值一致(发生碰撞)。

比特币挖矿的过程就是基于逆向困难的原理。挖矿实际上就是找一个随机数nonce,它和区块块头中的信息合在一起作为输入取哈希,使得得出的哈希满足某一个条件。由于只能一个一个随机数去试,因此挖矿的过程才能用来作为工作量证明(proof of work)。虽然挖矿的过程需要很大的工作量才能找到符合条件的nonce,但是一旦有一个人找到了这个nonce,将它公布出去后,其他人要验证它是否符合要求很容易的,只需要进行一次哈希运算就可以了,这一性质叫做difficult to solve,but easy to verify 。SHA256算法可以很好的满足区块连的要求。

Hash算法并不是一种加密算法,不能用于对信息的保护。但Hash算法常用于对口令的保存上。例如用户登录网站需要通过用户名和密码来进行验证。如果网站后台直接保存用户的口令明文,一旦数据库发生泄露后果不堪设想。利用Hash的特性,后台可以仅保存口令的Hash值,这样每次比对Hash值一致,则说明输入的口令正确。即便数据库泄露了,也无法从Hash值还原回口令,只有进行穷举测试。

数字摘要

数字摘要是对数字内容进行Hash运算,获取唯一的摘要值来指代原始完整的数字内容。数字摘要是Hash算法最重要的一个用途。利用Hash函数的抗碰撞性特点,数字摘要可以解决确保内容未被篡改过的问题。

SHA-256

对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示

信息与处理:

SHA256算法中的预处理就是在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。 信息的预处理分为两个步骤:附加填充比特和附加长度

填充比特:在报文末尾进行填充,使报文长度在对512取模以后的余数是448,先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。需要注意的是,信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。余数为448的原因是,附加长度部分会附加上一个64bit的数据,用来表示原始报文长度,448+64=512,因此余数选择448可以刚好拼凑成一个完整的块。

附加长度:将原始数据的长度信息补到已经进行了填充操作的消息后面。 因此,通过SHA256计算的消息长度必须要小于2的64次方

计算消息摘要:

首先将消息分解成512bit大小的块,若消息M可以被分解成n个块,那么整个算法也就需要迭代n次,最后的结果就是256bit的数字摘要。一个256-bit的摘要的初始值H_0,经过第一个数据块进行运算,得到H_1,即完成了第一次迭代,H_1经过第二个数据块进行运算得到H2,以此类推依次处理,最后得到H_n,H_n即为最终的256-bit消息摘要,表达为式子则为: Map(H_i-1) = H_i。期中每一个H被划分为8个小块,因为SHA256算法中的最小运算单元为字,即32bit。H_0的初始值则为前八个质数的平方根的小数部分取前32bit得来。

对于每一块,首先我们要构造64个字,块的大小为512比特,可以分解为16个32bit的字,记为w[0], w[1], … w[15],前16个字直接由消息的第i个块分解来得到。其余字如下迭代生成:
W t = σ 1 ( W t − 2 ) + W t − 7 + σ 0 ( W t − 15 ) + W t − 16 .   S n 表 示 循 环 右 移 n 位 , R n 表 示 右 移 n 位 σ 0 ( x ) = S 7 ( x ) ⨁ S 18 ( x ) ⨁ R 3 ( x ) σ 1 ( x ) = S 17 ( x ) ⨁ S 19 ( x ) ⨁ R 10 ( x ) W_t = \sigma_1(W_{t-2}) + W_{t-7} + \sigma_0(W_{t-15}) + W_{t-16}. \ S^n表示循环右移n位,R^n表示右移n位\\ \sigma_0(x)=S^7(x)\bigoplus S^{18}(x)\bigoplus R^3(x)\\ \sigma_1(x) = S^{17}(x)\bigoplus S^{19}(x)\bigoplus R^{10}(x)\\ Wt=σ1(Wt2)+Wt7+σ0(Wt15)+Wt16. 

你可能感兴趣的:(区块链)