SHA-256摘要算法(带示例)

2024-08-28 03:32
文章标签 算法 示例 256 摘要 sha

本文主要是介绍SHA-256摘要算法(带示例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原创不易,转载请注明出处。

目录

1.算法简介

2.符号

3.加密算法流程

3.1 概述

3.2 填充

3.3 加密处理

附录A 运算示例

附录B 下载链接


1.算法简介

SHA英文全称Secure Hash Algorithm,即安全散列算法。散列算法又称杂凑算法或哈希算法,能将一定长度的消息计算出固定长度的字符串(又称消息摘要)。SHA包含5个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,后四者并称为SHA-2。

SHA-256最大计算明文长度为2^64bit,属于分组算法,分组长度为512bit,产生的信息摘要长度为256bit。SHA-256算法属于密码杂凑算法,原则上不能通过密文推出明文。

本文将通过实例,详细介绍SHA-256加密算法的加密流程。

2.符号

下列符号适用于本文本。

h0~h7:8个32bit字,初始哈希值,也存放每组计算的当前哈希值

abcdefgh:8个32bit字,存放中间变量

m :消息

m':填充后的消息

mod:模运算

s0,s1:字节扩展时中间变量

S0,S1,ch,maj,temp1,temp2:循环迭代时中间变量

w[i]:第i个扩展字

∧:32bit与运算

∨:32bit或运算

⊕:异或运算

>>>k:循环右移k比特运算

>>k:右移k比特运算

←:左向赋值运算符

~:32bit字按位取反

3.加密算法流程

3.1 概述

对长度为l (l<2^64bit )比特的消息 ,SHA-256杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。

3.2 填充

假设消息m 的长度为 l比特。首先将比特“1”添加到消息的末尾,再添加 k个“0”,k 是满足l+1+k=448mod512 的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l 的二进制表示。填充后的消息 m'的比特长度为512的倍数。

例如:对消息01100001 01100010 01100011,其长度 =24,经填充得到比特串:

                  

事实上,在编写程序时,应该先进行分组,对满足512bit的分组先进行计算。当分到最后一组不足512bit时,再进行填充。

3.3 加密处理

将填充后的消息m' 按512比特进行分组:m'=B0B1……Bn-1,其中n=(l+k+65)/512 。

3.3.1 常量及初始值

初始哈希值:

h0= 0x6a09e667

h1= 0xbb67ae85

h2= 0x3c6ef372

h3= 0xa54ff53a

h4= 0x510e527f

h5= 0x9b05688c

h6= 0x1f83d9ab

h7= 0x5be0cd19

初始常量矩阵:

k[0..63]=

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

3.3.2 加密流程

每组数据按照如下流程进行加密操作:

1)分组数据按照32bit字存放在w[0]~w[15]中,然后按照如下规则扩展成64个字。注意 s0, s1 最后是右移, 不是循环右移。

FOR i from 16 to 63

    s0= (w[i-15] ) >>> 7)⊕(w[i-15] >>> 18)⊕(w[i-15] >> 3)

    s1= (w[i-2] >>> 17)⊕(w[i-2] >>> 19)⊕(w[i-2] >> 10)

    w[i]= w[i-16] + s0 + w[i-7] + s1

ENDFOR

2)赋值初始哈希值

a= h0

b= h1

c= h2

d= h3

e= h4

f= h5

g= h6

h= h7

3)迭代计算64次

FOR i from 0 to 63

    S1= (e >>> 6) ⊕ (e >>> 11) ⊕ (e >>> 25)

    ch= (e∧ f) ⊕ ((~ e) ∧ g)

    temp1= h + S1 + ch + k[i] + w[i]

    S0= (a >>> 2) ⊕ (a >>> 13) ⊕ (a >>> 22)

    maj= (a∧b) ⊕ (a∧c)⊕(b∧c)

    temp2= S0 + maj

 

    h= g

    g= f

    f= e

    e= d + temp1

    d= c

    c= b

    b= a

    a= temp1 + temp2

ENDFOR

4)获取当前哈希值

h0= h0 + a

h1= h1 + b

h2= h2 + c

h3= h3 + d

h4= h4 + e

h5= h5 + f

h6= h6 + g

h7= h7 + h

注意前一组得到的哈希值h0~h7作为下一分组的初始值,最终得到的h0~h7就是256bit杂凑值

附录A 运算示例

原始输入消息:

abc

填充后消息:

0x61      0x62      0x63      0x80      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x18

64个扩展字

w[0]~w[3]:  0x61626380    0x00000000        0x00000000        0x00000000

w[4]~w[7]:  0x00000000    0x00000000        0x00000000        0x00000000

w[8]~w[11]: 0x00000000    0x00000000        0x00000000        0x00000000

w[12]~w[15]:0x00000000    0x00000000        0x00000000        0x00000018

w[16]~w[19]:0x61626380    0x000f0000         0x7da86405        0x600003c6

w[20]~w[23]:0x3e9d7b78    0x0183fc00         0x12dcbfdb        0xe2e2c38e

w[24]~w[27]:0xc8215c1a     0xb73679a2        0xe5bc3909         0x32663c5b

