SHA生成消息摘要的过程

目录

1.叨叨叨

2.术语和概念

2.1位(Bit),字节(Byte)和字(Word)

2.2运算符和符号

3.SHA1算法

3.1.把消息转换为位字符串

3.2.对转换得到的位字符串进行补位操作

3.3 附加长度信息

3.4 使用的常量和函数

3.5计算消息摘要

4.结语    


 

1.叨叨叨

最近想把安全类中常用的一些加解密的知识整理成文一下,还是因为“好记性不如烂笔头嘛”。

消息摘要就是由一大段消息(一大段二进制信息)通过函数(数学里的函数,例如hash函数)生成一串固定长度的信息,该信息就是消息摘要,其中函数的特点是消息摘要不能通过该函数反推得出原来唯一的消息,函数的设计上可能是反函数很难推导,或者反函数是多值函数,反函数一个自变量对应无限个或者天文数字个因变量......

而消息摘要的作用有:1.数字签名,是你本人身份的认证,2.保证信息的完整性,防止他人篡改。

SHA的设计就为生成消息摘要而诞生,SHA的设计是美国人规定的,全世界都在用它,并有审核通过的标规文档RFC 3174,大家可以打开看看,不过国内貌似有人翻译了过来,我看过的最清澈的一个博文当属点击这里,以下我的记录也是出自这里。

SHA(Security Hash Algorithm)是美国的NIST和NSA设计的一种标准的Hash算法,最初的版本于93年发表,称为SHA-0,因为很快就被发现存在安全隐患,于是在95年就发布第二个版本SHA-1。02年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。08年又新增了SHA-224。目前SHA-2各版本已成为主流。

2.术语和概念

2.1位(Bit),字节(Byte)和字(Word

  SHA1把消息当做位(bit)字符串进行处理。最小单位称为位,8位组成一个字节,两个字节组成一个字。

  例如,字符串“abc”转换成位字符串是01100001 01100010 01100011,转换成16进制字符串是 0x616263。

 

2.2运算符和符号

  下面的逻辑运算符作用于“字”

  X^Y    = X, Y逻辑与

  X \/ Y   = X, Y逻辑或

  X XOR Y= X, Y逻辑异或

  ~X     =   X逻辑取反

  X+Y的定义:字 X 和 Y 代表两个整数 x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整数z = (x + y) mod 2^32. 这时候 0 <= z < 2^32. 将z转换成字Z, 那么就是 Z = X + Y.

  循环左移位操作符Sn(X):X是一个字,n是一个整数,0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)。这个很容易理解了,比如X=11111111 00000001 00000001 00000000,n=5,则Sn(X)=111 00000001 00000001 00000000 11111。

  X<<n定义:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。

  X>>n定义:抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。

3.SHA1算法

3.1.把消息转换为位字符串

  因为SHA1算法只接受位作为输入,所以进行计算前必须把原始消息(比如字符串、文件等)转换成位字符串。

  比如,对字符串“abc”产生消息摘要,‘a’=97   ‘b’=98   ‘c’=99,先转换成24位的字符串:01100001 01100010 01100011

 

3.2.对转换得到的位字符串进行补位操作

  消息必须进行补位,使其长度在对512取模以后的余数是448,即(补位后的消息长度)%512 = 448。

  对消息进行补位时,先在后面补一个1,如果不满足要求,再补0直到满足对512取模余数为448。这就意味着,补位至少补一位(原消息位数为512n+447),最多补512位(原消息位数为512n+448)。

  还是以前面的“abc”为例显示补位的过程:

  原始信息: 01100001 01100010 01100011

  补位第一步,首先补一个1:01100001 01100010 01100011 1

  可以确定的是,如果用一个字节来表示一个字符,补1之后肯定不满足条件,仍需继续补位。

  补位第二步,后面补0直到总长度对512取模余数为448,这里补423个0,使总长度达到为448:

  01100001 01100010 01100011 1000…..00

  补位完成后的数据转换为16进制:

  61626380 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000

  从16进制数据里可以看到,我们也可以直接采用16进制的方式进行补位,我们先补80,看是否满足长度对64取余的结果为56,不满足则继续补0。

  大家可以自己考虑一下为什么可以补80。

 

