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

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

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

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

目录

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

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

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-224杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为224比特。

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= 0xc1059ed8

h1= 0x367cd507

h2= 0x3070dd17

h3= 0xf70e5939

h4= 0xffc00b31

h5= 0x68581511

h6= 0x64f98fa7

h7= 0xbefa4fa4

初始常量矩阵

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~h6224bit作为杂凑值。

附录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

c1059ed8

367cd507

3070dd17

f70e5939

ffc00b31

68581511

64f98fa7

befa4fa4

1

0e96b2da

c1059ed8

367cd507

3070dd17

0434225e

ffc00b31

68581511

64f98fa7

2

c20dab6b

0e96b2da

c1059ed8

367cd507

9cab416f

0434225e

ffc00b31

68581511

3

ab113b7a

c20dab6b

0e96b2da

c1059ed8

82177fe8

9cab416f

0434225e

ffc00b31

4

8253cc1a

ab113b7a

c20dab6b

0e96b2da

8346b27d

82177fe8

9cab416f

0434225e

5

08a0dc0c

8253cc1a

ab113b7a

c20dab6b

05b557db

8346b27d

82177fe8

9cab416f

6

b2ca3a91

08a0dc0c

8253cc1a

ab113b7a

898dc7bb

05b557db

8346b27d

82177fe8

7

0b6b9023

b2ca3a91

08a0dc0c

8253cc1a

a2e49147

898dc7bb

05b557db

8346b27d

8

f09d116d

0b6b9023

b2ca3a91

08a0dc0c

7a84120d

a2e49147

898dc7bb

05b557db

9

ed6fa633

f09d116d

0b6b9023

b2ca3a91

c037faad

7a84120d

a2e49147

898dc7bb

10

55e6a367

ed6fa633

f09d116d

0b6b9023

aae50091

c037faad

7a84120d

a2e49147

11

0817e82b

55e6a367

ed6fa633

f09d116d

c8c53a2c

aae50091

c037faad

7a84120d

12

17142334

0817e82b

55e6a367

ed6fa633

dd4c7be9

c8c53a2c

aae50091

c037faad

13

fc4f023e

17142334

0817e82b

55e6a367

87bea51a

dd4c7be9

c8c53a2c

aae50091

14

be316902

fc4f023e

17142334

0817e82b

65141125

87bea51a

dd4c7be9

c8c53a2c

15

1d80d178

be316902

fc4f023e

17142334

4545f53a

65141125

87bea51a

dd4c7be9

16

9f341a45

1d80d178

be316902

fc4f023e

6a61c411

4545f53a

65141125

87bea51a

17

0f324db9

9f341a45

1d80d178

be316902

06c80d6a

6a61c411

4545f53a

65141125

18

ffe7012b

0f324db9

9f341a45

1d80d178

b7b601f4

06c80d6a

6a61c411

4545f53a

19

62932ab8

ffe7012b

0f324db9

9f341a45

763b627a

b7b601f4

06c80d6a

6a61c411

20

5207d867

62932ab8

ffe7012b

0f324db9

7fbba936

763b627a

b7b601f4

06c80d6a

21

07d55ccb

5207d867

62932ab8

ffe7012b

9ba5a6ea

7fbba936

763b627a

b7b601f4

22

dece98a4

07d55ccb

5207d867

62932ab8

293ffb5d

9ba5a6ea

7fbba936

763b627a

23

e62a812e

dece98a4

07d55ccb

5207d867

28fe0fd9

293ffb5d

9ba5a6ea

7fbba936

24

57206fb8

e62a812e

dece98a4

07d55ccb

c76084ea

28fe0fd9

293ffb5d

9ba5a6ea

25

6a6abcf0

57206fb8

e62a812e

dece98a4

b2614c5e

c76084ea

28fe0fd9

293ffb5d

26

937514f0

6a6abcf0

57206fb8

e62a812e

b42ec21c

b2614c5e

c76084ea

28fe0fd9

27

82af3ffb

937514f0

6a6abcf0

57206fb8

be6f6760

b42ec21c

b2614c5e

c76084ea

28

eca3bcd5

82af3ffb

937514f0

6a6abcf0

1dccbb10

be6f6760

b42ec21c

b2614c5e

29

2d1576c4

eca3bcd5

82af3ffb

937514f0

01641929

1dccbb10

be6f6760

b42ec21c

30

fe3c8658

2d1576c4

eca3bcd5

82af3ffb

fc4b36c5

01641929

1dccbb10

be6f6760

31

0d7cce07

fe3c8658

2d1576c4

eca3bcd5

a4a4a3a4

fc4b36c5

01641929

1dccbb10

32

cce1951d

0d7cce07

