2021-05-25

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进制数用字符串形式表示,上述格式排列即为最终计算出的消息摘要。


 

 

 

使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值