SHA算法家族包括SHA-1、SHA-224、SHA-256、SHA-384、SHA-512几种算法,接下来就以最具代表性的SHA-1算法的具体计算过程。
SHA-1是一种能够根据上限为264比特的信息计算出160比特的单向散列函数。
算法分析:
1)填充
SHA-1算法的输入信息长度在0到264比特之间,为了后续处理,会在信息的末尾添加多余的数据,使其长度为512比特的整数倍。512比特是SHA-1算法的输入分组长度。
填充过程:
· 在消息末尾添加一个1比特的数值“1”,此时,信息的长度增加1比特。
· 在消息末尾继续追加0,直到消息的长度达到512比特的整数倍,最后一个分组需要保留最后64比特,以便存储原始输入信息的长度。
· 在最后一个分组的最后64位需要保存原始输入信息的长度,因此输入信息的最大长度是264比特。
2)计算W0 ~ W79
填充完成之后,对每个输入分组计算80个32比特的值(W0 ~ W79),这80个值用于“单步处理”阶段使用。
计算过程:
· 针对512比特的输入分组进行切分,切分为16个32比特的分组,命名为W0 ~ W15,然后,计算剩余的W16 ~ W79。
· 公式:Wt = (Wt - 16⊕Wt - 14⊕Wt - 8⊕Wt - 3)循环左移1比特。循环左移的意思是,将比特序列逐一向左平移,最高位的比特移动到最低位。
⊕表示异或操作,安装上面的计算逻辑计算出W0 ~ W79,计算数量较大,但计算逻辑较简单。
3)分组处理
接下来,需要对输入分组进行80个步骤处理,目的是根据输入分组的信息来改变内部状态(160比特),对所有的输入分组都要执行这一操作。
160比特的内部状态是通过名为A、B、C、D、E的5个32比特的缓冲区来表示。如图所示,这一步是将5个缓冲区的值与输入分组的信息进行混合,然后再执行80个步骤的处理。这80个步骤所完成的操作,就是将输入分组的512比特的数据,与SHA-1所保持的160比特的内部状态进行混合。通过上述80个步骤的反复执行,SHA-1就能够将已经过填充的消息全部混入这160比特的内部状态中,而SHA-1所输出的散列值,就是所有处理结束之后最终的内部状态(160比特)。
4)单步处理
“3)分组处理”中提到的80个步骤,其中每个步骤详细流程如下图:
这些处理非常复杂,目的是为了根据W0 ~ W79的信息是内部状态(即A、B、C、D、E的值)产生变化。
在一个步骤完成后,缓冲区A、B、C、D的内容会被分别复制到B、C、D、E中(其中B要循环左移30比特之后再复制),而缓冲区E的内容则会与其它缓冲区的内容自己Wt、Kt相加之后再被复制到缓冲区A中。
由于上述处理要循环80个步骤,因此分组中1个比特发生变化,都会影响到散列值中几乎所有的比特,通过这样的方式,就能够实现单向散列函数所具备的性质。
注:本文参照《图解密码技术》一书。