SHA算法基本认证原理
SHA(Secure Hash Algorithm,安全哈希算法)主要适用于数字签名,也是一种不可逆的MAC算法,但比MD5算法更加安全。目前它有三种主要的版本,即SHA-0、SHA-1、SHA-2和SHA-3。其中SHA-2和SHA-3版本中又有多种不同子分类,如在SHA-2中又根据它们最终所生成的摘要消息长度的不同又包括SHA-224、SHA-256、SHA-384和SHA-512等几种。
1. SHA算法基本认证原理
整个SHA算法的认证原理与MD5算法认证原理极为相似,同样先把原始消息划分成固定长度的块,最后加上用于标识原始消息长度的位(不同SHA版本中用于标识原始消息长度的位数不一样),再结合共享密钥(可以是共同设置的预共享密钥,也可以是对端公钥),利用一系列的逻辑算法生成固定长度的消息摘,用于在接收端进行消息完整性验证和消息源身份认证。
在各种版本SHA算法中(因为SHA-3的算法与其他SHA版本的算法有较大不同,故在此不作介绍),进行散列运算时所涉及的一些参数特性不完全相同,具体如表1所示。从表中可以看出,SHA-0、SHA-1算法与MD5类似,都是把输入原始消息的二进制串划分成512位的块,最后一块的最后64位用于表示原始消息的长度,不足512位时也要进行填充。
表1 主要MAC算法的基本参数特性比较
2. SHA算法消息填充原理
SHA算法中在进行消息分块时也可能要进行填充。其填充的方法与MD5算法一样,也是先加1位“1”,然后填充若干位“0”。如SHA-0和SHA-1最后会把划分和填充后的消息与共享密钥进行80轮的逻辑运算处理,得到一个160位的摘要消息。但SHA-0和SHA-1仍然容易出现碰撞(即有可能多个不同消息运算后得到相同的摘要),所以目前主要是采用SHA-2版本。
下面仅以SHA-512(也有写成SHA2-256的)为例介绍其基本的摘要运算过程。其他SHA版本的基本摘要算法类似。
(1)把包括密钥和初始消息在内的二进制比特串(假设称之为“原始消息”,小于2128),以及在最后新增一个用于记录原始消息二进制长度的128位一起被划分成一个个1024位(32个32位字长)的块;
当采用SHA-512进行运算时,如果原始消息长度大于等于2128时,只取前面2128−1位进行摘要运算。
(2)同样再对以上划分的1024位的块经过系列“与”(And)、“或”(OR)、“非”(NOT)、“异或”(AOR)逻辑算法(具体算法我们可以不做了解)处理后,输出8个64位分组,将这8个64位分组级联后将生成一个512位散列值(消息摘要)。
这里同样涉及“填充”操作,因为大多数原始消息(包括密钥和初始消息),加上128位后可能仍不能恰好被1024整除,也就是原始消息的二进制位数除以1024后的余数不是896(1024-128=896),这时就表明需要对原始信息进行填充处理了。但这里同样有两种情况:一种是余数小于896,另一种就是余数大于896。
如果原始消息二进制位数除以1024后的余数小于896,则先在原始消息的最后一个1024位块的最后填充一个1,然后再填充若干位0,使得该块的原始消息总长度等于896位,然后加上用于标识原始消息长度的128位,正好形成一个1024位的块。
如一个有1500位的消息,则可划分成两个1024位的块:第一个块是1024位全部为原始消息;第二个块中有476位原始消息,然后进行填充:先在最后填充1位“1”,再填充419位“0”,使得476位原始信息+1位,1+419位,0=896位,最后再附上128位用于标识原始信息长度(1500)的值。
如果如果原始消息二进制位数除以1024后的余数大于896,这时要新增一个1024位的块了。首先是在原始消息的最后一个1024位块的最后填充一个1,然后再填充若干位0,使得该块的原始消息总长度等于1024位;接着再新增一个块,前面896位均填充0,再加上用于标识原始消息长度的128位,形成新的一个1024位块。
如有一个1924位的消息,则最终会划分成三个1024位的块:第一个块是1024位全部为原始消息;第二个块中有900位原始消息,然后进行填充:先在最后填充1位“1”,再填充123位“0”,使得900位原始信息+1位,1+123位,0=1024位;最后是一个新增的块,也要进行填充:先在前面填充896位0,最后再附上128位用于标识原始信息长度(1924)的值。