w[28]~w[31]:0x9d209d67   0xec8726cb         0x702138a4        0xd3b7973b

w[32]~w[35]:0x93f5997f     0x3b68ba73        0xaff4ffc1           0xf10a5c62

w[36]~w[39]:0x0a8b3996    0x72af830a         0x9409e33e         0x24641522

w[40]~w[43]:0x9f47bf94     0xf0a64f5a          0x3e246a79         0x27333ba3

w[44]~w[47]:0x0c4763f2     0x840abf27         0x7a290d5d        0x065c43da

w[48]~w[51]:0xfb3e89cb     0xcc7617db        0xb9e66c34         0xa9993667

w[52]~w[55]:0x84badedd    0xc21462bc         0x1487472c        0xb20f7a99

w[56]~w[59]:0xef57b9cd     0xebe6b238         0x9fe3095e         0x78bc8d4b

w[60]~w[63]:0xa43fcf15     0x668b2ff8         0xeeaba2cc          0x12b1edeb

64轮迭代(十六进制表示)

a

b

c

d

e

f

g

h

0

6a09e667

bb67ae85

3c6ef372

a54ff53a

510e527f

9b05688c

1f83d9ab

5be0cd19

1

5d6aebcd

6a09e667

bb67ae85

3c6ef372

fa2a4622

510e527f

9b05688c

1f83d9ab

2

5a6ad9ad

5d6aebcd

6a09e667

bb67ae85

78ce7989

fa2a4622

510e527f

9b05688c

3

c8c347a7

5a6ad9ad

5d6aebcd

6a09e667

f92939eb

78ce7989

fa2a4622

510e527f

4

d550f666

c8c347a7

5a6ad9ad

5d6aebcd

24e00850

f92939eb

78ce7989

fa2a4622

5

04409a6a

d550f666

c8c347a7

5a6ad9ad

43ada245

24e00850

f92939eb

78ce7989

6

2b4209f5

04409a6a

d550f666

c8c347a7

714260ad

43ada245

24e00850

f92939eb

7

e5030380

2b4209f5

04409a6a

d550f666

9b27a401

714260ad

43ada245

24e00850

8

85a07b5f

e5030380

2b4209f5

04409a6a

0c657a79

9b27a401

714260ad

43ada245

9

8e04ecb9

85a07b5f

e5030380

2b4209f5

32ca2d8c

0c657a79

9b27a401

714260ad

10

8c87346b

8e04ecb9

85a07b5f

e5030380

1cc92596

32ca2d8c

0c657a79

9b27a401

11

4798a3f4

8c87346b

8e04ecb9

85a07b5f

436b23e8

1cc92596

32ca2d8c

0c657a79

12

f71fc5a9

4798a3f4

8c87346b

8e04ecb9

816fd6e9

436b23e8

1cc92596

32ca2d8c

13

87912990

f71fc5a9

4798a3f4

8c87346b

1e578218

816fd6e9

436b23e8

1cc92596

14

d932eb16

87912990

f71fc5a9

4798a3f4

745a48de

1e578218

816fd6e9

436b23e8

15

c0645fde

d932eb16

87912990

f71fc5a9

0b92f20c

745a48de

1e578218

816fd6e9

16

b0fa238e

c0645fde

d932eb16

87912990

07590dcd

0b92f20c

745a48de

1e578218

17

21da9a9b

b0fa238e

c0645fde

d932eb16

8034229c

07590dcd

0b92f20c

745a48de

18

c2fbd9d1

21da9a9b

b0fa238e

c0645fde

846ee454

8034229c

07590dcd

0b92f20c

19

fe777bbf

c2fbd9d1

21da9a9b

b0fa238e

cc899961

846ee454

8034229c

07590dcd

20

e1f20c33

fe777bbf

c2fbd9d1

21da9a9b

b0638179

cc899961

846ee454

8034229c

21

9dc68b63

e1f20c33

fe777bbf

c2fbd9d1

8ada8930

b0638179

cc899961

846ee454

22

c2606d6d

9dc68b63

e1f20c33

fe777bbf

e1257970

8ada8930

b0638179

cc899961

23

a7a3623f

c2606d6d

9dc68b63

e1f20c33

49f5114a

e1257970

8ada8930

b0638179

24

c5d53d8d

a7a3623f

c2606d6d

9dc68b63

aa47c347

49f5114a

e1257970

8ada8930

25

1c2c2838

c5d53d8d

a7a3623f

c2606d6d

2823ef91

aa47c347

49f5114a

e1257970

26

cde8037d

1c2c2838

c5d53d8d

a7a3623f

14383d8e

2823ef91

aa47c347

49f5114a

27

b62ec4bc

cde8037d

1c2c2838

c5d53d8d

c74c6516

14383d8e

2823ef91

aa47c347

28

77d37528

b62ec4bc

cde8037d

1c2c2838

edffbff8

c74c6516

14383d8e

2823ef91

29

363482c9

77d37528

b62ec4bc

cde8037d

6112a3b7

edffbff8

c74c6516

14383d8e

30

a0060b30

363482c9

77d37528

b62ec4bc

ade79437

6112a3b7

