1.MD5
MD5是MD4的改进版,用512位分组来操作输入的信息,产生128位散列值。
MD5算法的计算过程主要包括以下步骤。
(1)预填充
第一步,填充信息使它的位长对512求余的结果是448,即信息的位长被扩展至Nx512+448或N×64+56个字节(N是正整数)。填充的方法是在信息后填充一个1和多个0,直至达到上面的条件。然后,再附加一个64位二进制代表的填充之前信息的长度。通过这两步的处理,让消息的长度刚好是512位的整数倍。
(2)主循环
主循环的次数是信息中512位分组的数目。MD5中需要4个32位的链接变量: A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。
每个主循环有4轮(MD4仅仅有3轮)每轮循环均非常近似。在主循环开始前,先将4个链接变量复制到另外4个变量中:A到a,B到b,C到c,D到d。第一轮进行16次操作。每次操作对a、b、c和d中的3个做一次非线性函数运算,然后把得出的结果加第4个变量、512位分组数据和一个常数。再把得到的结果向右环移一个不固定的数,并加上a、b、c、d中之一。最终用此结果代替a、b、c或d中之一。
每个主循环完成以后,将A、B、C、D分别加上a、b、c、d,然后用下一个512位分组数据继续进行主循环运算,直到全部分组都完成主循环运算。
(3)输出处理
把最后一个主循环生成的A、B、C、D这四个32位值进行级联,生成一个128位的摘要值。
2. SHA1
SHA1是以512位分组来操作输入信息的,得到160位散列值。
SHA1算法的计算过程与MD5类似,主要包括以下步骤。
(1)预填充
填充方法与MD5全部相同。
(2)主循环
主循环的次数是信息中512位分组的数目。SHA1中需要5个32位的链接变量:A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476,E=0xc3d2e1f0。
每个主循环有4轮,每轮20次操作(MD5有4轮,每轮16次操作)。在主循环开始前,先将5个链接变量复制到另外5个变量中:A到a,B到b,C到c,D到d,E到e。每次操作对a、b、c、d、e中的3个进行一次非线性运算,然后进行与MD5中类似的移位运算和加运算。
每个主循环完成以后,将A、B、C、D、E分别加上a、b、c、d、e,然后用下一个512位分组数据继续进行主循环运算,直至全部分组都完成主循环运算。
(3)输出处理
把最后一个主循环生成的A、B、C、D、E这5个32位值进行级联,生成一个160位的摘要值。
3.SM3
SM3算法是主要满足电子认证服务系统等应用需求的摘要算法。
针对长度为l(l<264)比特的消息m,SM3算法通过填充与迭代压缩,得到杂凑值,其长度为256位。其中填充过程为:假设消息m的长度为l位。首先将位“1”添加到消息的末尾,再添加k个“0”,k是满足l+1+k=448 mod 512的最小的非负整数;然后再加入一个64位的比特串,该比特串是长度l的二进制表示;填充后的消息m’的比特长度是512的倍数。