1. 程式人生 > 其它 >雜湊加密演算法 - MD5

雜湊加密演算法 - MD5

雜湊加密演算法 - MD5

MD5資訊摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。

特性

1、壓縮性:無論資料長度是多少,計算出來的MD5值長度相同

2、容易計算性:由原資料容易計算出MD5值

3、抗修改性:即便修改一個位元組,計算出來的MD5值也會巨大差異

4、抗碰撞性:知道資料和MD5值,很小概率找到相同MD5值相同的原資料

原理

  • step 1:填充補齊

    • 將原始資料長度補齊成512bit的整數倍

    • 填充的bit中最後64bit用於表示原始資料長度

    • 其餘填充bit中第一個bit為1,其餘bit為0

  • step 2:分塊

    • 若干512bit的資料塊

    • 每個資料塊又分為16個32bit的分組,方便邏輯運算

  • step 3:處理資料

    • 入口引數(IV,M),IV為初始幻數、M為512bit資料塊

    • 定義四種邏輯運算

    • 定義了四種函式

      $$
      FF(a,b,c,d,M_i,s_j,t_k):~~~~~~a=b+((a+F(b,c,d)+M_i+t_k) <<< s_j)\\ GG(a,b,c,d,M_i,s_j,t_k):~~~~~~a=b+((a+G(b,c,d)+M_i+t_k) <<< s_j)\\ HH(a,b,c,d,M_i,s_j,t_k):~~~~~~a=b+((a+H(b,c,d)+M_i+t_k) <<< s_j)\\ II(a,b,c,d,M_i,s_j,t_k):~~~~~~a=b+((a+I(b,c,d)+M_i+t_k) <<< s_j)\\ a,b,c,d分別為四種幻數\\ M_i為每一個32bit分組,M[16]\\ s_j為迴圈左移位數,s[16]\\ t_k為常量陣列,t[4*16]
      $$

      每一次函式所完成的操作

    • 初始幻數IV (A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210),計算機按小端序儲存

    • s={
      7, 12, 17, 22,
      5, 9, 14, 20,
      4, 11, 16, 23,
      6, 10, 15, 21
      };
      t={
      0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,

      0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,

      0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,

      0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
      }
    • 每一輪函式共進行四次迴圈,每一次迴圈進行四次函式計算

      例:

      $$
      a=FF(a,b,c,d,M_i,s_j,t_k)\\ b=FF(d,a,b,c,M_{i+1},s_{j+1},t_{k+1})\\ c=FF(c,d,a,b,M_{i+2},s_{j+2},t_{k+2})\\ d=FF(b,c,d,a,M_{i+3},s_{j+3},t_{k+3})\\
      $$
    • 這樣在計算的過程中IV又被賦予了新的值

  • step 4:如此往復,將最後一次函式運算結束時a,b,c,d的值拼接起來作為128bit的MD5值