哈希算法及在区块链中的应用

2024-03-09 13:38

本文主要是介绍哈希算法及在区块链中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是学习区块链技术中关于密码学哈希算法这一部分的相关知识点学习总结整理。


哈希算法

哈希函数(散列函数)定义

公式表示形式:
h = H ( m ) h=H(m) h=H(m)
函数说明:
m m m:任意长度消息(不同算法实现,长度限制不同,有的哈希函数(SHA-3)不限制消息长度,有的限制(SHA-2),但即使有限制其长度也非常大,可以认为是任意长度消息)
H H H:哈希函数
h h h:固定长度的哈希值

典型的散列函数都有非常大的定义域,比如SHA-2最高接受( 2 64 − 1 ) / 8 2^{64}-1)/8 2641)/8长度的字节字符串。同時散列函數一定有着有限的值域,比如固定长度的比特串(例如:256,512)。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的單射。

相关概念
  • 哈希函数定义——密码哈希函数是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值,也称散列值。
  • 碰撞定义——是指两个不同的消息在同一哈希函数作用下,具有相同的哈希值。
  • 哈希函数的安全性——是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。
  • 抗弱碰撞性——对于给定的消息 M 1 M_1 M1,要发现另一个消息 M 2 M_2 M2,满足 H ( M 1 ) = H ( M 2 ) H(M_1)=H(M_2) H(M1)=H(M2)在计算上是不可行的。
  • 抗强碰撞性——找任意一对不同的消息 M 1 M_1 M1 M 2 M_2 M2,使 H ( M 1 ) = H ( M 2 ) H(M_1)=H(M_2) H(M1)=H(M2)在计算上是不可行的。
  • 雪崩效应——当一个输入位发生变化时,输出中的每一位均有50%的概率发生变化。

下图形象的说明了哈希函数:
这里写图片描述

哈希算法就是以哈希函数为基础构造的,常用于实现数据完整性和实体认证。一个优秀的 hash 算法,将能实现:

  • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
  • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
  • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
  • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。
哈希函数的性质

这里写图片描述

抗碰撞性

哈希函数的抗碰撞性是指寻找两个能够产生碰撞的消息在计算上是不可行的。但找到两个碰撞的消息在计算上不可行,并不意味着不存在两个碰撞的消息。哈希函数是把大空间上的消息压缩到小空间上,碰撞肯定存在。只是计算上是不可行的。例如,如果哈希值的长度固定为256位,显然如果顺序取 1 , 2 , ⋯ , 2 256 + 1 1,2,\cdots,2^{256}+1 1,2,,2256+1 2 256 + 1 2^{256}+1 2256+1个输入值,计算它们的哈希值,肯定能够找到两个输入值,使得它们的哈希值相同。

原像不可逆

原像不可逆,指的是知道输入值,很容易通过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。

难题友好性

难题友好性指的是没有便捷的方法去产生一满足特殊要求的哈希值。

一个哈希函数 H H H称为难题友好的,如果对于每个 n n n位的输出 y y y,若 k k k是从一个具有较高不可预测性(高小熵)分布中选取的,不可能以小于 2 n 2^n 2n的时间找到一个 x x x,使 H ( k ∣ ∣ x ) = y H(k||x)=y H(kx)=y

为了引申出工作量证明POW的原理,考虑一个由哈希函数构成的解谜问题:已知哈希函数 H H H,一个高小熵分布的值 v a l u e value value以及目标范围 Y Y Y,寻找 x x x,使得 H ( v a l u e ∣ ∣ x ) ∈ Y H(value||x) \in Y H(valuex)Y

这个问题等价于需要找到一个输入值,使得输出值落在目标范围 Y Y Y内,而 Y Y Y往往是所有的输出值的一个子集。实际上,如果一个哈希函数 H H H的输出位 n n n位,那么输出值可以是任何一个 0 0 0~ 2 n 2^n 2n范围内的值。预定义的目标范围 Y Y Y的大小决定了这个问题的求解难度。如果 Y Y Y包含所有 n n n比特的串,那么问题就简单了,但如果 Y Y Y只包含一个元素,那么这个求解是最难的,相当于给定一个哈希值,找出其中一个原像,原像不可逆的性质说明了这个难度。事实上,由于 v a l u e value value具有高小熵分布,这确保了除了随机尝试 x x x值以完成搜寻那个很大的空间外,没有其他有效的途径了。

