PowerShell獲取文件的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的整數倍。這樣做的原因是爲滿足後面處理中對信息長度的要求。

   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算法以後,你可以用以下幾個信息對你做出來的程序作一個簡單的測試,看看程序有沒有錯誤。
   MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
   MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
   MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
   MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
   MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
   MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
   d174ab98d277d9f5a5611c2c9f419d9f

       PowerShell是微軟開發的一門面向對象的腳本語言,具有強大的面嚮對象語言的特點,下面就使用PowerShell語言實現對文件MD5值的獲取方法,以下是代碼:

 $comments = @'
author:fuhj([email protected] ,http://txj.shell.tor.hu)
example:
Get-MD5 "C:/WINDOWS/explorer.exe"
'@
function Get-MD5([System.IO.FileInfo] $file = $(throw 'Usage: Get-MD5 [System.IO.FileInfo]'))
{
  $stream = $null;
  $cryptoServiceProvider = [System.Security.Cryptography.MD5CryptoServiceProvider];
  $hashAlgorithm = new-object $cryptoServiceProvider
  $stream = $file.OpenRead();
  $hashByteArray = $hashAlgorithm.ComputeHash($stream);
  $stream.Close();
  ## We have to be sure that we close the file stream if any exceptions are thrown.
  trap
  {
    if ($stream -ne $null)
    {
      $stream.Close();
    }
    break;
  }
  return [string]$hashByteArray;
}
 

程序的執行效果如下圖所示:

作者: 付海軍
出處:http://space.e800.com.cn/fuhj02
版權:本文版權歸作者和億八佰共有
轉載:歡迎轉載,爲了保存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
個人網站: http://txj.shell.tor.hu

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章