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

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav