1. HASH算法对比分析
Hash函数也称为杂凑函数或散列函数,函数输入为一可变长度消息,输出为一固定长度串,该串被称为输入为x的Hash值或数字指纹。
1.1 Hash函数的基本要求
Hash函数一般满足以下几个基本要求:
(1) 输入x可以任意长度;
(2) 输出数据长度固定,即Hash值得长度由算法的类型决定,与输入的消息大小无关;
(3) 容易计算,给定任意x,容易计算出x的Hash值;
(4) 单向函数,即给出一个Hash值,很难反向计算出原始输入的数据;
(5) 唯一性,即难以找到两个不同的输入会得到相同的Hash输出值。
1.2 Hash函数的安全性
一个安全的单向迭代函数是构造安全Hash值得核心和基础,有了好的单向迭代函数,就可以用合适的迭代方法来构造迭代Hash函数。
Hash函数的安全理论主要有以下两点:
(1) 函数的单向性;
(2) 函数的随机性。
1.3 SHA算法对比分析
安全散列算法(Secure Hash Algorithm,简称SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能够计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)算法。
SHA是一系列算法的统称,分别包括:SHA-1、SHA-256、SHA384和SHA512。后面三种统称为SHA-2。SHA-384相当于SHA-512的缩减版。
各种SHA算法的数据比较如下表:(表中数据长度单位均为位)
类别 | SHA-1 | SHA-256 | SHA-384 | SHA-512 | SM3 |
消息摘要长度 | 160 | 256 | 384 | 512 | 256 |
消息长度 | 位 | 位 | 位 | 位 | 位 |
分组长度 | 512 | 512 | 1024 | 1024 | 512 |
计算字长度 | 32 | 32 | 64 | 64 | 32 |
计算步骤数 | 80 | 64 | 80 | 80 | 64 |
注:上表中算法用来做数据压缩,用于RSA签名或验证时使用。
1.4 SHA算法、SM3算法实现过程
SHA是数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转化为密文,也可以简单理解为输出一串二进制数据,并把它转化为长度较短、位数固定的输出序列(即散列值),也称为信息摘要或信息验证代码的过程。
一般来说SHA算法、SM3算法都包括以下处理过程:
(1)消息的填充
a. 首先在消息末尾添加比特“1”, 再添加k 个“0”, k是满足L+ 1 + k ≡ 448mod512 的最小的非负整数。
注:SHA-384、SHA-512需要满足1024位分组。所以K需要满足L+ 1 + k ≡ 896mod1024。
b. 然后再添加一个64位比特串,该比特串是长度L的二进制表示。填充后的消息m的比特长度为512的倍数。
注:SHA-384、SHA-512需要满足1024位分组。添加一个128位比特串,填充后的消息m的比特长度为1024的倍数。
例如:对消息01100001 01100010 01100011,其长度l=24,经填充得到比特串:
(2)消息扩展、分组处理
a. 分组
将填充后的消息按照一定大小进行分组,如果分成了N组,就是b(0),b(1)……b(N-1).
SHA-1、SHA-256、SM3按照512位进行分组
SHA-384、SHA-512按照1024位进行分组
b. 消息扩展
★ SHA-1是将消息扩展为80个字的消息列表,两部分组成:(1个字32位)
16个字的填充后的消息 + 64个字计算得到的填充消息
★ SHA-256是将消息扩展为64个字的消息列表,两部分组成:
16个字的填充后的消息 + 48个字计算得到的填充消息
★ SHA-384、SHA-512是将消息扩展为80个字的消息列表,两部分组成:(1个字64位)
16个字的填充后的消息 + 64个字计算得到的填充消息
★ SM3是将消息扩展生成132个字的消息列表,用于压缩函数CF:(三部分组成)
第一部分:(16字)将填充得到的一组消息划分为16个字形式表示,w0,w1……w15;
第二部分:(52字)16->67
Wj = P1(Wj−16 ⊕ Wj−9 ⊕ (Wj−3 ≪ 15)) ⊕ (Wj−13 ≪ 7) ⊕ Wj−6
第三部分:(64字)0-63
W ‘j = Wj ⊕ Wj+4
(3)迭代压缩
a. SHA-1首先要确定5个32位初始值(A,B,C,D,E),然后进行4轮运算,每一轮包括20个步骤,一共80步。
b. SHA-256首先要确定8个32位初始值(A,B,C,D,E,F,G,H),然后进行64轮迭代运算。
c. SHA-384、SHA-512首先要确定8个64位初始值(A,B,C,D,E,F,G,H),然后进行80轮迭代运算。
d. SM3首先要确定8个32位初始值(A,B,C,D,E,F,G,H),然后进行64轮迭代运算。
注:对于多个分组数据,上一轮的输出结果为下一轮的初始值。
(4)计算完成、输出结果
输出结果对于SHA-1、SHA-256、SHA-384、SHA-512,是初始值加最后一次值的和的取值,对于SM3是初始值与最后一次值的异或得到的值。
a. SHA-1进过迭代压缩后,产生160位(20字节)的消息摘要。
b. SHA-256进过迭代压缩后,产生256位(32字节)的消息摘要。
c. SHA-384进过迭代压缩后,产生384位(48字节)的消息摘要。
d. SHA-512进过迭代压缩后,产生512位(64字节)的消息摘要。