MD5算法

 

 

1。MD5中的术语及定义运算
   1)位,字节,字;相互之间关系
   2)定义的运算,+,—,乘方,与,或,非,异或,循环移位

2。MD5算法描述
   输入:任意长度的字符串;
   输出:128-bit 信息摘要;
算法步骤:
   1)对输入进行补位;先对输入的数据进行补位,使得数据位长度Length模512的结果是448.具体补位的方法是:先补一个1,然后补0至满足上述要 求,需要注意的是,如果数据的本来长度已经满足上述条件,仍需进行补位操作。也就是说,进行补位操作的位数最少为1位,最多为512位。

   2)对输入补足长度:在步骤1)结束后,信息为512*k+448;在其后添加64bit,这64bit表示原始数据的长度,补足后信息的长度为512*k。由于很少有超过2^64的数据,故可以满足大多数的情况。这64bit的信息分为两个字,按照低序排位。

   3)初始化MD5的参数:在算法过程中,需要使用4个32位的参数来计算信息的摘要。这里借用A、B、C、D四个32bit的寄存器,其初始化的值如下所示(16进制,低位优先):
      A:01 23 45 67
      B:89 AB CD EF
      C:FE DC BA 98
      D:76 54 32 10

   4)以16个字方式处理信息:
      a.这里定义了4个辅助性的函数F,G,H,I;这些函数输入为3个32bit,输出为1个32bit;具体的函数定义如下:
      F(X,Y,Z)=XY v NOT(X)Z
      G(X,Y,Z)=ZX v NOT(Z)Y
      H(X,Y,Z)=X XOR Y XOR Z
      I(X,Y,Z)=Y XOR (X v NOT(Z))

      这些函数的具体意义是:
       F表明,针对每一二进制位,IF X THEN Y ELSE Z;
       G表明,针对每一二进制位,IF Z THEN X ELSE Y;
       H表明,对X,Y,Z进行异或操作;
       I表明,对Z取反后与X做或操作,然后与Y做异或操作。

       b.64个元素的数组T[64],这个数组使用sine函数构造而来,T[i]表示数组的第i个元素,32bit,其值等于abs(sin(i))的4294967296倍的整数部分,i是弧度。

       c.循环如下:
       /*处理每512位的数据块*/
       For i = 0 to N/16 -1 do
          /*Copy block i into X.*/
          For j = 0 to 15 do
            Set X[j] to M[i*16 + j].
          end
          /* of loop on j */

/* Save A as AA, B as BB, C as CC, and D as DD.*/
     AA = A
     BB = B
     CC = C
     DD = D

/* 第1轮*/
/* 以 [abcd k s i]表示如下操作a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */
[ABCD 0 7 1]   [DABC 1 12 2]   [CDAB 2 17 3]   [BCDA 3 22 4]
[ABCD 4 7 5]   [DABC 5 12 6]   [CDAB 6 17 7]   [BCDA 7 22 8]
[ABCD 8 7 9]   [DABC 9 12 10]  [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

/* 第2轮* */
/* 以 [abcd k s i]表示如下操作 a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s).*/

/* Do the following 16 operations. */
[ABCD 1 5 17]  [DABC 6 9 18]  [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21]  [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25]  [DABC 14 9 26] [CDAB 3 14 27]  [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30]  [CDAB 7 14 31]  [BCDA 12 20 32]

/* 第3轮*/
/* 以 [abcd k s i]表示如下操作a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39]  [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47][BCDA 2 23 48]

/* 第4轮*/
/* 以 [abcd k s i]表示如下操作a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49]  [DABC 7 10 50]  [CDAB 14 15 51][BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54]  [CDAB 10 15 55][BCDA 1 21 56]
[ABCD 8 6 57]  [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61]  [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

/* 然后进行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD

end /* 结束对i的循环*/

      5)输出结果:结果为A,B,C,D。

 

        参考了rfc1321感觉有些没有读懂,这些基本算法流程就是如此,但是对算法中的第四部分以16字方式处理信息,里面怎么是都是以16作为处理单元呢?有些糊涂了,继续读算法的实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值