Hash 演算法及其應用

來源:互聯網
上載者:User

 

轉貼來自:http://hi.baidu.com/shankou/blog/item/2c8787d4653bbf02a08bb77b.html

Hash 演算法及其應用
  
  ---------------
  什麼是 Hash
  Hash 的重要特性
  Hash 函數的實現
  主要的 Hash 演算法
  Hash 演算法的安全問題
  Hash 演算法的應用
  結 論
  ---------------
  
  
  Hash,一般翻譯做“散列”,也有直接音譯為"雜湊"的,就是把任意長度的輸入(又叫做
  預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這
  種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能
  會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
  
  數學表述為:h = H(M) ,其中H( )--單向散列函數,M--任意長度明文,h--固定長度散列
  值。
  
  
  在資訊安全領域中應用的Hash演算法,還需要滿足其他關鍵特性:
  
  第一當然是單向性(one-way),從預映射,能夠簡單迅速的得到散列值,而在計算上不可能
  構造一個預映射,使其散列結果等於某個特定的散列值,即構造相應的M=H-1(h)不可行。
  這樣,散列值就能在統計上唯一的表徵輸入值,因此,密碼學上的 Hash 又被稱為"訊息摘
  要(message digest)",就是要求能方便的將"訊息"進行"摘要",但在"摘要"中無法得到比
  "摘要"本身更多的關於"訊息"的資訊。
  
  第二是抗衝突性(collision-resistant),即在統計上無法產生2個散列值相同的預映射。
  給定M,計算上無法找到M',滿足H(M)=H(M') ,此謂弱抗衝突性;計算上也難以尋找一對
  任意的M和M',使滿足H(M)=H(M') ,此謂強抗衝突性。要求"強抗衝突性"主要是為了防範
  所謂"生日攻擊(birthday attack)",在一個10人的團體中,你能找到和你生日相同的人的
  機率是2.4%,而在同一團體中,有2人生日相同的機率是11.7%。類似的,當預映射的空間
  很大的情況下,演算法必須有足夠的強度來保證不能輕易找到"相同生日"的人。
  
  第三是映射分布均勻性和差分分布均勻性,散列結果中,為 0 的 bit 和為 1 的 bit ,
  其總數應該大致相等;輸入中一個 bit 的變化,散列結果中將有一半以上的 bit 改變,
  這又叫做"雪崩效應(avalanche effect)";要實現使散列結果中出現 1bit 的變化,則輸
  入中至少有一半以上的 bit 必鬚髮生變化。其實質是必須使輸入中每一個 bit 的資訊,
  盡量均勻的反映到輸出的每一個 bit 上去;輸出中的每一個 bit,都是輸入中儘可能多
  bit 的資訊一起作用的結果。
  
  
  Damgard 和 Merkle 定義了所謂“壓縮函數(compression function)”,就是將一個固定
  長度輸入,變換成較短的固定長度的輸出,這對密碼學實踐上 Hash 函數的設計產生了很
  大的影響。Hash函數就是被設計為基於通過特定壓縮函數的不斷重複“壓縮”輸入的分組
  和前一次壓縮處理的結果的過程,直到整個訊息都被壓縮完畢,最後的輸出作為整個訊息
  的散列值。儘管還缺乏嚴格的證明,但絕大多數業界的研究者都同意,如果壓縮函數是安
  全的,那麼以上述形式散列任意長度的訊息也將是安全的。這就是所謂 Damgard/Merkle
  結構:
  
  在中,任意長度的訊息被分拆成符合壓縮函數輸入要求的分組,最後一個分組可能需
  要在末尾添上特定的填充位元組,這些分組將被順序處理,除了第一個訊息分組將與散列初
  始化值一起作為壓縮函數的輸入外,當前分組將和前一個分組的壓縮函數輸出一起被作為
  這一次壓縮的輸入,而其輸出又將被作為下一個分組壓縮函數輸入的一部分,直到最後一
  個壓縮函數的輸出,將被作為整個訊息散列的結果。
  
  
  MD5 和 SHA1 可以說是目前應用最廣泛的Hash演算法,而它們都是以 MD4 為基礎設計的。
  
  
  1) MD4
  MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設計的,MD 是 Message Digest
  的縮寫。它適用在32位字長的處理器上用高速軟體實現--它是基於 32 位運算元的位操作
  來實現的。它的安全性不像RSA那樣基於數學假設,儘管 Den Boer、Bosselaers 和 Dobb
  ertin 很快就用分析和差分成功的攻擊了它3輪變換中的 2 輪,證明了它並不像期望的那
  樣安全,但它的整個演算法並沒有真正被破解過,Rivest 也很快進行了改進。
  
  下面是一些MD4散列結果的例子:
  
  MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0
  MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24
  MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d
  MD4 ("message digest") = d9130a8164549fe818874806e1c7014b
  MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9
  MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 043f8
  582f241db351ce627e153e7f0e4
  MD4 ("123456789012345678901234567890123456789012345678901234567890123456789012
  34567890") = e33b4ddc9c38f2199c3e7b164fcc0536
  
  
  2) MD5
  MD5(RFC 1321)是 Rivest 於1991年對MD4的改進版本。它對輸入仍以512位分組,其輸出是
  4個32位字的級聯,與 MD4 相同。它較MD4所做的改進是:
  
  1) 加入了第四輪
  2) 每一步都有唯一的加法常數;
  3) 第二輪中的G函數從((X ∧ Y) ∨ (X ∧ Z) ∨ (Y ∧ Z)) 變為 ((X ∧ Z) ∨ (Y ∧
  ~Z))以減小其對稱性;
  4) 每一步都加入了前一步的結果,以加快"雪崩效應";
  5) 改變了第2輪和第3輪中訪問輸入子分組的順序,減小了形式的相似程度;
  6) 近似最佳化了每輪的迴圈左移位移量,以期加快"雪崩效應",各輪的迴圈左移都不同。
  
  儘管MD5比MD4來得複雜,並且速度較之要慢一點,但更安全,在抗分析和抗差分方面表現
  更好。
  
  訊息首先被拆成若干個512位的分組,其中最後512位一個分組是“訊息尾+填充位元組(100…
  0)+64 位元訊息長度”,以確保對於不同長度的訊息,該分組不相同。64位訊息長度的限制
  導致了MD5安全的輸入長度必須小於264bit,因為大於64位的長度資訊將被忽略。而4個32
  位寄存器字初始化為A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210,它們
  將始終參與運算並形成最終的散列結果。
  
  接著各個512位訊息分組以16個32位字的形式進入演算法的主迴圈,512位訊息分組的個資料
  決定了迴圈的次數。主迴圈有4輪,每輪分別用到了非線性函數
  
  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) = X ⊕ (Y ∨ ~Z)
  這4輪變換是對進入主迴圈的512位訊息分組的16個32位字分別進行如下操作:將A、B、C、
  D的副本a、b、c、d中的3個經F、G、H、I運算後的結果與第4個相加,再加上32位字和一個
  32位字的加法常數,並將所得之值迴圈左移若干位,最後將所得結果加上a、b、c、d之一
  ,並回送至ABCD,由此完成一次迴圈。
  
  所用的加法常數由這樣一張表T[i]來定義,其中i為1…64,T[i]是i的正弦絕對值之42949
  67296次方的整數部分,這樣做是為了通過正弦函數和冪函數來進一步消除變換中的線性性
  。
  
  當所有512位分組都運算完畢後,ABCD的級聯將被輸出為MD5散列的結果。下面是一些MD5散
  列結果的例子:
  
  MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
  MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
  MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
  MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
  MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
  MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174a
  b98d277d9f5a5611c2c9f419d9f
  MD5 ("123456789012345678901234567890123456789012345678901234567890123456789012
  34567890") = 57edf4a22be3c955ac49da2e2107b67a
  參考相應RFC文檔可以得到MD4、MD5演算法的詳細描述和演算法的C原始碼。http://www.douban.com/group/topic/1391942/

--------------------------------------

Hash演算法

hash演算法的意義在於提供了一種快速存取資料的方法,它用一種演算法建立索引值與真實值之間的對應關係,(每一個真實值只能有一個索引值,但是一個索引值可以對應多個真實值),這樣可以快速在數組等   
   裡面存取資料.   
   例如:   
   //HashTable.h   
    
   template    <class    T>   
   class    HashTable   
   {   
   public    :   
           HashTable(    int    count    )    ;   
           void    put(    T*    t    ,int    key    )    ;   
           T*    get(    int    key    )    ;   
   private    :   
             T**    tArray    ;   
   }   
    
    
   //HashTable.cpp   
   template    <Class    T>   
   HashTable::HashTable(    int    count    )   
   {   
         tArray    =    new    T*[count]    ;   
   }         
    
   template    <Class    T>   
   void    HashTable::put(    T*    t    ,    int    key    )   
   {   
         this->tArray[    key    ]    =    t    ;   
   }   
    
   template    <Class    T>   
   T*    HashTable::get(    int    key    )   
   {   
         return    this->tArray[    key    ]    ;   
   }   
    
   這樣,我們只要知道key值,就可以快速存取T類型的資料,而不用像在鏈表等資料結構中尋找一樣,   
   要找來找去的.至於key值,一般都是用某種演算法(所謂的Hash演算法)算出來的.例如:字串的Hash演算法,    char*    value    =    "hello";    int    key    =      (((((((27*    (int)'h'+27)*    (int)'e')    +    27)     
   *    (int)'l')    +    27)    *    (int)'l'    +27)    *    27    )    +    (int)'o'    ;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.