区块链系列--比特币 :区块链中的Hash算法

Posted 人工智能爱好者社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链系列--比特币 :区块链中的Hash算法相关的知识,希望对你有一定的参考价值。


区块链系列--比特币 (3):区块链中的Hash算法

作者简介

陈庆接 

个人博客:www.chenqingjie.com  


往期回顾:





请在阅读本文之前或者之后,先重新阅读《精通比特币》的第1章到第7章。

一、Hash算法的身影

二、SHA256算法过程

本文主要简述一下SHA256算法的过程,下一篇会大概说一下它的理论基础。

1. 输入信息x

SHA256要求报文长度不超过2^64bit。

2. 补位

因为采用的是分组加密的方法,每组长度是512bit,而原始的信息x,不一定是512的倍数,也就是说不一定能刚好分成每组都是512bit的情况。这时候需要补位。

在x后面先补一个1,然后再补多个0,一直到总长度(x以及补的位数)模512是448

3. 补长度

为什么第二步不直接把总长度补到512的倍数呢,因为后面还要补64位,记录原始信息x的位数。(64 + 448) % 512 = 0。可以看到,只有64位表示原始信息x的位数,所以x的最大长度是2^64。

4. 计算Hash值

前面已经将消息补成了512的倍数,总长度变为512 * N。计算hash值的基本思想是:先将处理完的消息分成N个512bit的数据块:M[1],M[2],……,M[N],然后一块一块的处理:哈希初值H[0]经过第一个数据块M[1]得到H[1],H[1]经过第二个数据块M[2]得到H[2],……,依次处理,最后得到H[N]。每个哈希值,比如H[0],由8个32bit组成,32bit又称为字,也就是说每个hash值都由8个字组成。最后将H[N]的8个字连接成256bit(8 * 32 bit)的最终值。至于为什么可以这么做,我们下一篇再介绍,先看流程。

1) 哈希初值H[0]

SHA256算法中用到的哈希初值H[0](共有8个32bit)为:

H[0][0] = 0x6A09E667

H[0][1] = 0xBB67AE85

H[0][2] = 0x3C6EF372

H[0][3] = 0xA54FF53A

H[0][4] = 0x510E527F

H[0][5] = 0x9B05688C

H[0][6] = 0x1F83D9AB

H[0][7] = 0x5BE0CD19

0x表示的是十六进制,十六进制中一位表示4bit。

注:这些初值是对自然数中前8个质数2、3、5、7、11等的平方根的小数部分取前32bit而来。

2) 循环计算

# M的下标从1开始,M即为M[1], ..., M[N]

for i in range(1, N + 1):

 # 第一步,先根据16个32bit的原始消息,生成64个32bit

 W = [0] * 64

 for t in range(0, 64):

  if t < 16:

   W[t] = M[i][t]

  else:

   W[t] = SSIG1(W[t - 2]) + W[t-7] + SSIG0(W[t-15]) + W[t-16]

 # 第二步,将上次的hash值,也就是8个32bit,赋值到8个临时变量,用这8个临时变量计算

 # 原本的hash值在本轮结束的时候仍然需要使用

 a = H[i - 1][0]

 b = H[i - 1][1]

 c = H[i - 1][2]

 d = H[i - 1][3]

 e = H[i - 1][4]

 f = H[i - 1][5]

 g = H[i - 1][6]

 h = H[i - 1][7]

 # 第三步,执行散列计算,内循环是64轮,使用了上面的64个W,以及提前定义好的64个K

 for t in range(0, 64):

  t1 = h + BSIG1(e) + CH(e, f, g) + K[t] + W[t]

  t2 = BSIG0(a) + MAJ(a,b,c)

  h = g

  g = f

  f = e

  e = d + t1

  d = c

  c = b

  b = a

  a = t1 + t2

 # 第四步,将本轮经过64个内循环新计算的临时值和上次的hash值求和,作为本轮最终的hash值

 H[i][0] = a + H[i - 1][0]

 H[i][1] = b + H[i - 1][1]

 H[i][2] = c + H[i - 1][2]

 H[i][3] = d + H[i - 1][3]

 H[i][4] = e + H[i - 1][4]

 H[i][5] = f + H[i - 1][5]

 H[i][6] = g + H[i - 1][6]

 H[i][7] = h + H[i - 1][7]

# 最终H[N]的8个32bit返回,即为该消息的SHA256结果

3) 函数和常量说明

(1) 64个常量K为:

K = [

 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,

 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,

 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,

 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,

 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,

 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,

 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,

 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ]

注:这些常数的取值是从自然数中前64个质数的立方根的小数部分取前32bit而来的。

(2) 利用到的函数为:

# 本段代码没有使用python语法

CH(x, y, z) = (x AND y) XOR ((NOT x) AND z)

MAJ(x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)

BSIG0(x) = ROTR^2(x) XOR ROTR^13(x) XOR ROTR^22(x)

BSIG1(x) = ROTR^6(x) XOR ROTR^11(x) XOR ROTR^25(x)

SSIG0(x) = ROTR^7(x) XOR ROTR^18(x) XOR SHR^3(x)

SSIG1(x) = ROTR^17(x) XOR ROTR^19(x) XOR SHR^10(x)

其中,除了与或非外,XOR是异或, ROTR^n是循环右移n位,SHR^n是右移n位。

三、总结

上面就是SHA256的计算过程。至于为什么可以把数据切成好几组计算,为什么需要用到里面的这些函数,请见下一篇。


回复 人工智能          揭开人工智能的神秘面纱

回复 贝叶斯算法      贝叶斯算法与新闻分类

回复 机器学习          R&Python机器学习

回复 阿里数据          阿里数据系列课程

回复 Python            Python机器学习案例实战

回复 Spark              征服Spark第一季

回复 kaggle             机器学习kaggle案例

回复 大数据             大数据系列视频

回复 数据分析         数据分析人员的转型

回复 数据挖掘         数据挖掘与人工智能

回复 机器学习         R&Python机器学习

回复 阿里数据         阿里数据系列课程

回复 R                     R&Python机器学习入门

以上是关于区块链系列--比特币 :区块链中的Hash算法的主要内容,如果未能解决你的问题,请参考以下文章

信息摘要算法之七:SHA在区块链中的应用

区块链中的节点是什么?

区块链中的节点是什么

区块链解读-区块链中HASH算法

浅析区块链中的HASH算法

比特币是怎么产生的? 如何挖矿?