PowerShell獲取文件的SHA1值

        安全哈希算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那麼這時候就會產生不同的消息摘要。

  SHA1有如下特性:不可以從消息摘要中復原信息;兩個不同的消息不會產生同樣的消息摘要。
SHA1算法的實現描述可以敘述爲:
SHA1算法中,我們必須把原始消息(字符串,文件等)轉換成位字符串。SHA1算法只接受位作爲輸入。假設我們對字符串“abc”產生消息摘要。首先,我們將它轉換成位字符串如下:
  01100001 01100010 01100011
  ―――――――――――――
  'a'=97 ‘b’=98 ‘c’=99
  這個位字符串的長度爲24。下面我們需要5個步驟來計算MD5
1 補位
  消息必須進行補位,以使其長度在對512取模以後的餘數是448。也就是說,(補位後的消息長度)%512 = 448。即使長度已經滿足對512取模後餘數是448,補位也必須要進行。
  補位是這樣進行的:先補一個1,然後再補0,直到長度滿足對512取模後餘數是448。總而言之,補位是至少補一位,最多補512位。還是以前面的“abc”爲例顯示補位的過程。
  原始信息: 01100001 01100010 01100011
  補位第一步:01100001 01100010 01100011 1
  首先補一個“1”
  補位第二步:01100001 01100010 01100011 10…..0
  然後補423“0”
  我們可以把最後補位完成後的數據用16進制寫成下面的樣子
  61626380 00000000 00000000 00000000
  00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000
  00000000 00000000
  現在,數據的長度是448了,我們可以進行下一步操作。
2 補長度
  所謂的補長度是將原始數據的長度補到已經進行了補位操作的消息後面。通常用一個64位的數據來表示原始消息的長度。如果消息長度不大於2^64,那麼第一個字就是0。在進行了補長度的操作以後,整個消息就變成下面這樣了(16進制格式)
  61626380 00000000 00000000 00000000
  00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000018
  如果原始的消息長度超過了512,我們需要將它補成512的倍數。然後我們把整個消息分成一個一個512位的數據塊,分別處理每一個數據塊,從而得到消息摘要。
3 使用的常量
  一系列的常量字K(0), K(1), ... , K(79),如果以16進制給出。它們如下:
  Kt = 0x5A827999 (0 <= t <= 19)
  Kt = 0x6ED9EBA1 (20 <= t <= 39)
  Kt = 0x8F1BBCDC (40 <= t <= 59)
  Kt = 0xCA62C1D6 (60 <= t <= 79).
4 需要使用的函數
  在SHA1中我們需要一系列的函數。每個函數ft (0 <= t <= 79)都操作32位字BCD並且產生32位字作爲輸出。ft(B,C,D)可以如下定義
  ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
  ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
  ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
  ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).
5 計算消息摘要
  必須使用進行了補位和補長度後的消息來計算消息摘要。計算需要兩個緩衝區,每個都由532位的字組成,還需要一個8032位字的緩衝區。第一個5個字的緩衝區被標識爲ABCDE。第二個5個字的緩衝區被標識爲H0, H1, H2, H3, H4
  。80個字的緩衝區被標識爲W0, W1,..., W79
  另外還需要一個一個字的TEMP緩衝區。
  爲了產生消息摘要,在第4部分中定義的16個字的數據塊M1, M2,..., Mn
  會依次進行處理,處理每個數據塊Mi 包含80個步驟。
  在處理每個數據塊之前,緩衝區{Hi} 被初始化爲下面的值(16進制)
  H0 = 0x67452301
  H1 = 0xEFCDAB89
  H2 = 0x98BADCFE
  H3 = 0x10325476
  H4 = 0xC3D2E1F0.
  現在開始處理M1, M2, ... , Mn。爲了處理 Mi,需要進行下面的步驟
  (1). Mi 分成 16 個字 W0, W1, ... , W15, W0 是最左邊的字
  (2). 對於 t = 16 79 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).
  (3). A = H0, B = H1, C = H2, D = H3, E = H4.
  (4) 對於 t = 0 79,執行下面的循環
  TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
  E = D; D = C; C = S30(B); B = A; A = TEMP;
  (5). H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
  在處理完所有的 Mn, 後,消息摘要是一個160位的字符串,以下面的順序標識
  H0 H1 H2 H3 H4.
  對於SHA256,SHA384,SHA512。你也可以用相似的辦法來計算消息摘要。對消息進行補位的算法完全是一樣的。
SHA1算法是能夠用來做消息摘要的重要函數,這裏以PowerShell語言爲藍本對SHA1算法進行實現,完成對文件SHA1哈希值的獲取,代碼如下所示:
$comments = @'
author:fuhj([email protected] ,http://txj.shell.tor.hu)
example:
.\filesha1.ps1 "C:\WINDOWS\explorer.exe"
'@
[Reflection.Assembly]::LoadWithPartialName("System.Security") | out-null 
$sha1 = new-Object System.Security.Cryptography.SHA1Managed  
$args | %{  
     resolve-path $_ | %{  
     write-host ([System.IO.Path]::GetFilename($_.Path))  
     $file = [System.IO.File]::Open($_.Path, "open", "read") 
     $sha1.ComputeHash($file) | %{  
     write-host -nonewline $_.ToString("x2")  
        }  
        $file.Dispose()  
       write-host 
       write-host 
   }  
}
腳本的執行效果如下圖所示:
作者: 付海軍
出處:http://space.e800.com.cn/fuhj02
版權:本文版權歸作者和億八佰共有
轉載:歡迎轉載,爲了保存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
個人網站: http://txj.shell.tor.hu
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章