区块链与密码学第5-3讲:详解常用哈希函数

Posted Dig Quant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链与密码学第5-3讲:详解常用哈希函数相关的知识,希望对你有一定的参考价值。

【本课堂内容全部选编自PlatON首席密码学家、武汉大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】

5.3 SHA-256算法简介

目前常用的哈希函数有三种,分别为SHA-256算法、Keccak算法、SM3算法,今天我们对SHA-256算法进行详细讲解。

概况

SHA系列标准哈希函数是由美国标准与技术研究所(National Institute of Standards and Technology,NIST)组织制定的。

  • 1993年公布了SHA-0 (FIPS PUB 180),后发现不安全。

  • 1995年公布了SHA-1(FIPS PUB 180--1)。

  • 2002年公布了SHA-2( FIPS PUB 180--2),包括3种算法:SHA-256, SHA-384, SHA-512。

  • 2005年王小云院士给出一种攻击SHA-1的方法,用269操作找到一个强碰撞,以前认为是280。

  • 2017年2月23日,谷歌宣布找到SHA-1碰撞的算法,需要耗费110块GPU一年的运算量。

SHA-256算法描述

  • 输入数据长度为l比特,1≤l≤264-1

  • 输出哈希值的长度为256比特

(1) 常量与函数 SHA-256算法使用以下常数与函数:

① 常量

初始值IV为: 0x6a09e667 bb67ae85 3c6ef372 a54ff53a 510e527f 9b05688c 1f83d9ab 5be0cd19 这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32比特而来。 举个例子来说,√2小数部分约: 0.414213562373095048 而0.414213562373095048 ≈ 6∗16−1 +a∗16−2+0∗16−3 +9∗16−4 +... 于是,质数2的平方根的小数部分取前32比特就对应出0x6a09e667。 另外,SHA-256还用到了64个常数:K0, K1, …,K63 =

和8个初始值类似,这些常量是对自然数中前64个质数(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97…)的立方根的小数部分取前32比特而来。

② 函数

SHA-256用到了以下函数

其中:∧表示按位“与”;¬ 表示按位“补”;⊕表示按位“异或”; ROTRi(x)表示循环右移i比特;SHRi(x)表示右移i比特;

(2) 算法描述

① 填充

  • 对数据填充的目的是使填充后的数据长度为512的整数倍。因为迭代压缩是对512位数据块进行的,如果数据的长度不是512的整数倍,最后一块数据将是短块,这将无法处理。

  • 设消息m长度为l比特。首先将比特“1”添加到m的末尾,再添加k个“0”,其中,k是满足下式的最小非负整数l+1+k = 448mod512。

  • 然后再添加一个64位比特串,该比特串是长度l的二进制表示。填充后的消息m的比特长度一定为512的倍数。

  • 以信息“abc”为例显示补位的过程。a, b, c对应的ASCII码分别是97, 98, 99;于是原始信息的二进制编码为:01100001 01100010 01100011。

补一个“1” :0110000101100010 01100011 1 补423个“0”:01100001 01100010 01100011 10000000 00000000 … 00000000 补比特长度24 (64位表示),得到512比特的数据:

② 消息分块

将填充后的消息m′按512比特分成n组: m′= M(0)||M(1)|| · · · ||M(n-1) 其中:n = (l+k+65)/512

SHA256算法的消息分块过程示意图

③ 消息扩展

对一个消息分组M(t) 迭代压缩之前,首先进行消息扩展:将16个字的消息分组M t 扩展生成如下的64个字,供压缩函数使用W0,W1,…,W63,消息扩展把原消息位打乱,隐蔽原消息位之间的关联,增强了安全性。 消息扩展的步骤如下:

④ 压缩函数

压缩函数是SHA-256的核心,令a, b, c, d, e, f, g, h为字寄存器,T1, T2为中间变量。 压缩函数:V(t+1)= CF(V(t),M(t)), 0 ≤ t ≤n -1。 压缩函数CF的压缩处理:内层迭代 ① FOR t = 0 TO 63 ② CF= F(T1 , T2 , a, b, c, d, e, f, g, h , M(t)) ③ END FOR

​SHA-256算法的压缩函数工作流程示意图

⑤ 基本压缩函数

基本压缩函数的流程如右边公式所述。 说明:

  • a, b, c, d, e, f, g, h为字寄存器,T1, T2为中间变量。

  • +运算为mod 232算术加运算。

  • 字的存储为大端(big-endian)格式。即,左边为高有效位,右边为低有效位。

SHA-256算法的基本压缩函数示意图

⑥ SHA-256工作全过程

SHA-256算法的基本压缩函数示意图

安全性

  • 专业机构设计,经过充分测试和论证

  • 安全性可满足应用的安全需求

  • 学者已开展对SHA-256的安全分析(如缩减轮的分析),尚未发现本质的缺陷

程序设计

  • typedef.h:定义数据类型

  • sha256.h:定义SHA-256算法相关功能函数、数据接口声明

  • sha256.c:实现SHA-256算法相关功能函数

  • sha256_test.h:定义测试函数、数据接口声明

  • Sha256_test.c:实现测试功能函数

  • main.c:实现main函数,测试程序的正确性、性能等

常用的SHA-256算法就讲到这里啦,下节课我们将学习常用哈希函数Keccak算法,敬请期待!

以上是关于区块链与密码学第5-3讲:详解常用哈希函数的主要内容,如果未能解决你的问题,请参考以下文章

区块链与密码学第5-5讲:详解常用哈希函数

区块链与密码学第5-1讲:哈希函数简史

区块链与密码学第5-2讲:哈希函数的构造

区块链与密码学第2-3讲:区块链基础技术大剖析之哈希函数

区块链与密码学第5-6讲:哈希哈数在区块链中的应用

区块链与密码学第2-4讲:区块链基础技术大剖析之数字签名