ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-05-25

2021-05-25 22:58:39  阅读:151  来源: 互联网

标签:25 448 05 二进制 字符串 2021 缓冲区 长度 512


SHA1算法详解

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准里面定义的数字签名算法。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。算法无法从结果还原出原始信息,相对于MD5更加安全,速度要慢一些,操作要简单点。

一.术语解释

SHA1算法要用到一系列的位运算。

XOR(异或)、OR(或)、AND(与)、NOT(非)、<<(左移)、>>(右移)。右移示例:A>>n(n是常数,左移一样)。

另外还有一种比较复杂的位运算(循环左移):Sn(A) = (A<<n)OR(A>>32-n);数据左移一位,然后左边移出去的那一位填补到右边。

二.数据的前期一些处理

1.补位:我们先以字符为单位将其转换为十六进制Ascii码的排列。再将其转换为二进制排列,得到一个二进制数据。然后我们在数据后加上一个1,计算长度L对512的取余运算即:X=L%512,如果X不等于448,就在数据末尾加上一个0,一直循环到X=448为止。此时数据的长度应为512的n倍加上448,即L'=512*n+448。补位结束。

2.补长度与分块:我们得到一个长度L为512*n+448位的二进制字符串,我们在这个二进制字符串的末尾添加上一个长度为64位的二进制字符串,用来表示原消息数据的长度。我们最终得到一个长度L''=512*n(即长度为512的倍数)的二进制字符串。最后,我们判断这个二进制字符串的长度是否大于512位(即n是否为1)。若大于512位,我们则需要将其分割为长度为512位的多个字符串,这里用M[i](M[0],M[1]……)表示。若不大于,则直接用M0保存。补长度与分块结束。

三.常量值与函数表达式

常量:Kt = 0x5A827999 (0 <= t <= 19);Kt = 0x6ED9EBA1 (20 <= t <= 39); Kt = 0x8F1BBCDC (40 <= t <= 59); Kt = 0xCA62C1D6 (60 <= t <= 79)

表达式: ft(B,C,D) = (B AND C) OR ((NOT B) AND D)  ( 0 <= t <= 19); ft(B,C,D) = B XOR C XOR D        (20 <= t <= 39);  ft(B,C,D) = (B AND C) OR (B AND D) OR (C AND D)  (40 <= t <= 59);  ft(B,C,D) = B XOR C XOR D     (60 <= t <= 79)。

四.算法

1.缓冲区:

        处理上述的二进制字符串需要一些缓冲区,下面为各缓冲区的规格:

            a.32位的缓冲区5个:A,B,C,D,E

            b.32位的缓冲区80个:W[0]~W[79]

            c.32位的缓冲区5个:H[0]~H[4]

            d.32位的缓冲区1个:TEMP

        首先我们将缓冲区H[]进行初始化赋值:

              H[0]=0x67452301

              H[1]=0xEFCDAB89

              H[2]=0x98BADCFE

              H[3]=0x10325476

              H[4]=0xC3D2E1F0

    2.针对每个M[i]进行循环:

               a.将M[i]从左到右分割为16个32位的字符串,转换为uint型的数值分别存储在缓冲区W[0]~W[15]中。

               b.对于W[16]~W[79],我们进行如下循环:

                   W[i] = S1(W[i-3] XOR W[i-8] XOR W[i- 14] XOR W[i-16])。      W[]缓冲区到此全部赋值完毕。

               c.对缓冲区A,B,C,D,E分别进行赋值:

                       A=H[0]

                       B=H[1]

                       C=H[2]

                       D=H[3]

                        E=H[4]

                d.对于W[0]~W[79],我们再进行如下循环:

                   TEMP = S5(A) + ft(B,C,D) + E + W[i] + K[i]

                    E=D

                    D=C

                    C=S30(B)

                    B=A

                    A=TEMP

                e.我们再对缓冲区H[]进行操作:

                    H[0]=H[0]+A

                    H[1]=H[1]+B

                    H[2]=H[2]+C

                    H[3]=H[3]+D

                    H[4]=H[4]+E

     3.完成每一个M[i]的循环后,最终得到的消息摘要为:

                   H[0] H[1] H[2] H[3] H[4]

        此处缓冲区H[]中的数值全部转换为16进制数用字符串形式表示,上述格式排列即为最终计算出的消息摘要。


 

 

 

标签:25,448,05,二进制,字符串,2021,缓冲区,长度,512
来源: https://blog.csdn.net/weixin_44338809/article/details/117265936

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有