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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/