edffbff8

c74c6516

31

ea992a22

a0060b30

363482c9

77d37528

0109ab3a

ade79437

6112a3b7

edffbff8

32

73b33bf5

ea992a22

a0060b30

363482c9

ba591112

0109ab3a

ade79437

6112a3b7

33

98e12507

73b33bf5

ea992a22

a0060b30

9cd9f5f6

ba591112

0109ab3a

ade79437

34

fe604df5

98e12507

73b33bf5

ea992a22

59249dd3

9cd9f5f6

ba591112

0109ab3a

35

a9a7738c

fe604df5

98e12507

73b33bf5

085f3833

59249dd3

9cd9f5f6

ba591112

36

65a0cfe4

a9a7738c

fe604df5

98e12507

f4b002d6

085f3833

59249dd3

9cd9f5f6

37

41a65cb1

65a0cfe4

a9a7738c

fe604df5

0772a26b

f4b002d6

085f3833

59249dd3

38

34df1604

41a65cb1

65a0cfe4

a9a7738c

a507a53d

0772a26b

f4b002d6

085f3833

39

6dc57a8a

34df1604

41a65cb1

65a0cfe4

f0781bc8

a507a53d

0772a26b

f4b002d6

40

79ea687a

6dc57a8a

34df1604

41a65cb1

1efbc0a0

f0781bc8

a507a53d

0772a26b

41

d6670766

79ea687a

6dc57a8a

34df1604

26352d63

1efbc0a0

f0781bc8

a507a53d

42

df46652f

d6670766

79ea687a

6dc57a8a

838b2711

26352d63

1efbc0a0

f0781bc8

43

17aa0dfe

df46652f

d6670766

79ea687a

decd4715

838b2711

26352d63

1efbc0a0

44

9d4baf93

17aa0dfe

df46652f

d6670766

fda24c2e

decd4715

838b2711

26352d63

45

26628815

9d4baf93

17aa0dfe

df46652f

a80f11f0

fda24c2e

decd4715

838b2711

46

72ab4b91

26628815

9d4baf93

17aa0dfe

b7755da1

a80f11f0

fda24c2e

decd4715

47

a14c14b0

72ab4b91

26628815

9d4baf93

d57b94a9

b7755da1

a80f11f0

fda24c2e

48

4172328d

a14c14b0

72ab4b91

26628815

fecf0bc6

d57b94a9

b7755da1

a80f11f0

49

05757ceb

4172328d

a14c14b0

72ab4b91

bd714038

fecf0bc6

d57b94a9

b7755da1

50

f11bfaa8

05757ceb

4172328d

a14c14b0

6e5c390c

bd714038

fecf0bc6

d57b94a9

51

7a0508a1

f11bfaa8

05757ceb

4172328d

52f1ccf7

6e5c390c

bd714038

fecf0bc6

52

886e7a22

7a0508a1

f11bfaa8

05757ceb

49231c1e

52f1ccf7

6e5c390c

bd714038

53

101fd28f

886e7a22

7a0508a1

f11bfaa8

529e7d00

49231c1e

52f1ccf7

6e5c390c

54

f5702fdb

101fd28f

886e7a22

7a0508a1

9f4787c3

529e7d00

49231c1e

52f1ccf7

55

3ec45cdb

f5702fdb

101fd28f

886e7a22

e50e1b4f

9f4787c3

529e7d00

49231c1e

56

38cc9913

3ec45cdb

f5702fdb

101fd28f

54cb266b

e50e1b4f

9f4787c3

529e7d00

57

fcd1887b

38cc9913

3ec45cdb

f5702fdb

9b5e906c

54cb266b

e50e1b4f

9f4787c3

58

c062d46f

fcd1887b

38cc9913

3ec45cdb

7e44008e

9b5e906c

54cb266b

e50e1b4f

59

ffb70472

c062d46f

fcd1887b

38cc9913

6d83bfc6

7e44008e

9b5e906c

54cb266b

60

b6ae8fff

ffb70472

c062d46f

fcd1887b

b21bad3d

6d83bfc6

7e44008e

9b5e906c

61

b85e2ce9

b6ae8fff

ffb70472

c062d46f

961f4894

b21bad3d

6d83bfc6

7e44008e

62

04d24d6c

b85e2ce9

b6ae8fff

ffb70472

948d25b6

961f4894

b21bad3d

6d83bfc6

63

d39a2165

04d24d6c

b85e2ce9

b6ae8fff

fb121210

948d25b6

961f4894

b21bad3d

64

506e3058

d39a2165

04d24d6c

b85e2ce9

5ef50f24

fb121210

948d25b6

961f4894

杂凑值h0~h7

h0:0xba7816bf

h1:0x8f01cfea

h2:0x414140de

h3:0x5dae2223

h4:0xb00361a3

h5:0x96177a9c

h6:0xb410ff61

h7:0xf20015ad

附录B 下载链接

https://download.csdn.net/download/u013073067/13138360

编译环境:VS2010

语言:C

参考文献:

[1]https://en.wikipedia.org/wiki/Secure_Hash_Algorithms

这篇关于SHA-256摘要算法(带示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校