安全算法—SHA-256算法

1. 什么是SHA-256?

        SHA-256SHA2中的一种。对于长度LL<)比特的消息m,经过对消息的填充和迭代压缩,SHA-256可以生成一个被称为消息摘要的256位(32字节)散列值,散列值通常的呈现形式为64个十六进制数。

2.  SHA-256算法实现步骤

2.1 把消息转换为位字符串

       SHA-256算法是按照位作为输入,所以进行计算前必须把原始消息(比如字符串、文件等)转换成位字符串。

  比如,对字符串abc”产生消息摘要,‘a=97 b=98 c=99,先转换成24位的字符串:

            01100001 01100010 01100011

2.2 对转换得到的位字符串进行补位操作

  消息必须进行补位,使其长度在对512取模以后的余数是448,即(补位后的消息长度)%512 = 448

  对消息进行补位时,先在后面补一个1,如果不满足要求,再补0直到满足对512取模余数为448。这就意味着,补位至少补一位(原消息位数为512n+447),最多补512位(原消息位数为512n+448)。

  还是以前面的abc”为例显示补位的过程:

  原始信息: 01100001 01100010 01100011

  补位第一步,首先补一个101100001 01100010 01100011 1

  可以确定的是,如果用一个字节来表示一个字符,补1之后肯定不满足条件,仍需继续补位。

  补位第二步,后面补0直到总长度对512取模余数为448,这里补4230,使总长度达到为448

            01100001 01100010 01100011 1000..00

  补位完成后的数据转换为16进制:

  61626380 00000000 00000000 00000000

       00000000 00000000 00000000 00000000

       00000000 00000000 00000000 00000000

       00000000 00000000

  从16进制数据里可以看到,我们也可以直接采用16进制的方式进行补位,我们先补80,看是否满足长度对64取余的结果为56,不满足则继续补0

2.3 消息扩展、分组处理

  这一步中,要将原始消息(没有进行补位操作之前)的长度(二进制位数)附加到已经补位的消息之后。

  通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0

  补长度的操作以后,整个消息(16进制)如下:

        61626380 00000000 00000000 00000000

        00000000 00000000 00000000 00000000

        00000000 00000000 00000000 00000000

        00000000 00000000 00000000 00000018

  然后,将整个消息拆分为一个一个的512位的数据块M1M2,…,Mn,然后分别对每一个数据块Mi (1in)做处理,得到消息摘要。

  注意,这里是64位,上一步补位后的长度是512k+448,k0,这样,512k+448+64=512(k+1),恰好可以被512整除。

在我们举得例子里,一共只有512位,因此做为一个数据块进行处理。

填充完了之后消息被分为了512位的消息分组。每个分组被分为1632位的子分组,记为:M(i)0M(i)1...M(i)15。将对N个消息分组进行如下操作。

a64个消息列表的生成

    For t = 0 to 15

    Wt = M(i)t

    For t = 16 to 63

    Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(w(t-15)) + W(t-16)

2.4 使用的常量和函数

        SHA-256采用6432位的常数序列。通常记为:K0K1、……、K63,这些常数的取值是前64个质数的立方根的小数部分的前32位。

        SHA-256采用6个逻辑函数,每个函数均基于32位字运算,这些输入的32位字我们记为xyz,同样的这些函数的计算结果也是一个32位字。

2.5计算消息摘要

  消息列表每32位分为一个子分组,被标记为W0W1、…、W638个工作变量分别为abcdefgh8个散列值被标记为h(i)0h(i)1、…、H(i)7,并保留初始散列值H(0),替换为每一个连续的中间散列值(在处理完每个消息分组后) H(i),并以最终的散列值H(N)结束,在处理完所有N块后。还使用两个临时变量T1T2

1)初始化工作变量

而对于SHA-256来说,初始散列值H(0)由以下832位的十六进制数组成。这些字由前8个质数的平方根的小数部分的钱32位组成。

    a = H(0)0 = 6a09e667

    b = H(0)1 = bb67ae85

    c= H(0)2 = 3c6ef372

    d = H(0)3 = a54ff53a

    e = H(0)4 = 510e527f

    F = H(0)5 = 9b05688c

    g = H(0)6 = 1f83d9ab

    H(0)7 = 5be0cd19

2)执行散列计算

    For t = 0 to 63

    T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt

    T2 = BSIG0(a) + MAJ(a,b,c)

    h = g

    g = f

    f = e

    e = d + T1

    d = c

    c = b

    b = a

    a = T1 + T2

3)输出计算结果

    H(i)0 = a + H(i-1)0

    H(i)1 = b + H(i-1)1

    H(i)2 = c + H(i-1)2

    H(i)3 = d + H(i-1)3

    H(i)4 = e + H(i-1)4

    H(i)5 = f + H(i-1)5

    H(i)6 = g + H(i-1)6

    H(i)7 = h + H(i-1)7

最后得到H(i)0H(i)1H(i)2H(i)3H(i)4H(i)5H(i)6H(i)7的串联值,256位的消息摘要。

3.  SHA-256安全性分析

        Hash函数的安全性很大程度上取决于抗强碰撞的能力,即攻击者找出两个消息MMtMMt,使得H(M)=HMt  ,因此,评价一个Hash函数的安全性,就是看攻击者在现有的条件下,是否可以找到该函数的一对碰撞。目前已有的对Hash函数攻击的方法包括生日攻击、彩虹表攻击、差分攻击等。

  生日攻击:生日攻击是一种可用于攻击任何类型函数Hash函数的攻击方法。从攻击原理上看,它没有利用Hash函数的结构和任何代数弱性质,只依赖与Hash值的长度。因此,抵御生日攻击最有效的方法是Hash值必须有足够的长度。

  差分攻击:差分攻击是目前破译迭代Hash函数最有效的手法之一,其基本方法是利用明文的输入差值对输出差值的影响,运用差分的高概率的继承或者消除来产生最终的相同输出。

  用于消息唯一性和数据完整性验证的Hash函数,其安全性依赖于函数本身的属性和对抗碰撞的抵抗。Hash函数的算法结构特点和Hash值的长度是决定函数碰撞性的而主要因素,Hash值越长,越能抵御生日攻击。SHA-256256比特Hash值,MD5SHA-1分别有128160比特的Hash值。因此,SHA-256MD5SHA-1能抵抗生日攻击。通过对Chabaud-Joux攻击SHA-256的分析,找到了SHA-256的一个部分碰撞,其复杂度为2^66,但无法找到SHA-256的一个整体碰撞,因此SHA-256算法也能抵御现有的差分攻击。由此可见,在抵御生日攻击和抵御已知差分攻击方面,SHA-256算法比现在广泛使用的MD5SHA-1等更具安全性。

 

你可能感兴趣的:(安全算法)