0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Hash算法简介

lviY_AI_shequ 来源:未知 作者:胡薇 2018-06-08 14:01 次阅读

一、Hash算法的身影

可以看到,在生成比特币地址(《精通比特币》第4章提到),以及生成区块唯一标识(《精通比特币》第7章提到):区块Hash值时(即挖矿的过程),都使用了Hash算法,特别是SHA256算法。比特币系统本身也就是加密算法的衍生物。

二、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的计算过程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7362
  • 比特币
    +关注

    关注

    57

    文章

    7000

    浏览量

    139326

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

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于Rust语言Hash特征的基础用法和进阶用法

    是一种通用的哈希算法,用于将任意类型的数据转换为固定长度的哈希值。下面是一个简单的示例,演示如何使用Hash trait计
    的头像 发表于 09-19 16:02 729次阅读

    基于Hash和二叉树的路由表查找算法

    基于Hash和二叉树的路由表查找算法 :提出了一种基于Hash和二又树的路由表查找算法,这一算法可以满足()C-768的转发要求,支持超过
    发表于 02-22 17:06 35次下载

    hash表的实现原理

    软件开发中,一个hash表相当于把n个key随机放入到b个bucket中,以实现n个数据在b个单位空间的存储。 我们发现hash表中存在一些有趣现象: hash表中key的分布规律 当hash
    发表于 09-28 14:31 0次下载
    <b class='flag-5'>hash</b>表的实现原理

    基于Hash改进的k-means算法并行化设计

    为了解决kmeans算法在Hadoop平台下处理海量高维数据时聚类效果差,以及已有的改进算法不利于并行化等问题,提出了一种基于Hash改进的并行化方案。将海量高维的数据映射到一个压缩的标识空间,进而
    发表于 11-24 14:24 2次下载
    基于<b class='flag-5'>Hash</b>改进的k-means<b class='flag-5'>算法</b>并行化设计

    常见的hash算法有哪些及其原理是什么

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间
    发表于 12-09 10:25 2.6w次阅读
    常见的<b class='flag-5'>hash</b><b class='flag-5'>算法</b>有哪些及其原理是什么

    基于跳跃hash的对象分布算法

    算法简洁、高效,支持权值和数据冗余机制.该算法创造性地将节点映射到二维矩阵,对象的分布、定位只需从矩阵的行内、行间计算目标节点的行号和列号即可.理论研究表明,该算法满足公平性、自适应性、紧凑性、节点变化对象迁移量较小的特点.实验
    发表于 12-26 10:43 0次下载

    什么是hash值与比特币之间又有什么关系

    hash是什么,有点类似「洗牌」把牌洗乱的概念,只是洗的不是牌,而是一笔数据,这个「洗」的过程是经过严谨定义的,且产生的结果会是固定长度的。常见的hash算法有MD5、RIPEMD-160、SHA1
    发表于 01-03 14:15 1.1w次阅读

    基于区块链中的HASH算法解析

    hash算法之前先明确一个基础的计算机知识,计算机在底层机器码是采用二进制的模式,所谓二进制简单来说就是底层以0/1来标识,所有数据传输记录都以010101的模式来存储记录,两种状态也可认为就是
    发表于 06-13 11:42 1097次阅读
    基于区块链中的<b class='flag-5'>HASH</b><b class='flag-5'>算法</b>解析

    hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解

    由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。根据抽屉原理,一定会存在不同的输入被映射成相同输出的情况。那么作为一个好的hash
    的头像 发表于 06-03 17:34 2973次阅读
    从<b class='flag-5'>hash</b><b class='flag-5'>算法</b>的原理和实际应用等几个角度,对<b class='flag-5'>hash</b><b class='flag-5'>算法</b>进行一个讲解

    Hash哈希竞猜游戏开发方案(技术详情)简介

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,哈l8l希2809系2756统竞猜模式就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法
    发表于 06-24 10:08 387次阅读

    关于比特币WK与HASH

    WK实际上就是通过一系列算法,计算出符合要求的哈希值(HASH),从而争取到记账权。这个过程实际上就是试错的过程,一台计算机每秒产生的随机HASH碰撞次数越多,先计算出正确HASH的概
    的头像 发表于 06-29 09:33 1422次阅读

    hash算法在FPGA中的实现(1)

    在FPGA的设计中,尤其是在通信领域,经常会遇到hash算法的实现。hash算法在FPGA的设计中,它主要包括2个部分,第一个就是如何选择一个好的h
    的头像 发表于 09-07 17:01 587次阅读
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在FPGA中的实现(1)

    hash算法在FPGA中的实现(2)

    在前面的文章中:hash算法在FPGA中的实现(一)——hash表的组建,记录了关于hash表的构建,这里记录另外一个话题,就是hash链表
    的头像 发表于 09-07 17:02 407次阅读
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在FPGA中的实现(2)

    hash算法在FPGA中的实现(3)

    在前面的文章中主要介绍了hash表及其链表的结构,同时说明了如何读取表项。那表项是如何写入的了?前期的文章中有少量的提及,这里单独写一篇,介绍两种常见的方案。
    的头像 发表于 09-07 17:02 395次阅读
    <b class='flag-5'>hash</b><b class='flag-5'>算法</b>在FPGA中的实现(3)

    HASH算法加密芯片的工作原理及其在STM32 MCU上的应用

    本文主要研究了HASH算法加密芯片的工作原理及其在STM32 MCU上的应用,实现了外部加密芯片对STM32 MCU的程序保护,目前的技术手段无法对其进行破解,其安全性优于其它加密方式。
    的头像 发表于 10-24 15:01 1647次阅读
    <b class='flag-5'>HASH</b><b class='flag-5'>算法</b>加密芯片的工作原理及其在STM32 MCU上的应用