SHA算法

SHA算法

前世今身

​ 事实上,SHA算法包含了几个种类,包括SHA-0、SHA-1、SHA-2、SHA-3等,其实这是一个迭代的过程,最先有SHA-0和SHA-1,但是某一些密码分析攻击在理论上已经有可能对SHA-1造成威胁,并且由于SHA-2与SHA-1具有相同的结构特性,所以在理论上也有可能攻破SHA-2。因此,NIST开始了SHA-3的征集工作。并在2012年最终确定Keccak作为散列算法。虽然指定了新一代SHA算法,但是,并不是说前几代的SHA算法就已经失效了,实际上,SHA-2在目前仍被认为时安全的,它仍是NIST所支持的一种HASH算法。为了安全性,甚至可以将这两种算法一起使用。

SHA-2

简介

​ SHA-2,全程Secure Hash Algorithm 2,中文名称2代安全散列算法,由美国国家安全局研制,算是SHA-1算法的后继者。

​ 其中,SHA-2有细分了六个不同的算法标准。

​ 包括:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些算法的差异在于,生成摘要的长度、循环的次数等一些比较微小的差距,其算法的基本结构是一致的。

​ 因为总体结构是一致的,那就着重SHA-2中比较经典常用的一种,也就是SHA-256,为比特币使用的哈希算法。

过程总览

​ 过程总览如上图,可以发现,其总体过程跟一般的散列算法还是很相似的,跟上面介绍的MD5算法八九不离十。区别在于,SHA-256的缓冲区为256bit,分为8个32bit哈希初始值,而MD5的初始缓冲区为128bit,分为4个32bit哈希初始值,这正好也是两者的输出差异。

​ 总过程中,其进行运算的总轮数是根据明文长度的组数来确定的。SHA-256运算的核心运算是影响缓冲区输出值的关键部分,其输入为256bit的缓冲区以及512bit的明文,可以把明文看作对缓冲区的影响因子。

​ 其核心函数包括两部分,我们称其为SHA256算法,包括SHA256压缩函数SHA256消息处理流程

数据预处理

​ 将MD5描述中的添加填充位、分组操作和缓冲区初始化我们合并描述为数据预处理阶段。

​ 首先是添加填充位,因为明文的要求同样是512bit一个分组,所以其长度被要求是512的倍数,不足512的倍数要补齐。其实跟MD5仍然是一样的。我们会对报文做如下操作

​ 在明文的尾部首先添加bit位1,其余填充位为0,并在某位加上64bit的长度记录位用于记录明文的具体长度,单位是二进制的长度。但是注意,对于加上64bit的长度记录就已经为512倍数的明文,其仍然要加上填充位,填充长度为512bit,也就是说,对于任何一段需要计算哈希的明文,都要加上填充位,长度1-512bit不等。

​ 其次是分组操作,因为已将消息报文填充到512bit的倍数了,所以按照先后顺序,依次按照512bit的长度,对数据包进行分组就可以,并依次标记为。还有一点需要注意的地方就是可能采用的是大端法对数据进行编码。

​ 另外,在分成每组512bit长度的后,还有一个长度扩充操作。将512bit分为32bit的16个字后,记为w[0], …, w[15],接下来的操作会将其扩充到w[63]。前16个字直接由分块后第i个字得到。后续字由如下公式得到

​ 缓冲区数据的选取就与MD5产生明显的区别了。因为输出为256bit,所以会按照8个32bit的字分为A、B、C、D、E、F、G、H或者令其为初始哈希八个块。

​ 其值的选取也比较有意思,会取自然数中前面8个素数(2,3,5,7,11,13,17,19)的平方根的小数部分,并且只取前面的32bit。比如sqrt(2)小数部分约为0.414213562373095048,转换为16进制表示则为

​ 于是,取前32bit就对应0x6a09e667

​ 以此类推,其余八个初始哈希为

​ 但是在整个SHA256算法中,还需要用到64个常数,去自然数前64个质数的立方根的小数部分的前32bit,如下所示


428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2

SHA-256核心运算

​ 对于每一次的核心SHA256运算,用以下这一个式子就可以表述得很清楚。

​ 其中C是SHA256得压缩函数,+则是mod2^32加法,则是缓冲区的哈希值,在每一次计算中都会被运算并被改变数值的部分,其最后结果也为该部分。

​ 如果按照ABCDEFGH对缓冲区的哈希值进行分块的话,那每一次的运算如下图所示,比较清晰明了。但是要进行如下图所示的操作64轮,才算完成了一次SHA256核心运算。

​ 在上图中,我们发现,大部分都是以字为单位的右移位操作,一次操作后的BCDFGH6个字都是移位得到,由A->B,C->D......因为要经过64轮的操作,所以其实每一位都会被充分利用到。

但只有A块和E块得出的结果是经过非常复杂的函数计算所得。那么具体的操作是怎样的呢。

​ 我们先解释一下

  • 红色田字方块代表mod(2^32)运算

  • Wt则是本区块产生的第t个word(见上面消息预处理中对输入明文部分w[i]的扩充)。

  • Kt则是第k个密钥,对应我们上文提到的64个常量。

  • 而上面的函数则如下图所示

tips:对每一个符号的含义解释

这就是SHA-256的全部操作流程。

SHA-3

简介

同样是SHA算法家族中的一个,最开始意图为取代SHA-2算法,但SHA-2算法至今仍然安全,所以SHA-2与SHA-3算法是目前都是安全、可行且流行的散列算法。而且SHA-3系列的算法是跟SHA-2及之前的算法的架构完全不同的。目前,以太坊中的哈希算法就是采用的SHA-3。

posted @ 2022-03-15 17:56  三木森林  阅读(1318)  评论(0编辑  收藏  举报