哈希函数的难题友好性构成了基于工作量证明的共识算法的基础。通过哈希运算得出的符合特定要求的哈希值,可以作为共识算法中的工作量证明。这里比特币的安全保证依赖于哈希函数的安全性,如果哈希函数被攻破,可以想象POW共识算法就失效了,不用算力达到 51 % 51\% 51%就可以攻击了。

小熵(min-entropy)是信息理论中衡量某个结果的可预测性的一个指标。高小熵值的是变量呈均匀分布(随机分布)。如果我们从对分布的值进行随机抽样,不会经常抽到一个固定的值。例如,如果在一个128位的数中随机选一个固定的数 n n n,那么选到该数的几率是 1 / 2 128 1/2^{128} 1/2128

典型哈希函数
SHA256

SHA256属于SHA(Secure Hash Algorithm,安全哈希算法)家族一员,是SHA-2算法簇中的一类,对于小于 2 64 2^{64} 264位的消息,产生一个256位的消息摘要。

SHA-256其计算过程分为两个阶段:消息的预处理和主循环。在消息的预处理阶段,主要完成消息的填充和扩展填充,将所有输入的原始消息转换为 n n n个512比特的消息块,之后对每个消息块利用SHA256压缩函数进行处理。下面讲述的是如何计算Hash值,目前还没有完全理解,列在这里是为了有个宏观的概念,大致知道是什么回事,以后需要的时候再深入学习理解。

SHA256计算步骤:

step1: 附加填充比特。对报文进行填充使报文长度 n ≡ ( 448 m o d 512 ) n \equiv (448 \ mod \ 512) n(448 mod 512),填充比特数范围是1到512,填充比特串的最高位为1,其余位为0。(448=512-64,为了下面的64位)

step2 : 附加长度值。将用64-bit表示初始报文(填充前)的位长度附加在step1的结果后(低字节位优先)。

step3: 初始化缓存。使用一个256bit的缓存来存放该哈希函数的中间值及最终结果。
缓存表示为:A=0x6A09E667 , B=0xBB67AE85 , C=0x3C6EF372 , D=0xA54FF53A,
E=0x510E527F , F=0x9B05688C , G=0x1F83D9AB , H=0x5BE0CD19

step4: 处理512bit(16个字)报文分组序列。该算法使用了六种基本逻辑函数,由64步迭代运算组成。每步都以256-bit缓存值ABCDEFGH为输入,然后更新缓存内容。每步使用一个32-bit 常数值Kt 和一个32-bit Wt。Kt是常数值,在伪代码中有它的常数值定义。Wt是分组之后的报文,512 bit=32bit*16,也就是Wt t=1,2…16由该组报文产生。Wt t=17,18,…,64由前面的Wt按递推公式计算出来。Wt递推公式在下面的伪代码有。
这里写图片描述

step5 :所有的512-bit分组处理完毕后,对于SHA-256算法最后一个分组产生的输出便是256-bit的报文摘要。
这里写图片描述

SHA256计算流程

这里面公式太多,就直接截图了。
这里写图片描述
这里写图片描述
这里写图片描述

伪代码实现

可参考https://en.wikipedia.org/wiki/SHA-2。

RIPEMD160

RIPEMD (RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校验讯息摘要)是一种加密哈希函数。RIPEMD-160是以原始版RIPEMD所改进的160位元版本,而且是RIPEMD系列中最常见的版本。更多请参考:https://homes.esat.kuleuven.be/~bosselae/ripemd160.html

哈希函数在比特币中的应用

参考我的另一篇博文比特币私钥、账户与钱包

这篇关于哈希算法及在区块链中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/790839

相关文章

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和