fe3c8658

2d1576c4

4be9475c

a4a4a3a4

fc4b36c5

01641929

33

09b76257

cce1951d

0d7cce07

fe3c8658

0ccddd86

4be9475c

a4a4a3a4

fc4b36c5

34

f827767e

09b76257

cce1951d

0d7cce07

db116db7

0ccddd86

4be9475c

a4a4a3a4

35

e4a0bb48

f827767e

09b76257

cce1951d

994e2bac

db116db7

0ccddd86

4be9475c

36

d8bb1041

e4a0bb48

f827767e

09b76257

5b730abb

994e2bac

db116db7

0ccddd86

37

2a2e32f4

d8bb1041

e4a0bb48

f827767e

22e15c59

5b730abb

994e2bac

db116db7

38

0d275ca8

2a2e32f4

d8bb1041

e4a0bb48

f6c39382

22e15c59

5b730abb

994e2bac

39

7902369c

0d275ca8

2a2e32f4

d8bb1041

d9f8c2e0

f6c39382

22e15c59

5b730abb

40

f3c80288

7902369c

0d275ca8

2a2e32f4

00e3a7bb

d9f8c2e0

f6c39382

22e15c59

41

483bba4d

f3c80288

7902369c

0d275ca8

f0a8198c

00e3a7bb

d9f8c2e0

f6c39382

42

d75d4d26

483bba4d

f3c80288

7902369c

fcecdcd4

f0a8198c

00e3a7bb

d9f8c2e0

43

0744b618

d75d4d26

483bba4d

f3c80288

03186faa

fcecdcd4

f0a8198c

00e3a7bb

44

9cce9f01

0744b618

d75d4d26

483bba4d

a56f6bbf

03186faa

fcecdcd4

f0a8198c

45

a3701bd9

9cce9f01

0744b618

d75d4d26

af1bef5f

a56f6bbf

03186faa

fcecdcd4

46

131d4c09

a3701bd9

9cce9f01

0744b618

ecb77e1b

af1bef5f

a56f6bbf

03186faa

47

fb3777d9

131d4c09

a3701bd9

9cce9f01

1d601f44

ecb77e1b

af1bef5f

a56f6bbf

48

847ea00e

fb3777d9

131d4c09

a3701bd9

503a7b95

1d601f44

ecb77e1b

af1bef5f

49

aaa69347

847ea00e

fb3777d9

131d4c09

5eeb9930

503a7b95

1d601f44

ecb77e1b

50

505caf28

aaa69347

847ea00e

fb3777d9

ce695893

5eeb9930

503a7b95

1d601f44

51

675e0b02

505caf28

aaa69347

847ea00e

c22dd75f

ce695893

5eeb9930

503a7b95

52

abd26099

675e0b02

505caf28

aaa69347

1409c3f8

c22dd75f

ce695893

5eeb9930

53

0df9857a

abd26099

675e0b02

505caf28

2d864d9f

1409c3f8

c22dd75f

ce695893

54

308b8799

0df9857a

abd26099

675e0b02

02524f02

2d864d9f

1409c3f8

c22dd75f

55

909cc059

308b8799

0df9857a

abd26099

6f2a444a

02524f02

2d864d9f

1409c3f8

56

8d25bd94

909cc059

308b8799

0df9857a

1273c622

6f2a444a

02524f02

2d864d9f

57

f32141da

8d25bd94

909cc059

308b8799

1771ed3f

1273c622

6f2a444a

02524f02

58

8ce24395

f32141da

8d25bd94

909cc059

f52f66a6

1771ed3f

1273c622

6f2a444a

59

07bcd846

8ce24395

f32141da

8d25bd94

149db547

f52f66a6

1771ed3f

1273c622

60

622d5e5b

07bcd846

8ce24395

f32141da

b6f4c630

149db547

f52f66a6

1771ed3f

61

c693fc7a

622d5e5b

07bcd846

8ce24395

13dfb889

b6f4c630

149db547

f52f66a6

62

55d1c760

c693fc7a

622d5e5b

07bcd846

7e730e00

13dfb889

b6f4c630

149db547

63

fd89031b

55d1c760

c693fc7a

622d5e5b

55489ee6

7e730e00

13dfb889

b6f4c630

64

6203de4a

fd89031b

55d1c760

c693fc7a

2aedb1b3

55489ee6

7e730e00

13dfb889

杂凑值h0~h6

h0:0x23097d22

h1:0x3405d822

h2:0x8642a477

h3:0xbda255b3

h4:0x2aadbce4

h5:0xbda0b3f7

h6:0xe36c9da7

附录B 下载链接

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

编译环境:VS2010

语言:C

参考文献:

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

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



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

相关文章

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st