3.3 附加长度信息

  这一步中,要将原始消息(没有进行补位操作之前)的长度(二进制位数)附加到已经补位的消息之后。

  通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。

  补长度的操作以后,整个消息(16进制)如下:

  61626380 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000 00000000 00000018

  然后,将整个消息拆分为一个一个的512位的数据块M1,M2,…,Mn,然后分别对每一个数据块Mi (1≤i≤n)做处理,得到消息摘要。

  注意,这里是64位,上一步补位后的长度是512k+448,k≥0,这样,512k+448+64=512(k+1),恰好可以被512整除。

  在我们举得例子里,一共只有512位,因此做为一个数据块进行处理。

 

3.4 使用的常量和函数

  一系列的常量字K_{0}, K_{1}, ... , K_{79},如果以16进制给出,它们如下:

  K_{t}= 0x5A827999  (0 <= t <= 19)

  K_{t} = 0x6ED9EBA1 (20 <= t <= 39)

  K_{t}= 0x8F1BBCDC (40 <= t <= 59)

  K_{t} = 0xCA62C1D6 (60 <= t <= 79)

  在SHA1中我们需要一系列的函数。每个函数f{_{t}}(0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义

  f{_{t}}(B,C,D) = (B AND C) OR ((NOT B) AND D)             ( 0 <= t <= 19)

  f{_{t}}(B,C,D) = B XOR C XOR D                                    (20 <= t <= 39)

  f{_{t}}(B,C,D) = (B AND C) OR (B AND D) OR (C AND D)  (40 <= t <= 59)

  f{_{t}}(B,C,D) = B XOR C XOR D                                    (60 <= t <= 79)

 

3.5计算消息摘要

  使用进行了补位和补长度后的消息来计算消息摘要。

计算需要的缓冲区:

  1).两个都由5个32位的字组成缓冲区BUF1和BUF2, BUF1的5个32位缓冲区被标识为A,B,C,D,E,BUF2的5个32位缓冲区被标识为H0,H1,H2,H3,H4。

  2).一个80个32位字的缓冲区BUF3,按照32位划分,依次被标识为W0, W1,..., W79。

  3).一个1个字的TEMP缓冲区。

计算消息摘要:

  在3.2中,我们把补位之后的数据附加了长度信息,然后划分为一个一个的512位(16个字)的数据块M1,M2,…,Mn,这里会依次对每个数据块Mi (1≤i≤n)做处理。

  在处理每个数据块Mi (1≤i≤n)之前,先将缓冲区H0,H1,H2,H3,H4 初始化为下面的值(16进制):

  H0 = 0x67452301

  H1 = 0xEFCDAB89

  H2 = 0x98BADCFE

  H3 = 0x10325476

  H4 = 0xC3D2E1F0. 

接下来处理 Mi(1≤i≤n),步骤如下:

  1). 将每个Mi 分成 16 个字(每个字32位) W{_{0}}, W{_{1}}, ... , W{_{15}}W{_{0}}是最左边的字;

  n个Mi就划分之后,就变成W{_{0}}, W{_{1}}, ... , W{_{15}},W{_{16}},…,W{_{31}},W{_{32}},…W{_{79}}

  2). 对于 t = 16 到 79 令 W{_{t}} = S1(W{_{t-3}} XOR W{_{t-8}} XOR W{_{t-14}} XOR W{_{t-16}});

  3). 令 A = H0, B = H1, C = H2, D = H3, E = H4;

  4) 对于 t = 0 到 79,执行下面的循环

  TEMP = S5(A) + f{_{t}}(B,C,D) + E + W{_{t}}+ K{_{t}};

  E = D;

  D = C;

  C = S30(B);

  B = A;

  A = TEMP;

  5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E. 

  在处理完所有的  Mi(1≤i≤n) 后,会得到一个160位(5个32位字)的字符串消息摘要H0 H1 H2 H3 H4。

4.结语    

具体的代码可见我的github

其实SHA的同类算法有很多,这里可以列举一些:SHA1  SHA224  SHA256  SHA384  SHA512 MD5  HmacMD5
HmacSHA1  HmacSHA224  HmacSHA256  HmacSHA384  HmacSHA512   PBKDF2

本打算想写一篇SHA,但是看到了该文,发现讲的很好,若要再写也无出其右,觉着科学类的文章再怎么写也只是把主观感受添进去,而内容的科学性却容不得你乱逼逼。其实本文只是把老美的设计规则贴了出来,我想如果要深究其中的数学原理,可能需要你花费一些时间。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值