逆向算法之MD5算法


MD5的典型應用是對一段信息產生信息摘要,以防止被篡改。

算法過程:對MD5算法簡要的敘述可以為:MD5以512位分組來處理出入的信息,且每一分租又被划分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將產生一個128位散列值。

在MD5算法中,首先需要對信息進行填充,使其位長對512求余的結果等於448。因此,信息的位長(Bits Length)將被擴展至N*512+448,即N*64+56個字節(Bytes),N為一個正整數。填充的方法如下,在信息的后面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然后,在在這個結果后面附加一個以64位二進制表示的填充前信息長度。經過這兩步的處理,現在的信息的位長=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足后面處理中對信息長度的要求。注意即使消息長度已經滿足該公式的要求(位長對512求余的結果等於448),仍然需要填充。
  MD5中有四個32位被稱作鏈接變量(Chaining Variable)的整數參數,他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。

當設置好這四個鏈接變量后,就開始進入算法的四輪循環運算。循環的次數是信息中512位信息分組的數目。
  將上面四個鏈接變量復制到另外四個變量中:A到a,B到b,C到c,D到d。
  主循環有四輪(MD4只有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然后將所得結果加上第四個變量,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最后用該結果取代a、b、c或d中之一。
  以一下是每次操作中用到的四個非線性函數(每輪一個)。
  F(X,Y,Z) =(X&Y)|((~X)&Z)
  G(X,Y,Z) =(X&Z)|(Y&(~Z))
  H(X,Y,Z) =X^Y^Z
  I(X,Y,Z)=Y^(X|(~Z))
  這四個函數的說明:如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。
  F是一個逐位運算的函數。即,如果X,那么Y,否則Z。函數H是逐位奇偶操作符。
  假設Mj表示消息的第j個子分組(從0到15),<<
  FF(a, b, c, d, Mj, s, ti)表示 a = b + ((a + F(b, c, d) + Mj + ti) << s)
  GG(a, b, c, d, Mj, s, ti)表示 a = b + ((a + G(b, c, d) + Mj + ti) << s)
  HH(a, b, c, d, Mj, s, ti)表示 a = b + ((a + H(b, c, d) + Mj + ti) << s)
  II(a, b, c, d, Mj, s, ti)表示 a = b + ((a + I(b, c, d) + Mj + ti) << s)
  
這四輪(64步)是:
  第一輪
  FF(a, b, c, d, M0, 7, 0xd76aa478)
  FF(d, a, b, c, M1, 12, 0xe8c7b756)
  FF(c, d, a, b, M2, 17, 0x242070db)
  FF(b, c, d, a, M3, 22, 0xc1bdceee)
  FF(a, b, c, d, M4, 7, 0xf57c0faf)
  FF(d, a, b, c, M5, 12, 0x4787c62a)
  FF(c, d, a, b, M6, 17, 0xa8304613)
  FF(b, c, d, a, M7, 22, 0xfd469501)
  FF(a, b, c, d, M8, 7, 0x698098d8)
  FF(d, a, b, c, M9, 12, 0x8b44f7af)
  FF(c, d, a, b, M10, 17, 0xffff5bb1)
  FF(b, c, d, a, M11, 22, 0x895cd7be)
  FF(a, b, c, d, M12, 7, 0x6b901122)
  FF(d, a, b, c, M13, 12, 0xfd987193)
  FF(c, d, a, b, M14, 17, 0xa679438e)
  FF(b, c, d, a, M15, 22, 0x49b40821)
  第二輪
  GG(a, b, c, d, M1, 5, 0xf61e2562)
  GG(d, a, b, c, M6, 9, 0xc040b340)
  GG(c, d, a, b, M11, 14, 0x265e5a51)
  GG(b, c, d, a, M0, 20, 0xe9b6c7aa)
  GG(a, b, c, d, M5, 5, 0xd62f105d)
  GG(d, a, b, c, M10, 9, 0x02441453)
  GG(c, d, a, b, M15, 14, 0xd8a1e681)
  GG(b, c, d, a, M4, 20, 0xe7d3fbc8)
  GG(a, b, c, d, M9, 5, 0x21e1cde6)
  GG(d, a, b, c, M14, 9, 0xc33707d6)
  GG(c, d, a, b, M3, 14, 0xf4d50d87)
  GG(b, c, d, a, M8, 20, 0x455a14ed)
  GG(a, b, c, d, M13, 5, 0xa9e3e905)
  GG(d, a, b, c, M2, 9, 0xfcefa3f8)
  GG(c, d, a, b, M7, 14, 0x676f02d9)
  GG(b, c, d, a, M12, 20, 0x8d2a4c8a)
  第三輪
  HH(a, b, c, d, M5, 4, 0xfffa3942)
  HH(d, a, b, c, M8, 11, 0x8771f681)
  HH(c, d, a, b, M11, 16, 0x6d9d6122)
  HH(b, c, d, a, M14, 23, 0xfde5380c)
  HH(a, b, c, d, M1, 4, 0xa4beea44)
  HH(d, a, b, c, M4, 11, 0x4bdecfa9)
  HH(c, d, a, b, M7, 16, 0xf6bb4b60)
  HH(b, c, d, a, M10, 23, 0xbebfbc70)
  HH(a, b, c, d, M13, 4, 0x289b7ec6)
  HH(d, a, b, c, M0, 11, 0xeaa127fa)
  HH(c, d, a, b, M3, 16, 0xd4ef3085)
  HH(b, c, d, a, M6, 23, 0x04881d05)
  HH(a, b, c, d, M9, 4, 0xd9d4d039)
  HH(d, a, b, c, M12, 11, 0xe6db99e5)
  HH(c, d, a, b, M15, 16, 0x1fa27cf8)
  HH(b, c, d, a, M2, 23, 0xc4ac5665)
  第四輪
  II(a, b, c, d, M0, 6, 0xf4292244)
  II(d, a, b, c, M7, 10, 0x432aff97)
  II(c, d, a, b, M14, 15, 0xab9423a7)
  II(b, c, d, a, M5, 21, 0xfc93a039)
  II(a, b, c, d, M12, 6, 0x655b59c3)
  II(d, a, b, c, M3, 10, 0x8f0ccc92)
  II(c, d, a, b, M10, 15, 0xffeff47d)
  II(b, c, d, a, M1, 21, 0x85845dd1)
  II(a, b, c, d, M8, 6, 0x6fa87e4f)
  II(d, a, b, c, M15, 10, 0xfe2ce6e0)
  II(c, d, a, b, M6, 15, 0xa3014314)
  II(b, c, d, a, M13, 21, 0x4e0811a1)
  II(a, b, c, d, M4, 6, 0xf7537e82)
  II(d, a, b, c, M11, 10, 0xbd3af235)
  II(c, d, a, b, M2, 15, 0x2ad7d2bb)
  II(b, c, d, a, M9, 21, 0xeb86d391)
  常數ti可以如下選擇:
  在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。(4294967296等於2的32次方)
  所有這些完成之后,將A、B、C、D分別加上a、b、c、d。然后用下一分組數據繼續運行算法,最后的輸出是A、B、C和D的級聯。

所以MD5加密算法的特征值就是寄存器初始值:67452301 efcdab89 98badcfe 10325476  Ti數組常量:d76aa478 e8c7b756 242070db c1bdceee。

特征運算為:

F( X ,Y ,Z ) = ( X & Y ) | ( (~X) & Z )

G( X ,Y ,Z ) = ( X & Z ) | ( Y & (~Z) )

H( X ,Y ,Z ) =X ^ Y ^ Z

I( X ,Y ,Z ) =Y ^ ( X | (~Z) )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM