SHA加密算法是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。

SHA加密算法原理

接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

SHA加密算法信息产生摘要的过程

SHA加密算法最大输入信息长度小于264位,产生的输出是长164位的信息摘要。输入按每组512位处理。

第一步、附加添凑位 

对信息附加添凑位以便使它的长度等于448(模512)。即使信息已经达到需要的长度,也总是附加添凑位。因此,添凑位的长度范围是1至512位。添凑位由单个“1”后跟必要数目的“0”组成。

第二步、附加长度

将一个长64位的数据块附加到信息添凑位后,这个块被视为一个无符号的64位整数,而且包含了信息在附加添凑位之前的初始长度。

前面两步的结果是产生长度为512的整数倍的信息。用数字标记信息扩展后的512位分组序列Y0,Y1...YL-1,于是扩展后信息的总长度是LX512位。同样地,结果是16个32位字的整数倍。让M0,M1...MN-1代表结果信息字,N为16的整数倍,因此N=LX16。

第三步、初始化MD缓冲区

用一个160位的缓冲区存放哈希函数的中间结果和最终结果。这个缓冲区用5个32位寄存器(A,B,C,D,E)表示。这些寄存器初始化为如下的16进制值(高8位在前):

A=67452301

B=EFCDAB89

C=98BADCFE

D=10325476

E=C3D2E1FO

第四步、处理512位(16字)信息分组

SHA加密算法的核心是一个由80步处理组成的模块,这个模块在上图中标记为HSHA,它的逻辑如下图所示。这80步有相似的结构。

请注意每一层(round)的输入是当前正处理的512位分组YQ和值为ABCDE的160位缓冲区,并在每一层修改缓冲区的内容。再每一层中用到了一个辅助常数K1,K1只用到4个不同的常数值。这些值用16进制表示如图所示:

总之,对分组YQ,SHA加密算法以YQ和摘要的中间值MDQ作为输入。MDQ放在缓冲区ABCDE中,第80步的输出与MDQ相加以产生MDQ+1。这个加法是利用模232加法,由缓冲区5个字中的每一个字单独地与MDQ中相应的字相加完成。

第五步、输出

当所有的L个512位分组处理完后,从L阶段的输出是160位的信息摘要。

在每一层的逻辑中,每一层的形式是:

A,B,C,D,E—[CLS3(A)+FT(B,C,D)+E+WT+KT],A,CLS30(B),C,D

这里,A,B,C,D,E为缓冲区中的5个字;T代表层或步数字型,0≤T≤79;FT是一个简单逻辑函数;CLS3表示循环左移32位变量S位;WT是从当前输入512位分组中产生出来的;KT是一个辅助常数,用到了4个不同的值;“+”是模232加法。

每个简单函数32位输入,32位输出。每个函数执行一组“位位置逻辑”操作。也就是说,第N位输出是第N位3个输入的函数。正如你所见到的,只用到了3个不同的函数。对0≤T≤19,函数是条件函数:如果B那么C否则D。对20≤T≤39和60≤T≤79,函数产生奇偶校验位。对40≤T≤59,如果2个或3个变量值为TRUE,则函数值为TRUE。

现在剩下的是说明32位字WT如何从512位信息中产生。前16个WT的值直接取当前分组产生的16个字。剩下的WT值定义为:WT=WT-16 8 WT-14 8 WT-8 8 WT-3

这样,在前16层处理中,信息分组产生的输入由分组中的一个32位字组成。在余下的64层中,输入由一些信息分组中的字异或而成。

SHA可概述为:

MD0=IV

MDq+1=SUM32(MDq,ABCDEq)

MD=MDl-1

这里,IV为ABCDE缓冲区中的初始值,在第三步中定义;ABCDE为第Q个信息分组在最后一层处理的输出;L为信息(包括附加位和长度域)的分组数;SUM32代表输入的每一对字的独立的模232加法;MD等于最后的信息摘要值。

小知识之信息摘要:

信息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。