之前已经把主要部分看完了(我觉得应该差不多了叭)。接下来要开始扣一些细节,毕竟得考试,逐个击破之。
九、一些细节和试题
9.1 SHA256算法
这里直接搬运CSDN的文章,写的很好,点这个链接。
https://blog.csdn.net/u011583927/article/details/80905740blog.csdn.net我写一些我自己能看懂的话。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。分几步走战略(滑稽)
9.1.1常量初始化
SHA256算法中会用到8个哈希初值以及64个哈希常量。这八个初始值如下。
这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)开平方根,对其小数部分取前32bit而来。例如根号2约为0.414213562373095048,而
比较这个和上述图片的第一行。
在SHA256算法中,用到的64个常量如下:
和8个哈希初值类似,这些常量是对自然数中前64个质数的立方根的小数部分取前32bit而来。
9.1.2信息预处理
SHA256算法中的预处理就是在想要Hash的消息后面补充一些特定信息,使整个消息满足指定的结构。信息的预处理分为两个步骤:附加填充比特和附加长度。
1)附加填充比特
在报文末尾进行填充,使报文长度在对512取模以后的余数是448。填充是这样进行的:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。需要注意的是,信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。
举个栗子:以信息“abc”为例显示补位的过程。
a,b,c对应的ASCII码分别是97,98,99
于是原始信息的二进制编码为:01100001 01100010 01100011
补位第一步,首先补一个“1” : 0110000101100010 01100011 1
补位第二步,补423个“0”:01100001 01100010 01100011 10000000 00000000 … 00000000
补位完成后的数据如下(为了简介用16进制表示):
这时候会有个小问题,为什么是余448。这是因为在第一步的预处理后,第二步会再附加上一个64bit的数据,用来表示原始报文的长度信息。而448+64=512,正好拼成了一个完整的结构。
2)附加长度值
附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。SHA256用一个64位的数据来表示原始消息的长度。长度信息的编码方式为64-bit big-endian integer,就是所谓的大端存储,百度一下就好了。这里举个小栗子。比如存0x123456,正常存储就是0x123456,而大端存储就会存成0x563412这样子,两个数字占一个字节,所以56占一个字节,34一个,12一个,简单点说,就是按字节逆序存储。
9.1.3逻辑运算
SHA256散列函数中