程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> MD5、DES加密算法簡介及DES算法C#實現

MD5、DES加密算法簡介及DES算法C#實現

編輯:.NET實例教程

轉自http://blog.csdn.Net/hnas_better/archive/2007/11/22/1897864.ASPx

項目開發過程中,經常會遇到需要加密的需求,在這裡簡單為大家介紹一下MD5加密原理及DES算法,並用C# 實現。由於沒有仔細研究過,函數寫的比較粗糙,有興趣的可以改進一下哦!

      MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。請注意我使用了“字節串”而不是“字符串”這個詞,是因為這種變換只與字節的值有關,與字符集或編碼方式無關。MD5將任意長度的“字節串”變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數的數學函數。
    MD5還廣泛用於加密和解密技術上,在很多網站系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較。這樣即使黑客得到數據庫也不知道登錄密碼,確保了網站的安全。

以下文字內容引自http://zhidao.baidu.com/question/5017928.Html

最著名的保密密鑰或對稱密鑰加密算法DES(Data Encryption Standard)是由IBM公司在70年代發展起來的,並經過政府的加密標准篩選後,於1976年11月被美國政府采用,DES隨後被美國國家標准局和美國國家標准協會(American National Standard Institute, ANSI) 承認。

DES使用56位密鑰對64位的數據塊進行加密,並對64位的數據塊進行16輪編碼。與每輪編碼時,一個48位的“每輪”密鑰值由56位的完整密鑰得出來。DES用軟件進行解碼需要用很長時間,而用硬件解碼速度非常快,但幸運的是當時大多數黑客並沒有足夠的設備制造出這種硬件設備。在1977年,人們估計要耗資兩千萬美元才能建成一個專門計算機用於DES的解密,而且需要12個小時的破解才能得到結果。所以,當時DES被認為是一種十分強壯的加密方法。

但是,當今的計算機速度越來越快了,制造一台這樣特殊的機器的花費已經降到了十萬美元左右,所以用它來保護十億美元的銀行間線纜時,就會仔細考慮了。另一個方面,如果只用它來保護一台服務器,那麼DES確實是一種好的辦法,因為黑客絕不會僅僅為入侵一個服務器而花那麼多的錢破解DES密文。由於現在已經能用二十萬美圓制造一台破譯DES的特殊的計算機,所以現在再對要求“強壯”加密的場合已經不再適用了。

三重DES
因為確定一種新的加密法是否真的安全是極為困難的,而且DES的唯一密碼學缺點,就是密鑰長度相對比較短,所以人們並沒有放棄使用DES,而是想出了一個解決其長度問題的方法,即采用三重DES。這種方法用兩個密鑰對明文進行三次加密,假設兩個密鑰是K1和K2,其算法的步驟如圖5.9所示:

1. 用密鑰K1進行DEA加密。

2. 用K2對步驟1的結果進行DES解密。

3. 用步驟2的結果使用密鑰K1進行DES加密。

這種方法的缺點,是要花費原來三倍時間,從另一方面來看,三重DES的112位密鑰長度是很“強壯”的加密方式了


   以下為DES的兩個簡單的加密、解密函數
  



using System.IO;
using System.Text;
using System.Security.Cryptography;
 public string Encrypt(string  pToEncrypt,  string  sKey)  
  ...{   
   //8位密鑰,16位加密結果
   DESCryptoServiceProvider  des  =  new  DESCryptoServiceProvider();     
   byte[]  inputByteArray  =  Encoding.Default.GetBytes(pToEncrypt);
   des.Key  =  ASCIIEncoding.ASCII.GetBytes(sKey);     
   des.IV  =  ASCIIEncoding.ASCII.GetBytes(sKey);     
   MemoryStream  ms  =  new  MemoryStream();     
   CryptoStream  cs  =  new  CryptoStream(ms,  des.CreateEncryptor(),CryptoStreamMode.Write);     
   cs.Write(inputByteArray,  0,  inputByteArray.Length);     
   cs.FlushFinalBlock();     
   StringBuilder  ret  =  new  StringBuilder();     
   foreach(byte  b  in  ms.ToArray())     
...{      
    ret.AppendFormat("{0:X2}",  b);     
   }     
   ret.ToString();     
   return  ret.ToString();    
  }
  /**////解密  
  public string Decrypt(string  pToDecrypt,  string  sKey)  
  ...{   
   DESCryptoServiceProvider  des  =  new  DESCryptoServiceProvider();      
   byte[]  inputByteArray  =  new  byte[pToDecrypt.Length  /  2];     
   for(int  x  =  0;  
    x  <  pToDecrypt.Length  /  2;  x++)     
   ...{      
    int  i  =  (Convert.ToInt32(pToDecrypt.Substring(x  *  2,  2),  16));      
    inputByteArray[x]  =  (byte)i;    
   }      
   des.Key  =  ASCIIEncoding.ASCI(sKey);     
   des.IV  =  ASCIIEncoding.ASCII.GetBytes(sKey);     
   MemoryStream  ms  =  new  MemoryStream();     
   CryptoStream  cs  =  new  CryptoStream(ms,  des.CreateDecryptor(),CryptoStreamMode.Write);     
   cs.Write(inputByteArray,  0,  inputByteArray.Length);     
   cs.FlushFinalBlock();      
   StringBuilder  ret  =  new  StringBuilder();                  
   return  System.Text.Encoding.Default.GetString(ms.ToArray());    
  }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved